summaryrefslogtreecommitdiff
authorzecke <zecke>2004-09-24 15:09:56 (UTC)
committer zecke <zecke>2004-09-24 15:09:56 (UTC)
commit8e903cd3ea735adf066e156462602987691a4c69 (patch) (side-by-side diff)
treeb05fe7cc6d46cbacdc47fe3f0411100076bc8a52
parent478b2ead47a09956cadfacb8f469fb2fdee5531c (diff)
downloadopie-8e903cd3ea735adf066e156462602987691a4c69.zip
opie-8e903cd3ea735adf066e156462602987691a4c69.tar.gz
opie-8e903cd3ea735adf066e156462602987691a4c69.tar.bz2
-Emit Progress from the xine Engine to Global::statusMessage
-Change ThreadUtil to pass data and const char* among threads
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/lib.cpp18
-rw-r--r--noncore/multimedia/opieplayer2/lib.h2
-rw-r--r--noncore/multimedia/opieplayer2/threadutil.cpp17
-rw-r--r--noncore/multimedia/opieplayer2/threadutil.h6
4 files changed, 28 insertions, 15 deletions
diff --git a/noncore/multimedia/opieplayer2/lib.cpp b/noncore/multimedia/opieplayer2/lib.cpp
index 8afb318..f1b9773 100644
--- a/noncore/multimedia/opieplayer2/lib.cpp
+++ b/noncore/multimedia/opieplayer2/lib.cpp
@@ -24,33 +24,33 @@
 :     =  ...= . :.=-
 -.   .:....=;==+<; You should have received a copy of the GNU
  -_. . .   )=.  = Library General Public License along with
    --        :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "xinevideowidget.h"
