diff options
author | Minh Ngo <nlminhtl@gmail.com> | 2013-08-19 00:50:58 +0300 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2013-08-21 10:54:53 +0100 |
commit | 46575e931479a4e967f2ad6a056b5f4d5490146c (patch) | |
tree | 75a7a42b919fe40eed7d862deb770ba45c01dd38 /avmedia | |
parent | c40a63642c402d8e6f52fcc3994ff5e8cf8ee50b (diff) |
Playback loop
Change-Id: I1262f16e60f928481626ef952d929cc931335233
Diffstat (limited to 'avmedia')
-rw-r--r-- | avmedia/source/vlc/vlcframegrabber.cxx | 52 | ||||
-rw-r--r-- | avmedia/source/vlc/vlcframegrabber.hxx | 4 | ||||
-rw-r--r-- | avmedia/source/vlc/vlcmanager.cxx | 6 | ||||
-rw-r--r-- | avmedia/source/vlc/vlcmanager.hxx | 4 | ||||
-rw-r--r-- | avmedia/source/vlc/vlcplayer.cxx | 16 | ||||
-rw-r--r-- | avmedia/source/vlc/vlcplayer.hxx | 3 | ||||
-rw-r--r-- | avmedia/source/vlc/wrapper/EventManager.cxx | 23 | ||||
-rw-r--r-- | avmedia/source/vlc/wrapper/EventManager.hxx | 18 | ||||
-rw-r--r-- | avmedia/source/vlc/wrapper/Player.cxx | 2 | ||||
-rw-r--r-- | avmedia/source/vlc/wrapper/Player.hxx | 1 |
10 files changed, 74 insertions, 55 deletions
diff --git a/avmedia/source/vlc/vlcframegrabber.cxx b/avmedia/source/vlc/vlcframegrabber.cxx index 4ca6addefd72..adc59b71df3b 100644 --- a/avmedia/source/vlc/vlcframegrabber.cxx +++ b/avmedia/source/vlc/vlcframegrabber.cxx @@ -23,10 +23,11 @@ const ::rtl::OUString AVMEDIA_VLC_GRABBER_IMPLEMENTATIONNAME = "com.sun.star.com const ::rtl::OUString AVMEDIA_VLC_GRABBER_SERVICENAME = "com.sun.star.media.VLCFrameGrabber_VLC"; const int MSEC_IN_SEC = 1000; -SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, const rtl::OUString& url ) +SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url ) : FrameGrabber_BASE() , mPlayer( player ) , mUrl( url ) + , mEventHandler( eh ) { } @@ -34,39 +35,42 @@ SAL_CALL VLCFrameGrabber::VLCFrameGrabber( VLC::Player& player, const rtl::OUStr { osl::Condition condition; - VLC::EventManager manager( mPlayer ); - manager.onPaused(boost::bind(&osl::Condition::set, &condition)); + const rtl::OUString& fileName = utl::TempFile::CreateTempName(); + { + VLC::EventManager manager( mPlayer, mEventHandler ); + manager.onPaused(boost::bind(&osl::Condition::set, &condition)); - mPlayer.setMute( true ); + mPlayer.setMute( true ); - if ( !mPlayer.play() ) - { - std::cerr << "Couldn't play" << std::endl; - } + if ( !mPlayer.play() ) + { + std::cerr << "Couldn't play" << std::endl; + } - mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC ); - mPlayer.pause(); + mPlayer.setTime( ( fMediaTime > 0 ? fMediaTime : 0 ) * MSEC_IN_SEC ); + mPlayer.pause(); - const TimeValue timeout = {2, 0}; - condition.wait(&timeout); + const TimeValue timeout = {2, 0}; + condition.wait(&timeout); - if ( mUrl.isEmpty() || !mPlayer.hasVout() ) - { - std::cerr << "Couldn't grab frame" << std::endl; - mPlayer.setMute( false ); + if ( mUrl.isEmpty() || !mPlayer.hasVout() ) + { + std::cerr << "Couldn't grab frame" << std::endl; + mPlayer.setMute( false ); + + manager.onPaused(); + return ::uno::Reference< css::graphic::XGraphic >(); + } - manager.onPaused(); - return ::uno::Reference< css::graphic::XGraphic >(); - } - const rtl::OUString& fileName = utl::TempFile::CreateTempName(); - mPlayer.takeSnapshot( fileName ); + mPlayer.takeSnapshot( fileName ); - mPlayer.setMute( false ); - mPlayer.stop(); + mPlayer.setMute( false ); + mPlayer.stop(); - manager.onPaused(); + manager.onPaused(); + } rtl::OUString url; utl::LocalFileHelper::ConvertPhysicalNameToURL( fileName, url ); diff --git a/avmedia/source/vlc/vlcframegrabber.hxx b/avmedia/source/vlc/vlcframegrabber.hxx index 53dce41bcea0..923b63fd50ad 100644 --- a/avmedia/source/vlc/vlcframegrabber.hxx +++ b/avmedia/source/vlc/vlcframegrabber.hxx @@ -28,6 +28,7 @@ namespace VLC { class Player; + class EventHandler; } namespace avmedia { @@ -40,8 +41,9 @@ class VLCFrameGrabber : public FrameGrabber_BASE { VLC::Player& mPlayer; const rtl::OUString& mUrl; + boost::shared_ptr<VLC::EventHandler> mEventHandler; public: - SAL_CALL VLCFrameGrabber( VLC::Player& player, const rtl::OUString& url ); + SAL_CALL VLCFrameGrabber( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh, const rtl::OUString& url ); ::com::sun::star::uno::Reference< css::graphic::XGraphic > SAL_CALL grabFrame( double fMediaTime ); diff --git a/avmedia/source/vlc/vlcmanager.cxx b/avmedia/source/vlc/vlcmanager.cxx index a3e762bacc77..6a5431d2fedb 100644 --- a/avmedia/source/vlc/vlcmanager.cxx +++ b/avmedia/source/vlc/vlcmanager.cxx @@ -10,8 +10,10 @@ const rtl::OUString VLC_IMPLEMENTATION_NAME = "com.sun.star.comp.avmedia.Manager const ::rtl::OUString VLC_SERVICENAME = "com.sun.star.media.Manager_VLC"; Manager::Manager( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) - : mxMgr( rxMgr ) + : mEventHandler(new VLC::EventHandler( "EventHandler" ) ) + , mxMgr( rxMgr ) { + mEventHandler->launch(); } Manager::~Manager() @@ -23,7 +25,7 @@ uno::Reference< media::XPlayer > SAL_CALL Manager::createPlayer( const rtl::OUSt { if ( !rURL.isEmpty() || (mPlayer.is() && dynamic_cast<VLCPlayer*>( mPlayer.get() )->url() != rURL)) { - VLCPlayer* pPlayer( new VLCPlayer( rURL/*, mxMgr */ ) ); + VLCPlayer* pPlayer( new VLCPlayer( rURL, mEventHandler /*, mxMgr */ ) ); mPlayer = uno::Reference< media::XPlayer >( pPlayer ); } diff --git a/avmedia/source/vlc/vlcmanager.hxx b/avmedia/source/vlc/vlcmanager.hxx index 94174802f064..dbcaed650bd8 100644 --- a/avmedia/source/vlc/vlcmanager.hxx +++ b/avmedia/source/vlc/vlcmanager.hxx @@ -19,10 +19,11 @@ #ifndef _VLCMANAGER_HXX #define _VLCMANAGER_HXX - +#include <boost/shared_ptr.hpp> #include "vlccommon.hxx" #include "com/sun/star/media/XManager.hpp" +#include "wrapper/EventHandler.hxx" namespace avmedia { namespace vlc { @@ -30,6 +31,7 @@ namespace vlc { class Manager : public ::cppu::WeakImplHelper2 < ::com::sun::star::media::XManager, ::com::sun::star::lang::XServiceInfo > { + boost::shared_ptr<VLC::EventHandler> mEventHandler; public: Manager( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxMgr ); ~Manager(); diff --git a/avmedia/source/vlc/vlcplayer.cxx b/avmedia/source/vlc/vlcplayer.cxx index 945d7d9bc404..a0887c238bec 100644 --- a/avmedia/source/vlc/vlcplayer.cxx +++ b/avmedia/source/vlc/vlcplayer.cxx @@ -24,12 +24,13 @@ const char * const VLC_ARGS[] = { const int MS_IN_SEC = 1000; // Millisec in sec -VLCPlayer::VLCPlayer( const rtl::OUString& url ) +VLCPlayer::VLCPlayer( const rtl::OUString& url, boost::shared_ptr<VLC::EventHandler> eh ) : VLC_Base(m_aMutex) + , mEventHandler( eh ) , mInstance( VLC_ARGS ) , mMedia( url, mInstance ) , mPlayer( mMedia ) - , mEventManager( mPlayer ) + , mEventManager( mPlayer, mEventHandler ) , mUrl( url ) , mPlaybackLoop( false ) { @@ -91,8 +92,10 @@ double SAL_CALL VLCPlayer::getRate() void VLCPlayer::replay() { - mPlayer.stop(); - mPlayer.play(); + setPlaybackLoop( false ); + stop(); + setMediaTime( 0 ); + start(); } void SAL_CALL VLCPlayer::setPlaybackLoop( ::sal_Bool bSet ) @@ -100,9 +103,6 @@ void SAL_CALL VLCPlayer::setPlaybackLoop( ::sal_Bool bSet ) ::osl::MutexGuard aGuard(m_aMutex); mPlaybackLoop = bSet; - //TODO: Fix it - return; - if ( bSet ) mEventManager.onEndReached(boost::bind(&VLCPlayer::replay, this)); else @@ -190,7 +190,7 @@ uno::Reference< css::media::XPlayerWindow > SAL_CALL VLCPlayer::createPlayerWind uno::Reference< css::media::XFrameGrabber > SAL_CALL VLCPlayer::createFrameGrabber() { ::osl::MutexGuard aGuard(m_aMutex); - VLCFrameGrabber *frameGrabber = new VLCFrameGrabber( mPlayer, mUrl ); + VLCFrameGrabber *frameGrabber = new VLCFrameGrabber( mPlayer, mEventHandler, mUrl ); return uno::Reference< css::media::XFrameGrabber >( frameGrabber ); } diff --git a/avmedia/source/vlc/vlcplayer.hxx b/avmedia/source/vlc/vlcplayer.hxx index 3723f16c3e9b..18e4e6f6d5cb 100644 --- a/avmedia/source/vlc/vlcplayer.hxx +++ b/avmedia/source/vlc/vlcplayer.hxx @@ -41,6 +41,7 @@ typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::media::XPlayer, class VLCPlayer : public ::cppu::BaseMutex, public VLC_Base { + boost::shared_ptr<VLC::EventHandler> mEventHandler; VLC::Instance mInstance; VLC::Media mMedia; VLC::Player mPlayer; @@ -48,7 +49,7 @@ class VLCPlayer : public ::cppu::BaseMutex, const rtl::OUString mUrl; bool mPlaybackLoop; public: - VLCPlayer( const rtl::OUString& url ); + VLCPlayer( const rtl::OUString& url, boost::shared_ptr<VLC::EventHandler> eh ); const rtl::OUString& url() const; diff --git a/avmedia/source/vlc/wrapper/EventManager.cxx b/avmedia/source/vlc/wrapper/EventManager.cxx index bafd4a99fd16..96e86b68bd3c 100644 --- a/avmedia/source/vlc/wrapper/EventManager.cxx +++ b/avmedia/source/vlc/wrapper/EventManager.cxx @@ -1,9 +1,11 @@ +#include <boost/thread.hpp> #include <vlc/libvlc.h> #include <vlc/libvlc_media.h> #include <vlc/libvlc_events.h> #include "EventManager.hxx" #include "SymbolLoader.hxx" +#include "EventHandler.hxx" typedef void ( *libvlc_callback_t ) ( const struct libvlc_event_t *, void * ); @@ -35,15 +37,16 @@ void EventManagerEventHandler( const libvlc_event_t *event, void *pData ) switch ( event->type ) { case libvlc_MediaPlayerPaused: - instance->mOnPaused(); + instance->mEventHandler->mCallbackQueue.push( instance->mOnPaused ); break; case libvlc_MediaPlayerEndReached: - instance->mOnEndReached(); + instance->mEventHandler->mCallbackQueue.push( instance->mOnEndReached ); break; } } -EventManager::EventManager(VLC::Player& player) +EventManager::EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh ) + : mEventHandler( eh ) { InitApiMap( VLC_EVENT_MANAGER_API ); mManager = libvlc_media_player_event_manager( player ); @@ -53,24 +56,26 @@ EventManager::~EventManager() { } -void EventManager::registerSignal(int signal, const Callback& callback) +void EventManager::registerSignal( int signal, const Callback& callback ) { - if (callback.empty()) + if ( callback.empty() ) libvlc_event_detach( mManager, signal, EventManagerEventHandler, this ); else libvlc_event_attach( mManager, signal, EventManagerEventHandler, this ); } -void EventManager::onPaused(const EventManager::Callback& callback) +void EventManager::onPaused( const EventManager::Callback& callback ) { mOnPaused = callback; - registerSignal(libvlc_MediaPlayerPaused, callback); + registerSignal( libvlc_MediaPlayerPaused, callback ); } -void EventManager::onEndReached(const Callback& callback) +void EventManager::onEndReached( const Callback& callback ) { mOnEndReached = callback; - registerSignal(libvlc_MediaPlayerEndReached, callback); + registerSignal( libvlc_MediaPlayerEndReached, callback ); } + + }
\ No newline at end of file diff --git a/avmedia/source/vlc/wrapper/EventManager.hxx b/avmedia/source/vlc/wrapper/EventManager.hxx index 9143b5551c17..aad486d7cdee 100644 --- a/avmedia/source/vlc/wrapper/EventManager.hxx +++ b/avmedia/source/vlc/wrapper/EventManager.hxx @@ -19,30 +19,36 @@ #ifndef _WRAPPER_EVENT_MANAGER_HXX #define _WRAPPER_EVENT_MANAGER_HXX #include <boost/function.hpp> +#include <boost/shared_ptr.hpp> + #include "Player.hxx" struct libvlc_event_manager_t; struct libvlc_event_t; + namespace VLC { + class EventHandler; class EventManager { friend void EventManagerEventHandler( const libvlc_event_t *event, void *pData ); public: typedef boost::function<void()> Callback; - EventManager(VLC::Player& player); + EventManager( VLC::Player& player, boost::shared_ptr<VLC::EventHandler> eh ); virtual ~EventManager(); - void onPaused(const Callback& callback = Callback()); - void onEndReached(const Callback& callback = Callback()); + void onPaused( const Callback& callback = Callback() ); + void onEndReached( const Callback& callback = Callback() ); private: + boost::shared_ptr<VLC::EventHandler> mEventHandler; + typedef boost::function< void() > TCallback; libvlc_event_manager_t *mManager; - boost::function<void()> mOnPaused; - boost::function<void()> mOnEndReached; + TCallback mOnPaused; + TCallback mOnEndReached; - void registerSignal(int signal, const Callback& callback); + void registerSignal( int signal, const Callback& callback ); }; } diff --git a/avmedia/source/vlc/wrapper/Player.cxx b/avmedia/source/vlc/wrapper/Player.cxx index 37779d1a5ea0..a64b7471bab1 100644 --- a/avmedia/source/vlc/wrapper/Player.cxx +++ b/avmedia/source/vlc/wrapper/Player.cxx @@ -154,8 +154,6 @@ namespace VLC { return libvlc_media_player_has_vout( mPlayer ); } - - } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/avmedia/source/vlc/wrapper/Player.hxx b/avmedia/source/vlc/wrapper/Player.hxx index 7832ad9c3676..ed52062fcba0 100644 --- a/avmedia/source/vlc/wrapper/Player.hxx +++ b/avmedia/source/vlc/wrapper/Player.hxx @@ -64,7 +64,6 @@ namespace VLC } void setMouseHandling(bool flag); - private: libvlc_media_player_t *mPlayer; }; |