vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun May 14 23:42:56 2017 +0300| [0303cb6b285aa56aee0032bd83eab44d7b7da6df] | committer: Rémi Denis-Courmont
rd: remove reference counting Like SD, and in fact most VLC object types, RD is not meant for objects shared by multiple threads (input, vout, aout...). Using a custom release makes no sense here. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0303cb6b285aa56aee0032bd83eab44d7b7da6df --- include/vlc_renderer_discovery.h | 8 +----- lib/renderer_discoverer.c | 8 +++--- modules/gui/macosx/VLCRendererDiscovery.m | 45 +++++++++++++++---------------- modules/gui/qt/actions_manager.cpp | 23 +++++++--------- modules/gui/qt/actions_manager.hpp | 1 - src/libvlccore.sym | 2 +- src/misc/renderer_discovery.c | 17 ++++-------- 7 files changed, 41 insertions(+), 63 deletions(-) diff --git a/include/vlc_renderer_discovery.h b/include/vlc_renderer_discovery.h index 30019ee270..3ed26b56ea 100644 --- a/include/vlc_renderer_discovery.h +++ b/include/vlc_renderer_discovery.h @@ -143,7 +143,7 @@ vlc_rd_get_names(vlc_object_t *p_obj, char ***pppsz_names, VLC_API vlc_renderer_discovery_t * vlc_rd_new(vlc_object_t *p_obj, const char *psz_name) VLC_USED; -#define vlc_rd_release(p_rd) vlc_object_release(p_rd) +VLC_API void vlc_rd_release(vlc_renderer_discovery_t *p_rd); /** * Get the event manager of the renderer discovery module @@ -164,12 +164,6 @@ VLC_API int vlc_rd_start(vlc_renderer_discovery_t *p_rd); /** - * Stop the renderer discovery module - */ -VLC_API void -vlc_rd_stop(vlc_renderer_discovery_t *p_rd); - -/** * @} * @defgroup vlc_renderer_discovery_module VLC renderer module * @{ diff --git a/lib/renderer_discoverer.c b/lib/renderer_discoverer.c index bb67dae888..b9d49822b6 100644 --- a/lib/renderer_discoverer.c +++ b/lib/renderer_discoverer.c @@ -157,10 +157,9 @@ error: void libvlc_renderer_discoverer_release( libvlc_renderer_discoverer_t *p_lrd ) { - if( p_lrd->p_rd != NULL ) - vlc_rd_release( p_lrd->p_rd ); + libvlc_renderer_discoverer_stop( p_lrd ); - if( p_lrd->p_event_manager != NULL ) + if( p_lrd->p_event_manager == NULL ) libvlc_event_manager_release( p_lrd->p_event_manager ); free( p_lrd ); @@ -175,7 +174,8 @@ libvlc_renderer_discoverer_start( libvlc_renderer_discoverer_t *p_lrd ) void libvlc_renderer_discoverer_stop( libvlc_renderer_discoverer_t *p_lrd ) { - vlc_rd_stop( p_lrd->p_rd ); + if( p_lrd->p_rd != NULL ) + vlc_rd_release( p_lrd->p_rd ); for( int i = 0; i < p_lrd->i_items; ++i ) vlc_renderer_item_release( p_lrd->pp_items[i] ); diff --git a/modules/gui/macosx/VLCRendererDiscovery.m b/modules/gui/macosx/VLCRendererDiscovery.m index 00b98b33fc..c6f0ad5faa 100644 --- a/modules/gui/macosx/VLCRendererDiscovery.m +++ b/modules/gui/macosx/VLCRendererDiscovery.m @@ -54,52 +54,49 @@ static void renderer_event_received(const vlc_event_t *p_event, void *user_data) if (!name) [NSException raise:NSInvalidArgumentException format:@"name must not be nil"]; - - // Create renderer object - p_intf = getIntf(); - p_rd = vlc_rd_new(VLC_OBJECT(p_intf), name); - - if (p_rd) { - _name = [NSString stringWithUTF8String:name]; - _longName = (!longname) ? nil : [NSString stringWithUTF8String:longname]; - _discoveryStarted = false; - } else { - msg_Err(p_intf, "Could not create '%s' renderer discovery service", name); - self = nil; - } + _name = [NSString stringWithUTF8String:name]; + _longName = (!longname) ? nil : [NSString stringWithUTF8String:longname]; } return self; } - (void)dealloc { - if (_discoveryStarted) - [self stopDiscovery]; - if (p_rd != NULL) - vlc_rd_release(p_rd); + [self stopDiscovery]; } - (bool)startDiscovery { + p_intf = getIntf(); + msg_Dbg(p_intf, "Starting renderer discovery service %s", _name.UTF8String); + // Create renderer object + p_rd = vlc_rd_new(VLC_OBJECT(p_intf), _name.UTF8String); + + if (p_rd) { + } else { + msg_Err(p_intf, "Could not create '%s' renderer discovery service", _name.UTF8String); + return false; + } + [self attachEventHandlers]; int ret = vlc_rd_start(p_rd); - if (ret == VLC_SUCCESS) { - _discoveryStarted = true; - return true; - } else { + if (ret != VLC_SUCCESS) { msg_Err(p_intf, "Could not start '%s' renderer discovery", _name.UTF8String); [self detachEventHandler]; + vlc_rd_release(p_rd); + p_rd = NULL; return false; } + return true; } - (void)stopDiscovery { - if (_discoveryStarted) { + if (p_rd != NULL) { [self detachEventHandler]; - vlc_rd_stop(p_rd); - _discoveryStarted = false; + vlc_rd_release(p_rd); + p_rd = NULL; } } diff --git a/modules/gui/qt/actions_manager.cpp b/modules/gui/qt/actions_manager.cpp index 14e2d483f2..bc59217d0a 100644 --- a/modules/gui/qt/actions_manager.cpp +++ b/modules/gui/qt/actions_manager.cpp @@ -41,21 +41,15 @@ ActionsManager::ActionsManager( intf_thread_t * _p_i ) : p_intf( _p_i ) , p_rd( NULL ) - , b_rd_started( false ) { } ActionsManager::~ActionsManager() { if ( p_rd != NULL ) { - if (b_rd_started) - { - vlc_event_manager_t *em = vlc_rd_event_manager( p_rd ); - vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, p_intf); - vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, p_intf); - - vlc_rd_stop( p_rd ); - } + vlc_event_manager_t *em = vlc_rd_event_manager( p_rd ); + vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, p_intf); + vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, p_intf); vlc_rd_release( p_rd ); } } @@ -292,7 +286,7 @@ void ActionsManager::renderer_event_received( const vlc_event_t * p_event, void void ActionsManager::ScanRendererAction(bool checked) { - if (checked == b_rd_started) + if (checked == (p_rd != NULL)) return; /* nothing changed */ if (checked) @@ -348,11 +342,12 @@ void ActionsManager::ScanRendererAction(bool checked) vlc_event_attach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, p_intf); vlc_event_attach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, p_intf); - b_rd_started = vlc_rd_start( p_rd ) == VLC_SUCCESS; - if ( !b_rd_started ) + if( vlc_rd_start( p_rd ) != VLC_SUCCESS ) { vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, p_intf); vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, p_intf); + vlc_rd_release( p_rd ); + p_rd = NULL; } } } @@ -364,9 +359,9 @@ void ActionsManager::ScanRendererAction(bool checked) vlc_event_detach( em, vlc_RendererDiscoveryItemAdded, renderer_event_received, p_intf); vlc_event_detach( em, vlc_RendererDiscoveryItemRemoved, renderer_event_received, p_intf); - vlc_rd_stop( p_rd ); + vlc_rd_release( p_rd ); + p_rd = NULL; } - b_rd_started = false; } } diff --git a/modules/gui/qt/actions_manager.hpp b/modules/gui/qt/actions_manager.hpp index 92b80afcbb..9acdf34dab 100644 --- a/modules/gui/qt/actions_manager.hpp +++ b/modules/gui/qt/actions_manager.hpp @@ -76,7 +76,6 @@ private: intf_thread_t* const p_intf; vlc_renderer_discovery_t *p_rd; - bool b_rd_started; static void renderer_event_received( const vlc_event_t * p_event, void * user_data ); static bool isItemSout( QVariant & m_obj, const char *psz_sout, bool as_output ); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 4cb7a22503..5a1b571467 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -764,9 +764,9 @@ vlc_renderer_item_demux_filter vlc_renderer_item_flags vlc_rd_get_names vlc_rd_new +vlc_rd_release vlc_rd_event_manager vlc_rd_start -vlc_rd_stop vlc_rd_add_item vlc_rd_remove_item vlc_rd_probe_add diff --git a/src/misc/renderer_discovery.c b/src/misc/renderer_discovery.c index 1ceb0de2d5..45c776d0eb 100644 --- a/src/misc/renderer_discovery.c +++ b/src/misc/renderer_discovery.c @@ -233,15 +233,15 @@ vlc_rd_get_names(vlc_object_t *p_obj, char ***pppsz_names, return VLC_SUCCESS; } -static void -rd_destructor(vlc_object_t *p_obj) +void vlc_rd_release(vlc_renderer_discovery_t *p_rd) { - vlc_renderer_discovery_t * p_rd =(vlc_renderer_discovery_t *)p_obj; - assert(!p_rd->p_module); /* Forgot to call Stop */ + if (p_rd->p_module != NULL) + module_unneed(p_rd, p_rd->p_module); config_ChainDestroy(p_rd->p_cfg); free(p_rd->psz_name); vlc_event_manager_fini(&p_rd->event_manager); + vlc_object_release(p_rd); } vlc_renderer_discovery_t * @@ -259,7 +259,7 @@ vlc_rd_new(vlc_object_t *p_obj, const char *psz_name) vlc_event_manager_register_event_type(p_em, vlc_RendererDiscoveryItemAdded); vlc_event_manager_register_event_type(p_em, vlc_RendererDiscoveryItemRemoved); - vlc_object_set_destructor(p_rd, rd_destructor); + p_rd->p_module = NULL; return p_rd; } @@ -286,13 +286,6 @@ vlc_rd_start(vlc_renderer_discovery_t *p_rd) } void -vlc_rd_stop(vlc_renderer_discovery_t * p_rd) -{ - module_unneed(p_rd, p_rd->p_module); - p_rd->p_module = NULL; -} - -void vlc_rd_add_item(vlc_renderer_discovery_t * p_rd, vlc_renderer_item_t * p_item) { vlc_event_t event; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
