0

我在我的 Swift 项目中使用Baresip来实现 SIP 功能:

import Foundation

    enum SipError: Error {
        case libre
        case config
        case stack
        case modules
        case userAgent
        case call
    }

    final class CallController {

        required init?(agent: inout OpaquePointer?) throws {
            guard libre_init() == 0 else { throw SipError.libre }

            // Initialize dynamic modules.
            mod_init()

            // Make configure file.
            if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
                conf_path_set(path)
            }
            guard conf_configure() == 0 else { throw SipError.config }

            // Initialize the SIP stack.
            guard ua_init("SIP", 1, 1, 1, 0) == 0 else { throw SipError.stack }

            // Load modules.
            guard conf_modules() == 0 else { throw SipError.modules }

            let addr = "sip:7003:789@192.168.123.103;transport=udp;answermode=manual"

            // Start user agent.
            guard ua_alloc(&agent, addr) == 0 else { throw SipError.userAgent }

            uag_event_register(ua_event_handler, NULL)

            // Make an outgoing call.
            guard ua_connect(agent, nil, nil, "sip:7002@192.168.123.103", nil, VIDMODE_OFF) == 0 else { throw SipError.call }

            // Start the main loop.
            re_main(nil)
        }

        func close(agent: OpaquePointer) {
            mem_deref(UnsafeMutablePointer(agent))
            ua_close()
            mod_close()

            // Close and check for memory leaks.
            libre_close()
            tmr_debug()
            mem_debug()
        }

    }

为了能够跟踪呼叫事件,我需要使用以下定义实现一个处理函数:

typedef void()  ua_event_h(struct ua *ua, enum ua_event ev, struct call *call, const char *prm, void *arg)

在 C 中,它是这样完成的:

static void ua_event_handler(struct ua *ua, enum ua_event ev,
                     struct call *call, const char *prm, void *arg)
{
    //Handle events
    re_printf("ua event: %s\n", uag_event_str(ev));
}

uag_event_register(ua_event_handler, NULL); 

但是,如果我想在 Swift 中编写相同的函数,我不知道应该在 Swift 中使用什么数据类型而不是 C 数据类型。如果有人可以帮助我了解我应该如何做,我将不胜感激。

4

1 回答 1

0
uag_event_register( {(agent, event, call, param, args) in
        let e = String(cString: uag_event_str(event))
        debugPrint("User Agent \(e)")
    }, nil)

这回答了你的问题了吗?

于 2021-01-19T00:36:55.213 回答