void apw_last_change_timer_event(void * object) { APWInternalState state; APW apw = (APW)object; APW_Error ec = check_this(apw); if (ec != APW_ERROR_OK) { return; } state = (APWInternalState)apw->internal_state; if (state->last_change_mask != 0) { fire_last_change_event(apw); state->last_change_mask = 0; } ILibLifeTime_AddEx(state->apw_monitor, apw, 0, &apw_last_change_timer_event, NULL); }
__declspec(dllexport) void ILibWrapper_LifeTimeAddEx(void *LifetimeMonitorObject, void *data, int ms, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy) { ILibLifeTime_AddEx(LifetimeMonitorObject, data, ms, Callback, Destroy); }
APW APW_Method_Create(void * chain, ILibThreadPool thread_pool, unsigned short port, char* friendly_name, char * mac_addr, char * pwd) { APW apw = NULL; APWInternalState inner_state = NULL; apw = (APW)MALLOC(sizeof(struct _APW)); if (apw == NULL) { return NULL; } inner_state = (APWInternalState)MALLOC(sizeof(struct _APWInternalState)); if (inner_state == NULL) { FREE(apw); return NULL; } inner_state->chain = chain; inner_state->airplay_token = AirplayCreate(chain, port, friendly_name, mac_addr, pwd); if (inner_state->airplay_token == NULL) { // 发现服务创建失败 FREE(apw); FREE(inner_state); return NULL; } AirplaySetTag(inner_state->airplay_token, (void *)apw); inner_state->apw_monitor = ILibCreateLifeTime(inner_state->chain); ILibLifeTime_AddEx(inner_state->apw_monitor, apw, 0, &apw_last_change_timer_event, NULL); sem_init(&inner_state->resource_lock, 0, 1); apw->ILib1 = NULL; apw->ILib2 = NULL; apw->ILib3 = apw_destroy_from_chain; apw->internal_state = (void *)inner_state; apw->thread_pool = thread_pool; AirplayCallbackGetCurrentTransportActions = (AirplayHandlerGetCurrentTransportActions )&APW_GetCurrentTransportActions; AirplayCallbackGetDeviceCapabilities = (AirplayHandlerGetDeviceCapabilities )&APW_GetDeviceCapabilities; AirplayCallbackGetMediaInfo = (AirplayHandlerGetMediaInfo )&APW_GetMediaInfo; AirplayCallbackGetPositionInfo = (AirplayHandlerGetPositionInfo )&APW_GetPositionInfo; AirplayCallbackGetTransportInfo = (AirplayHandlerGetTransportInfo )&APW_GetTransportInfo; AirplayCallbackGetTransportSettings = (AirplayHandlerGetTransportSettings )&APW_GetTransportSettings; AirplayCallbackNext = (AirplayHandlerNext )&APW_Next; AirplayCallbackPause = (AirplayHandlerPause )&APW_Pause; AirplayCallbackPlay = (AirplayHandlerPlay )&APW_Play; AirplayCallbackPrevious = (AirplayHandlerPrevious )&APW_Previous; AirplayCallbackSeek = (AirplayHandlerSeek )&APW_Seek; AirplayCallbackSetAVTransportURI = (AirplayHandlerSetAVTransportURI )&APW_SetAVTransportURI; AirplayCallbackSetPlayMode = (AirplayHandlerSetPlayMode )&APW_SetPlayMode; AirplayCallbackStop = (AirplayHandlerStop )&APW_Stop; AirplayCallbackGetCurrentConnectionIDs = (AirplayHandlerGetCurrentConnectionIDs )&APW_GetCurrentConnectionIDs; AirplayCallbackGetCurrentConnectionInfo = (AirplayHandlerGetCurrentConnectionInfo )&APW_GetCurrentConnectionInfo; AirplayCallbackGetProtocolInfo = (AirplayHandlerGetProtocolInfo )&APW_GetProtocolInfo; AirplayCallbackListPresets = (AirplayHandlerListPresets )&APW_ListPresets; AirplayCallbackSelectPreset = (AirplayHandlerSelectPreset )&APW_SelectPreset; AirplayCallbackGetBrightness = (AirplayHandlerGetBrightness )&APW_GetBrightness; AirplayCallbackGetContrast = (AirplayHandlerGetContrast )&APW_GetContrast; AirplayCallbackSetBrightness = (AirplayHandlerSetBrightness )&APW_SetBrightness; AirplayCallbackSetContrast = (AirplayHandlerSetContrast )&APW_SetContrast; AirplayCallbackGetMute = (AirplayHandlerGetMute )&APW_GetMute; AirplayCallbackGetVolume = (AirplayHandlerGetVolume )&APW_GetVolume; AirplayCallbackSetMute = (AirplayHandlerSetMute )&APW_SetMute; AirplayCallbackSetVolume = (AirplayHandlerSetVolume )&APW_SetVolume; AirplayCallbackGetPlayStatus = (AirplayGetPlayStatus )&APW_GetStatus; ILibAddToChain(chain, apw); return apw; }