#include "frame.h"
#include "lib.h"
/* OPIE */
#include <opie2/odebug.h>
-using namespace Opie::Core;
+#include <qpe/global.h>
/* QT */
#include <qtextstream.h>
#include <qdir.h>
#include <qgfx_qws.h>
/* STD */
#include <assert.h>
#include <unistd.h>
typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame,
int width, int height,int bytes );
extern "C" {
xine_vo_driver_t* init_video_out_plugin( xine_t *xine, void* video, display_xine_frame_t, void * );
int null_is_showing_video( const xine_vo_driver_t* self );
@@ -313,45 +313,55 @@ void Lib::ensureInitialized()
odebug << "waiting for initialization thread to finish" << oendl;
wait();
odebug << "initialization thread finished!" << oendl;
}
void Lib::setWidget( XineVideoWidget *widget )
{
m_wid = widget;
resize ( m_wid-> size ( ) );
::null_set_mode( m_videoOutput, qt_screen->depth(), qt_screen->pixelType() );
m_wid->repaint();
}
void Lib::receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType )
{
assert( sendType == ThreadUtil::Channel::OneWay );
- handleXineEvent( msg->type() );
+ handleXineEvent( msg->type(), msg->data(), msg->msg() );
delete msg;
}
void Lib::handleXineEvent( const xine_event_t* t ) {
- send( new ThreadUtil::ChannelMessage( t->type ), OneWay );
+ int prog = -1; const char* name = 0;
+ if ( t->type == XINE_EVENT_PROGRESS ) {
+ xine_progress_data_t *pt = static_cast<xine_progress_data_t*>( t->data );
+ prog = pt->percent;
+ name = pt->description;
+ }
+
+ send( new ThreadUtil::ChannelMessage( t->type, prog, name ), OneWay );
}
-void Lib::handleXineEvent( int type ) {
+void Lib::handleXineEvent( int type, int data, const char* name ) {
assert( m_initialized );
if ( type == XINE_EVENT_UI_PLAYBACK_FINISHED ) {
emit stopped();
+ }else if ( type == XINE_EVENT_PROGRESS ) {
+ QString str = name == 0 ? QString::null : QString::fromUtf8( name );
+ Global::statusMessage( tr( "Progress: %1 %2" ).arg( name, data ) );;
}
}
void Lib::setShowVideo( bool video ) {
assert( m_initialized );
m_video = video;
::null_set_show_video( m_videoOutput, video );
}
bool Lib::isShowingVideo() const {
assert( m_initialized );
return ::null_is_showing_video( m_videoOutput );
}
diff --git a/noncore/multimedia/opieplayer2/lib.h b/noncore/multimedia/opieplayer2/lib.h
index 0ff14d0..dfddc2a 100644
--- a/noncore/multimedia/opieplayer2/lib.h
+++ b/noncore/multimedia/opieplayer2/lib.h
@@ -190,27 +190,27 @@ namespace XINE {
private:
void initialize();
int m_bytes_per_pixel;
bool m_initialized:1;
bool m_duringInitialization:1;
bool m_video:1;
XineVideoWidget *m_wid;
xine_t *m_xine;
xine_stream_t *m_stream;
xine_cfg_entry_t *m_config;
xine_vo_driver_t *m_videoOutput;
xine_ao_driver_t* m_audioOutput;
xine_event_queue_t *m_queue;
void handleXineEvent( const xine_event_t* t );
- void handleXineEvent( int type );
+ void handleXineEvent( int type, int data, const char* name );
void drawFrame( uint8_t* frame, int width, int height, int bytes );
// C -> C++ bridge for the event system
static void xine_event_handler( void* user_data, const xine_event_t* t);
static void xine_display_frame( void* user_data, uint8_t* frame ,
int width, int height, int bytes );
};
};
#endif
diff --git a/noncore/multimedia/opieplayer2/threadutil.cpp b/noncore/multimedia/opieplayer2/threadutil.cpp
index 6ed9853..b5cac61 100644
--- a/noncore/multimedia/opieplayer2/threadutil.cpp
+++ b/noncore/multimedia/opieplayer2/threadutil.cpp
@@ -113,33 +113,33 @@ bool WaitCondition::wait( Mutex &mutex )
{
return pthread_cond_wait( &d->waitCondition, &mutex.d->mutex );
}
void WaitCondition::wakeOne()
{
pthread_cond_signal( &d->waitCondition );
}
void WaitCondition::wakeAll()
{
pthread_cond_broadcast( &d->waitCondition );
}
struct Thread::Data
{
- Data() : isRunning( false )
+ Data() : isRunning( false )
{}
pthread_t self;
Mutex guard;
bool isRunning;
WaitCondition finishCondition;
Thread *thr;
void run() { thr->run(); }
};
extern "C"
{
@@ -175,42 +175,42 @@ Thread::Thread()
: d( new Data )
{
d->thr = this;
}
Thread::~Thread()
{
assert( d->isRunning == false );
delete d;
}
void Thread::start()
{
AutoLock lock( d->guard );
if ( d->isRunning ) {
- odebug << "ThreadUtil::Thread::start() called for running thread." << oendl;
+ odebug << "ThreadUtil::Thread::start() called for running thread." << oendl;
return;
}
pthread_attr_t attributes;
pthread_attr_init( &attributes );
pthread_attr_setscope( &attributes, PTHREAD_SCOPE_SYSTEM );
int err = pthread_create( &d->self, &attributes, start_thread, ( void* )d );
if ( err != 0 ) {
- odebug << "ThreadUtil::Thread::start() : can't create thread: " << strerror( err ) << "" << oendl;
+ odebug << "ThreadUtil::Thread::start() : can't create thread: " << strerror( err ) << "" << oendl;
pthread_attr_destroy( &attributes );
return;
}
pthread_attr_destroy( &attributes );
}
void Thread::terminate()
{
AutoLock lock( d->guard );
if ( !d->isRunning )
return;
pthread_cancel( d->self );
}
bool Thread::wait()
@@ -256,49 +256,48 @@ OnewayNotifier::~OnewayNotifier()
void OnewayNotifier::notify()
{
const char c = 42;
::write( m_writeFd, &c, 1 );
}
void OnewayNotifier::wakeUp()
{
char c = 0;
if ( ::read( m_readFd, &c, 1 ) != 1 )
return;
emit awake();
}
-ChannelMessage::ChannelMessage( int type )
- : m_type( type ), m_isCall( false ), m_replied( false ),
- m_inEventHandler( false )
-{
-}
+ChannelMessage::ChannelMessage( int type, int data, const char* msg )
+ : m_type( type ), m_data( data ), m_msg( msg ),
+ m_isCall( false ), m_replied( false ), m_inEventHandler( false )
+{}
ChannelMessage::~ChannelMessage()
{
if ( m_guard.isLocked() )
m_guard.unlock();
}
void ChannelMessage::reply()
{
if ( !m_isCall )
{
- odebug << "ChannelMessage::reply() - can't reply oneway message!" << oendl;
+ odebug << "ChannelMessage::reply() - can't reply oneway message!" << oendl;
return;
}
if ( m_inEventHandler )
{
m_replied = true;
return;
}
m_condition.wakeOne();
m_guard.unlock();
}
struct Channel::Private
{
Private()
diff --git a/noncore/multimedia/opieplayer2/threadutil.h b/noncore/multimedia/opieplayer2/threadutil.h
index 2e83d3a..f97a18b 100644
--- a/noncore/multimedia/opieplayer2/threadutil.h
+++ b/noncore/multimedia/opieplayer2/threadutil.h
@@ -120,44 +120,48 @@ namespace ThreadUtil
private slots:
void wakeUp();
private:
int m_readFd;
int m_writeFd;
QSocketNotifier *m_notifier;
};
class Channel;
class ChannelMessage
{
friend class Channel;
public:
- ChannelMessage( int type = -1 );
+ ChannelMessage( int type = -1, int data = -1, const char* msg = 0 );
virtual ~ChannelMessage();
int type() const { return m_type; }
+ int data() const { return m_data; }
+ const char* msg()const { return m_msg; }
void reply();
private:
ChannelMessage( const ChannelMessage & );
ChannelMessage &operator=( const ChannelMessage );
int m_type;
+ int m_data;
+ const char *m_msg;
bool m_isCall : 1;
bool m_replied : 1;
bool m_inEventHandler : 1;
Mutex m_guard;
WaitCondition m_condition;
};
class Channel : public QObject
{
Q_OBJECT
public:
enum SendType { OneWay, WaitForReply };
Channel( QObject *parent = 0, const char *name = 0 );
virtual ~Channel();
void send( ChannelMessage *message, SendType type );