From 7d5782ef4fd19498a141ed68c23145dcc6128146 Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 11 Dec 2002 00:29:22 +0000 Subject: - initialized xine in a background thread. much time is still spend in skin loading though. --- (limited to 'noncore') diff --git a/noncore/multimedia/opieplayer2/lib.cpp b/noncore/multimedia/opieplayer2/lib.cpp index 99d5de6..20fd1e2 100644 --- a/noncore/multimedia/opieplayer2/lib.cpp +++ b/noncore/multimedia/opieplayer2/lib.cpp @@ -70,7 +70,9 @@ extern "C" { using namespace XINE; -Lib::Lib( XineVideoWidget* widget ) { +Lib::Lib( XineVideoWidget* widget ) +{ + ThreadUtil::AutoLock lock( m_initGuard ); m_initialized = false; m_video = false; m_wid = widget; @@ -87,6 +89,11 @@ Lib::Lib( XineVideoWidget* widget ) { f.close(); } + start(); +} + +void Lib::run() +{ initialize(); } @@ -124,7 +131,10 @@ void Lib::initialize() xine_event_create_listener_thread (m_queue, xine_event_handler, this); + ThreadUtil::AutoLock lock( m_initGuard ); m_initialized = true; + + send( new ThreadUtil::ChannelMessage( InitializationMessageType ), OneWay ); } Lib::~Lib() { @@ -284,12 +294,19 @@ int Lib::error() const { void Lib::receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType ) { assert( sendType == ThreadUtil::Channel::OneWay ); - handleXineEvent( msg->type() ); + switch ( msg->type() ) { + case XineMessageType: + handleXineEvent( static_cast( msg )->xineEvent ); + break; + case InitializationMessageType: + emit initialized(); + break; + } delete msg; } void Lib::handleXineEvent( const xine_event_t* t ) { - send( new ThreadUtil::ChannelMessage( t->type ), OneWay ); + send( new XineMessage( t->type ), OneWay ); } void Lib::handleXineEvent( int type ) { diff --git a/noncore/multimedia/opieplayer2/lib.h b/noncore/multimedia/opieplayer2/lib.h index 4b8dc81..34b85b9 100644 --- a/noncore/multimedia/opieplayer2/lib.h +++ b/noncore/multimedia/opieplayer2/lib.h @@ -55,7 +55,8 @@ namespace XINE { * stooping, seeking. */ class Frame; - class Lib : public ThreadUtil::Channel { + class Lib : public ThreadUtil::Channel, private ThreadUtil::Thread + { Q_OBJECT public: Lib(XineVideoWidget* = 0); @@ -177,14 +178,29 @@ namespace XINE { void stopped(); + void initialized(); + protected: virtual void receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType ); + virtual void run(); + private: void initialize(); void assertInitialized() const; + enum { XineMessageType = 1, InitializationMessageType }; + + struct XineMessage : public ThreadUtil::ChannelMessage + { + XineMessage( int _xineEvent ) : ThreadUtil::ChannelMessage( XineMessageType ), + xineEvent( _xineEvent ) + {} + + int xineEvent; + }; + mutable ThreadUtil::Mutex m_initGuard; bool m_initialized : 1; diff --git a/noncore/multimedia/opieplayer2/mediaplayer.cpp b/noncore/multimedia/opieplayer2/mediaplayer.cpp index 5e91561..0d9a5b8 100644 --- a/noncore/multimedia/opieplayer2/mediaplayer.cpp +++ b/noncore/multimedia/opieplayer2/mediaplayer.cpp @@ -365,7 +365,8 @@ void MediaPlayer::recreateAudioAndVideoWidgets() connect( videoUI, SIGNAL( lessReleased() ), this, SLOT( stopChangingVolume() ) ); xineControl = new XineControl( videoUI, videoUI->vidWidget(), mediaPlayerState ); - mediaPlayerState.setBackendInitialized(); + connect( xineControl, SIGNAL( initialized() ), + &mediaPlayerState, SLOT( setBackendInitialized() ) ); } void MediaPlayer::reloadSkins() diff --git a/noncore/multimedia/opieplayer2/xinecontrol.cpp b/noncore/multimedia/opieplayer2/xinecontrol.cpp index 0e81fa2..14e71d9 100644 --- a/noncore/multimedia/opieplayer2/xinecontrol.cpp +++ b/noncore/multimedia/opieplayer2/xinecontrol.cpp @@ -55,6 +55,7 @@ XineControl::XineControl( QWidget *videoContainerWidget, XineVideoWidget *xineWi connect( &mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( seekTo( long ) ) ); connect( &mediaPlayerState, SIGNAL( videoGammaChanged( int ) ), this, SLOT( setGamma( int ) ) ); connect( libXine, SIGNAL( stopped() ), this, SLOT( nextMedia() ) ); + connect( libXine, SIGNAL( initialized() ), this, SIGNAL( initialized() ) ); disabledSuspendScreenSaver = FALSE; } diff --git a/noncore/multimedia/opieplayer2/xinecontrol.h b/noncore/multimedia/opieplayer2/xinecontrol.h index 69a594f..000529c 100644 --- a/noncore/multimedia/opieplayer2/xinecontrol.h +++ b/noncore/multimedia/opieplayer2/xinecontrol.h @@ -114,6 +114,8 @@ private: signals: void positionChanged( long ); + + void initialized(); }; -- cgit v0.9.0.2