summaryrefslogtreecommitdiff
path: root/avmedia
diff options
context:
space:
mode:
authorMinh Ngo <nlminhtl@gmail.com>2013-08-25 20:56:20 +0300
committerMinh Ngo <nlminhtl@gmail.com>2013-08-25 20:57:06 +0300
commit8a844a4b924eaadec25f9e27cef56b52a0abe50e (patch)
tree116871f3b8ef17a479c2a19f71d80fe48e002975 /avmedia
parent88011f4cdf050c2df0b7488e273332d4e7048012 (diff)
Linking symbols only once.
If they were linked unsuccessfully a VLC instance won't be created. Some static functions and variables were encapsulated. Change-Id: I9d07ac9a73a6bd59928bcc349458ea346a26deb4
Diffstat (limited to 'avmedia')
-rw-r--r--avmedia/source/vlc/vlcmanager.cxx20
-rw-r--r--avmedia/source/vlc/vlcmanager.hxx2
-rw-r--r--avmedia/source/vlc/wrapper/EventHandler.cxx2
-rw-r--r--avmedia/source/vlc/wrapper/EventHandler.hxx2
-rw-r--r--avmedia/source/vlc/wrapper/EventManager.cxx29
-rw-r--r--avmedia/source/vlc/wrapper/EventManager.hxx5
-rw-r--r--avmedia/source/vlc/wrapper/Instance.cxx9
-rw-r--r--avmedia/source/vlc/wrapper/Instance.hxx1
-rw-r--r--avmedia/source/vlc/wrapper/Media.cxx22
-rw-r--r--avmedia/source/vlc/wrapper/Media.hxx1
-rw-r--r--avmedia/source/vlc/wrapper/Player.cxx8
-rw-r--r--avmedia/source/vlc/wrapper/Player.hxx1
-rw-r--r--avmedia/source/vlc/wrapper/SymbolLoader.hxx37
13 files changed, 90 insertions, 49 deletions
diff --git a/avmedia/source/vlc/vlcmanager.cxx b/avmedia/source/vlc/vlcmanager.cxx
index 6a5431d2fedb..5565f5afa4b5 100644
--- a/avmedia/source/vlc/vlcmanager.cxx
+++ b/avmedia/source/vlc/vlcmanager.cxx
@@ -1,5 +1,9 @@
#include "vlcmanager.hxx"
#include "vlcplayer.hxx"
+#include "wrapper/Instance.hxx"
+#include "wrapper/EventManager.hxx"
+#include "wrapper/Media.hxx"
+#include "wrapper/Player.hxx"
using namespace ::com::sun::star;
@@ -13,7 +17,13 @@ Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
: mEventHandler(new VLC::EventHandler( "EventHandler" ) )
, mxMgr( rxMgr )
{
- mEventHandler->launch();
+ using namespace VLC;
+ static bool success = Instance::LoadSymbols() && EventManager::LoadSymbols()
+ && Media::LoadSymbols() && Player::LoadSymbols();
+
+ m_is_vlc_found = success;
+ if (m_is_vlc_found)
+ mEventHandler->launch();
}
Manager::~Manager()
@@ -23,6 +33,9 @@ Manager::~Manager()
uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUString& rURL )
throw (uno::RuntimeException)
{
+ if ( !m_is_vlc_found )
+ return uno::Reference< media::XPlayer >();
+
if ( !rURL.isEmpty() || (mPlayer.is() && dynamic_cast<VLCPlayer*>( mPlayer.get() )->url() != rURL))
{
VLCPlayer* pPlayer( new VLCPlayer( rURL, mEventHandler /*, mxMgr */ ) );
@@ -41,12 +54,15 @@ rtl::OUString SAL_CALL Manager::getImplementationName()
sal_Bool SAL_CALL Manager::supportsService( const rtl::OUString& serviceName )
throw (uno::RuntimeException)
{
- return serviceName == VLC_SERVICENAME;
+ return serviceName == VLC_SERVICENAME && m_is_vlc_found;
}
uno::Sequence< rtl::OUString > SAL_CALL Manager::getSupportedServiceNames()
throw (uno::RuntimeException)
{
+ if ( !m_is_vlc_found )
+ return uno::Sequence< rtl::OUString >();
+
::uno::Sequence< OUString > aRet(1);
aRet[0] = VLC_SERVICENAME;
return aRet;
diff --git a/avmedia/source/vlc/vlcmanager.hxx b/avmedia/source/vlc/vlcmanager.hxx
index dbcaed650bd8..b2ea01fbbb5b 100644
--- a/avmedia/source/vlc/vlcmanager.hxx
+++ b/avmedia/source/vlc/vlcmanager.hxx
@@ -45,6 +45,8 @@ public:
private:
::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMgr;
::com::sun::star::uno::Reference< ::com::sun::star::media::XPlayer > mPlayer;
+
+ bool m_is_vlc_found;
};
}
diff --git a/avmedia/source/vlc/wrapper/EventHandler.cxx b/avmedia/source/vlc/wrapper/EventHandler.cxx
index 19054d6a15fe..6104d31fa0e4 100644
--- a/avmedia/source/vlc/wrapper/EventHandler.cxx
+++ b/avmedia/source/vlc/wrapper/EventHandler.cxx
@@ -32,4 +32,4 @@ void EventHandler::execute()
}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ \ No newline at end of file
diff --git a/avmedia/source/vlc/wrapper/EventHandler.hxx b/avmedia/source/vlc/wrapper/EventHandler.hxx
index 9118da0b9417..f203e399ca99 100644
--- a/avmedia/source/vlc/wrapper/EventHandler.hxx
+++ b/avmedia/source/vlc/wrapper/EventHandler.hxx
@@ -31,4 +31,4 @@ namespace VLC
#endif // _WRAPPER_EVENT_HANDLER_HXX
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ \ No newline at end of file
diff --git a/avmedia/source/vlc/wrapper/EventManager.cxx b/avmedia/source/vlc/wrapper/EventManager.cxx
index b8a194b0c76a..fe893c7c6d2a 100644
--- a/avmedia/source/vlc/wrapper/EventManager.cxx
+++ b/avmedia/source/vlc/wrapper/EventManager.cxx
@@ -30,16 +30,9 @@ namespace VLC
libvlc_event_type_t i_event_type,
libvlc_callback_t f_callback,
void *p_user_data );
-
- ApiMap VLC_EVENT_MANAGER_API[] =
- {
- SYM_MAP( libvlc_media_player_event_manager ),
- SYM_MAP( libvlc_event_attach ),
- SYM_MAP( libvlc_event_detach )
- };
}
-void EventManagerEventHandler( const libvlc_event_t *event, void *pData )
+void EventManager::Handler( const libvlc_event_t *event, void *pData )
{
EventManager *instance = static_cast<EventManager*>( pData );
switch ( event->type )
@@ -53,11 +46,23 @@ void EventManagerEventHandler( const libvlc_event_t *event, void *pData )
}
}
+bool EventManager::LoadSymbols()
+{
+ ApiMap VLC_EVENT_MANAGER_API[] =
+ {
+ SYM_MAP( libvlc_media_player_event_manager ),
+ SYM_MAP( libvlc_event_attach ),
+ SYM_MAP( libvlc_event_detach )
+ };
+
+ return InitApiMap( VLC_EVENT_MANAGER_API );
+}
+
EventManager::EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh )
: mEventHandler( eh )
+ , mManager( libvlc_media_player_event_manager( player ) )
{
- InitApiMap( VLC_EVENT_MANAGER_API );
- mManager = libvlc_media_player_event_manager( player );
+
}
EventManager::~EventManager()
@@ -67,9 +72,9 @@ EventManager::~EventManager()
void EventManager::registerSignal( int signal, const Callback& callback )
{
if ( callback.empty() )
- libvlc_event_detach( mManager, signal, EventManagerEventHandler, this );
+ libvlc_event_detach( mManager, signal, Handler, this );
else
- libvlc_event_attach( mManager, signal, EventManagerEventHandler, this );
+ libvlc_event_attach( mManager, signal, Handler, this );
}
void EventManager::onPaused( const EventManager::Callback& callback )
diff --git a/avmedia/source/vlc/wrapper/EventManager.hxx b/avmedia/source/vlc/wrapper/EventManager.hxx
index d0fdd0756583..751c0e8c20f0 100644
--- a/avmedia/source/vlc/wrapper/EventManager.hxx
+++ b/avmedia/source/vlc/wrapper/EventManager.hxx
@@ -23,8 +23,9 @@ namespace VLC
class EventHandler;
class EventManager
{
- friend void EventManagerEventHandler( const libvlc_event_t *event, void *pData );
+
public:
+ static bool LoadSymbols();
typedef boost::function<void()> Callback;
EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh );
@@ -41,6 +42,8 @@ namespace VLC
TCallback mOnEndReached;
void registerSignal( int signal, const Callback& callback );
+
+ static void Handler( const libvlc_event_t *event, void *pData );
};
}
diff --git a/avmedia/source/vlc/wrapper/Instance.cxx b/avmedia/source/vlc/wrapper/Instance.cxx
index 39c2ce3e2a11..b9b6ff947ec5 100644
--- a/avmedia/source/vlc/wrapper/Instance.cxx
+++ b/avmedia/source/vlc/wrapper/Instance.cxx
@@ -17,20 +17,23 @@ namespace VLC
libvlc_instance_t* ( *libvlc_new ) ( int argc, const char * const *argv );
void ( *libvlc_release ) ( libvlc_instance_t *p_instance );
void ( *libvlc_retain ) ( libvlc_instance_t *p_instance );
+ }
+ bool Instance::LoadSymbols()
+ {
ApiMap VLC_INSTANCE_API[] =
{
SYM_MAP( libvlc_new ),
SYM_MAP( libvlc_release ),
SYM_MAP( libvlc_retain )
};
+
+ return InitApiMap( VLC_INSTANCE_API );
}
Instance::Instance( int argc, const char * const argv[] )
+ : mInstance( libvlc_new( argc, argv ) )
{
- InitApiMap( VLC_INSTANCE_API );
-
- mInstance = libvlc_new( argc, argv );
}
Instance::Instance( const Instance& other )
diff --git a/avmedia/source/vlc/wrapper/Instance.hxx b/avmedia/source/vlc/wrapper/Instance.hxx
index 887baf1e971b..cbb6f4fa6bb0 100644
--- a/avmedia/source/vlc/wrapper/Instance.hxx
+++ b/avmedia/source/vlc/wrapper/Instance.hxx
@@ -19,6 +19,7 @@ namespace VLC
class Instance
{
public:
+ static bool LoadSymbols();
Instance( int argc, const char * const argv[] );
Instance( const Instance& other );
const Instance& operator=( const Instance& other );
diff --git a/avmedia/source/vlc/wrapper/Media.cxx b/avmedia/source/vlc/wrapper/Media.cxx
index 825bb0620b4f..b893d425077d 100644
--- a/avmedia/source/vlc/wrapper/Media.cxx
+++ b/avmedia/source/vlc/wrapper/Media.cxx
@@ -21,13 +21,6 @@ namespace VLC
void ( *libvlc_media_release ) ( libvlc_media_t *p_md );
void ( *libvlc_media_retain ) ( libvlc_media_t *p_md );
- ApiMap VLC_MEDIA_API[] =
- {
- SYM_MAP( libvlc_media_new_path ),
- SYM_MAP( libvlc_media_release ),
- SYM_MAP( libvlc_media_retain )
- };
-
libvlc_media_t* InitMedia( const rtl::OUString& url, VLC::Instance& instance )
{
rtl::OString dest;
@@ -35,14 +28,23 @@ namespace VLC
return libvlc_media_new_path(instance, dest.getStr());
}
-
}
+bool Media::LoadSymbols()
+{
+ ApiMap VLC_MEDIA_API[] =
+ {
+ SYM_MAP( libvlc_media_new_path ),
+ SYM_MAP( libvlc_media_release ),
+ SYM_MAP( libvlc_media_retain )
+ };
+
+ return InitApiMap( VLC_MEDIA_API );
+}
Media::Media( const rtl::OUString& url, Instance& instance )
+ : mMedia( InitMedia( url, instance ) )
{
- InitApiMap(VLC_MEDIA_API);
- mMedia = InitMedia( url, instance );
}
Media::Media( const Media& other )
diff --git a/avmedia/source/vlc/wrapper/Media.hxx b/avmedia/source/vlc/wrapper/Media.hxx
index 4821581c3d7a..0575e6e93c29 100644
--- a/avmedia/source/vlc/wrapper/Media.hxx
+++ b/avmedia/source/vlc/wrapper/Media.hxx
@@ -20,6 +20,7 @@ namespace VLC
class Media
{
public:
+ static bool LoadSymbols();
Media( const rtl::OUString& url, Instance& instance );
Media( const Media& other );
const Media& operator=( const Media& other );
diff --git a/avmedia/source/vlc/wrapper/Player.cxx b/avmedia/source/vlc/wrapper/Player.cxx
index 9c739bd3b293..a36a15d929ab 100644
--- a/avmedia/source/vlc/wrapper/Player.cxx
+++ b/avmedia/source/vlc/wrapper/Player.cxx
@@ -41,7 +41,10 @@ namespace VLC
void ( *libvlc_media_player_set_xwindow ) ( libvlc_media_player_t *p_mi, uint32_t drawable );
unsigned ( *libvlc_media_player_has_vout ) ( libvlc_media_player_t *p_mi );
void ( *libvlc_video_set_mouse_input ) ( libvlc_media_player_t *p_mi, unsigned on);
+ }
+ bool Player::LoadSymbols()
+ {
ApiMap VLC_PLAYER_API[] =
{
SYM_MAP( libvlc_media_player_new_from_media ),
@@ -64,12 +67,13 @@ namespace VLC
SYM_MAP( libvlc_video_set_mouse_input ),
SYM_MAP( libvlc_media_player_retain )
};
+
+ return InitApiMap( VLC_PLAYER_API );
}
Player::Player(Media& media)
+ : mPlayer( libvlc_media_player_new_from_media( media ) )
{
- InitApiMap(VLC_PLAYER_API);
- mPlayer = libvlc_media_player_new_from_media( media );
}
Player::Player( const Player& other )
diff --git a/avmedia/source/vlc/wrapper/Player.hxx b/avmedia/source/vlc/wrapper/Player.hxx
index bba169b8c8b4..34886c91c17d 100644
--- a/avmedia/source/vlc/wrapper/Player.hxx
+++ b/avmedia/source/vlc/wrapper/Player.hxx
@@ -23,6 +23,7 @@ namespace VLC
class Player
{
public:
+ static bool LoadSymbols();
Player( Media& media );
Player( const Player& other );
const Player& operator=( const Player& other );
diff --git a/avmedia/source/vlc/wrapper/SymbolLoader.hxx b/avmedia/source/vlc/wrapper/SymbolLoader.hxx
index 8730e05dc270..92b52eee3e05 100644
--- a/avmedia/source/vlc/wrapper/SymbolLoader.hxx
+++ b/avmedia/source/vlc/wrapper/SymbolLoader.hxx
@@ -53,31 +53,34 @@ namespace
}
}
-template<size_t N>
-bool InitApiMap( const ApiMap ( &pMap )[N] )
+namespace VLC
{
- oslModule aModule;
-
- for (uint j = 0; j < sizeof(libNames) / sizeof(libNames[0]); ++j)
+ template<size_t N>
+ bool InitApiMap( const ApiMap ( &pMap )[N] )
{
- aModule = osl_loadModule( OUString::createFromAscii
- ( libNames[ j ] ).pData,
- SAL_LOADMODULE_DEFAULT );
-
- if( aModule == NULL)
- continue;
+ oslModule aModule;
- if (tryLink( aModule, pMap ))
+ for (uint j = 0; j < sizeof(libNames) / sizeof(libNames[0]); ++j)
{
+ aModule = osl_loadModule( OUString::createFromAscii
+ ( libNames[ j ] ).pData,
+ SAL_LOADMODULE_DEFAULT );
+
+ if( aModule == NULL)
+ continue;
+
+ if (tryLink( aModule, pMap ))
+ {
+ osl_unloadModule( aModule );
+ return true;
+ }
+
osl_unloadModule( aModule );
- return true;
}
- osl_unloadModule( aModule );
+ std::cerr << "Cannot load libvlc" << std::endl;
+ return false;
}
-
- std::cerr << "Cannot load libvlc" << std::endl;
- return false;
}
#endif