darwin之回调

本文详细介绍了darwin中QTSS_Callbacks的定义与使用方法。包括其初始化过程、与模块关联方式及回调函数实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在darwin中定义了一个全局变量(结构体)sCallbacks,而这个结构体只有一个成员addr(数组),addr的每一个元素代表一个回调指针.


QTSS_Callbacks  QTSServer::sCallbacks;

typedef struct {
    // Callback function pointer array
    QTSS_CallbackProcPtr addr [kLastCallback];
} QTSS_Callbacks, *QTSS_CallbacksPtr;
typedef QTSS_Error  (*QTSS_CallbackProcPtr)(...);


enum
{
    // Indexes for each callback routine. Addresses of the callback routines get
    // placed in an array. 
    // IMPORTANT: When adding new callbacks, add only to the end of the list and increment the 
    //            kLastCallback value. Inserting or changing the index order will break dynamic modules
    //            built with another release.
    
    kNewCallback                    = 0,
    kDeleteCallback                 = 1,
    kMillisecondsCallback           = 2,
    kConvertToUnixTimeCallback      = 3,
    kAddRoleCallback                = 4,
    kAddAttributeCallback           = 5,
    kIDForTagCallback               = 6,
    kGetAttributePtrByIDCallback    = 7,
    kGetAttributeByIDCallback       = 8,
    kSetAttributeByIDCallback       = 9,
    kWriteCallback                  = 10,
    kWriteVCallback                 = 11,
    kFlushCallback                  = 12,
    kAddServiceCallback             = 13,
    kIDForServiceCallback           = 14,
    kDoServiceCallback              = 15,
    kSendRTSPHeadersCallback        = 16,
    kAppendRTSPHeadersCallback      = 17,
    kSendStandardRTSPCallback       = 18,
    kAddRTPStreamCallback           = 19,
    kPlayCallback                   = 20,
    kPauseCallback                  = 21,
    kTeardownCallback               = 22,
    kRequestEventCallback           = 23,
    kSetIdleTimerCallback           = 24,
    kOpenFileObjectCallback         = 25,
    kCloseFileObjectCallback        = 26,
    kReadCallback                   = 27,
    kSeekCallback                   = 28,
    kAdviseCallback                 = 29,
    kGetNumValuesCallback           = 30,
    kGetNumAttributesCallback       = 31,
    kSignalStreamCallback           = 32,
    kCreateSocketStreamCallback     = 33,
    kDestroySocketStreamCallback    = 34,
    kAddStaticAttributeCallback     = 35,
    kAddInstanceAttributeCallback   = 36,
    kRemoveInstanceAttributeCallback= 37,
    kGetAttrInfoByIndexCallback     = 38,
    kGetAttrInfoByNameCallback      = 39,
    kGetAttrInfoByIDCallback        = 40,
    kGetValueAsStringCallback       = 41,
    kTypeToTypeStringCallback       = 42,
    kTypeStringToTypeCallback       = 43,
    kStringToValueCallback          = 44,       
    kValueToStringCallback          = 45,       
    kRemoveValueCallback            = 46,
    kRequestGlobalLockCallback      = 47, 
    kIsGlobalLockedCallback         = 48, 
    kUnlockGlobalLock               = 49, 
    kAuthenticateCallback           = 50,
    kAuthorizeCallback              = 51,   
    kRefreshTimeOutCallback         = 52,
    kCreateObjectValueCallback      = 53,
    kCreateObjectTypeCallback       = 54,
    kLockObjectCallback             = 55,
    kUnlockObjectCallback           = 56,
    kSetAttributePtrCallback        = 57,
    kSetIntervalRoleTimerCallback   = 58,
    kLockStdLibCallback             = 59,
    kUnlockStdLibCallback           = 60,
	kGetRTSPPushSessionsCallback	= 61,
	kRelayRTPCallback               = 62,
	kLastCallback                   = 63
};

1.这个数组什么时候初始化呢?在InitCallbacks函数中对数组的每一个元素初始化




2.这个全局回调数组又是如何与模块关联的呢?

在编写模块的时候,必须要实现一个main函数:比如QTSSReflectorModule_Main。这个函数会被主程序调用,传进来的形参包含了全局回调函数指针。

而在QTSS_Private.cpp中:有全局变量指针:static QTSS_CallbacksPtr    sCallbacks = NULL;在_stublibrary_main函数,实现全局变量的赋值 。


在模块中,都是调用QTSS_*的函数,这些函数都是在QTSS_Private.cpp中实现,而最终都是调用主程序中的全局回调函数。





3.全局变量(结构体)sCallbacks中的每一个元素指向的回调函数在哪里实现的呢?

在QTSSCallbacks类中实现:此类中实现了所有的静态回调函数。




4.所有的模块的qtss对象都要调用QTSSCallbacks中的方法,那么是如何区分不同的QTSS_Object?


方法1:在调用该类的函数时,函数中带有QTSS_Object参数, QTSSCallbacks其实什么也没做,函数内部直接调用

QTSS_Object对应的方法(一般方法名称都相同)即可。



方法2 :对于没有传入QTSS_Object参数的函数,通过OSThread临时存储一下变量值的方法来实现调用那个模块。


方法3:调用类的静态函数实现



5.QTSSCallbacks类中都可以调用哪些qtss的方法

主要有三种 : QTSS_Object,QTSS_ObjectType,QTSS_StreamRef



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值