From b2830abb21ce66254d5aa62d816fc2f84a70dfb6 Mon Sep 17 00:00:00 2001 From: Maxime Chapelet Date: Wed, 25 Jan 2023 14:22:19 +0100 Subject: [PATCH] Use an events handler in VLCTranscoder --- Sources/VLCTranscoder.m | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Sources/VLCTranscoder.m b/Sources/VLCTranscoder.m index 1e6cbe205..1474f4448 100644 --- a/Sources/VLCTranscoder.m +++ b/Sources/VLCTranscoder.m @@ -25,13 +25,14 @@ #import #import - +#import #include @interface VLCTranscoder() { libvlc_media_player_t *_p_mp; //player instance used for transcoding dispatch_queue_t _libVLCTranscoderQueue; + VLCEventsHandler* _eventsHandler; } - (void)registerObserversForMuxWithPlayer:(libvlc_media_player_t *)player; - (void)unregisterObserversForMuxWithPlayer:(libvlc_media_player_t *)player; @@ -79,14 +80,14 @@ - (void)registerObserversForMuxWithPlayer:(libvlc_media_player_t *)player __block libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(player); if (!p_em) return; - CFBridgingRetain(self); + _eventsHandler = [VLCEventsHandler handlerWithObject:self configuration:[VLCLibrary sharedEventsConfiguration]]; dispatch_sync(_libVLCTranscoderQueue,^{ libvlc_event_attach(p_em, libvlc_MediaPlayerPaused, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); libvlc_event_attach(p_em, libvlc_MediaPlayerStopped, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); libvlc_event_attach(p_em, libvlc_MediaPlayerEncounteredError, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); }); } @@ -97,13 +98,12 @@ - (void)unregisterObserversForMuxWithPlayer:(libvlc_media_player_t *)player return; dispatch_sync(_libVLCTranscoderQueue,^{ libvlc_event_detach(p_em, libvlc_MediaPlayerStopped, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); libvlc_event_detach(p_em, libvlc_MediaPlayerPaused, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); libvlc_event_detach(p_em, libvlc_MediaPlayerEncounteredError, - HandleMuxMediaInstanceStateChanged, (__bridge void *)(self)); + HandleMuxMediaInstanceStateChanged, (__bridge void *)(_eventsHandler)); }); - CFBridgingRelease((__bridge CFTypeRef _Nullable)(self)); } - (void)mediaPlayerStateChangeForMux:(const VLCMediaPlayerState)newState @@ -117,7 +117,7 @@ - (void)mediaPlayerStateChangeForMux:(const VLCMediaPlayerState)newState } } -static void HandleMuxMediaInstanceStateChanged(const libvlc_event_t * event, void * self) +static void HandleMuxMediaInstanceStateChanged(const libvlc_event_t * event, void * opaque) { VLCMediaPlayerState newState; if (event->type == libvlc_MediaPlayerPaused) { @@ -128,10 +128,11 @@ static void HandleMuxMediaInstanceStateChanged(const libvlc_event_t * event, voi newState = VLCMediaPlayerStateError; } @autoreleasepool { - VLCTranscoder *transcoder = (__bridge VLCTranscoder *)self; - dispatch_async(dispatch_get_main_queue(), ^{ + VLCEventsHandler *eventsHandler = (__bridge VLCEventsHandler*)opaque; + [eventsHandler handleEvent:^(id _Nonnull object) { + VLCTranscoder *transcoder = (VLCTranscoder *)object; [transcoder mediaPlayerStateChangeForMux: newState]; - }); + }]; } }