summaryrefslogtreecommitdiff
Unidiff
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
@@ -16,49 +16,49 @@
16    .%`+i>       _;_. 16    .%`+i>       _;_.
17    .i_,=:_.      -<s. This program is distributed in the hope that 17    .i_,=:_.      -<s. This program is distributed in the hope that
18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 18     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
19    : ..    .:,     . . . without even the implied warranty of 19    : ..    .:,     . . . without even the implied warranty of
20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 20    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 21  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.=       =       ; Library General Public License for more 22..}^=.=       =       ; Library General Public License for more
23++=   -.     .`     .: details. 23++=   -.     .`     .: details.
24 :     =  ...= . :.=- 24 :     =  ...= . :.=-
25 -.   .:....=;==+<; You should have received a copy of the GNU 25 -.   .:....=;==+<; You should have received a copy of the GNU
26  -_. . .   )=.  = Library General Public License along with 26  -_. . .   )=.  = Library General Public License along with
27    --        :-=` this library; see the file COPYING.LIB. 27    --        :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation, 28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330, 29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA. 30 Boston, MA 02111-1307, USA.
31 31
32*/ 32*/
33 33
34#include "xinevideowidget.h" 34#include "xinevideowidget.h"
35#include "frame.h" 35#include "frame.h"
36#include "lib.h" 36#include "lib.h"
37 37
38/* OPIE */ 38/* OPIE */
39#include <opie2/odebug.h> 39#include <opie2/odebug.h>
40using namespace Opie::Core; 40#include <qpe/global.h>
41 41
42/* QT */ 42/* QT */
43#include <qtextstream.h> 43#include <qtextstream.h>
44#include <qdir.h> 44#include <qdir.h>
45#include <qgfx_qws.h> 45#include <qgfx_qws.h>
46 46
47/* STD */ 47/* STD */
48#include <assert.h> 48#include <assert.h>
49#include <unistd.h> 49#include <unistd.h>
50 50
51typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame, 51typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame,
52 int width, int height,int bytes ); 52 int width, int height,int bytes );
53 53
54extern "C" { 54extern "C" {
55 xine_vo_driver_t* init_video_out_plugin( xine_t *xine, void* video, display_xine_frame_t, void * ); 55 xine_vo_driver_t* init_video_out_plugin( xine_t *xine, void* video, display_xine_frame_t, void * );
56 int null_is_showing_video( const xine_vo_driver_t* self ); 56 int null_is_showing_video( const xine_vo_driver_t* self );
57 void null_set_show_video( const xine_vo_driver_t* self, int show ); 57 void null_set_show_video( const xine_vo_driver_t* self, int show );
58 int null_is_fullscreen( const xine_vo_driver_t* self ); 58 int null_is_fullscreen( const xine_vo_driver_t* self );
59 void null_set_fullscreen( const xine_vo_driver_t* self, int screen ); 59 void null_set_fullscreen( const xine_vo_driver_t* self, int screen );
60 int null_is_scaling( const xine_vo_driver_t* self ); 60 int null_is_scaling( const xine_vo_driver_t* self );
61 void null_set_scaling( const xine_vo_driver_t* self, int scale ); 61 void null_set_scaling( const xine_vo_driver_t* self, int scale );
62 void null_set_gui_width( const xine_vo_driver_t* self, int width ); 62 void null_set_gui_width( const xine_vo_driver_t* self, int width );
63 void null_set_gui_height( const xine_vo_driver_t* self, int height ); 63 void null_set_gui_height( const xine_vo_driver_t* self, int height );
64 void null_set_mode( const xine_vo_driver_t* self, int depth, int rgb ); 64 void null_set_mode( const xine_vo_driver_t* self, int depth, int rgb );
@@ -305,61 +305,71 @@ int Lib::error() const {
305 return xine_get_error( m_stream ); 305 return xine_get_error( m_stream );
306}; 306};
307 307
308void Lib::ensureInitialized() 308void Lib::ensureInitialized()
309{ 309{
310 if ( m_initialized ) 310 if ( m_initialized )
311 return; 311 return;
312 312
313 odebug << "waiting for initialization thread to finish" << oendl; 313 odebug << "waiting for initialization thread to finish" << oendl;
314 wait(); 314 wait();
315 odebug << "initialization thread finished!" << oendl; 315 odebug << "initialization thread finished!" << oendl;
316} 316}
317 317
318void Lib::setWidget( XineVideoWidget *widget ) 318void Lib::setWidget( XineVideoWidget *widget )
319{ 319{
320 m_wid = widget; 320 m_wid = widget;
321 resize ( m_wid-> size ( ) ); 321 resize ( m_wid-> size ( ) );
322 ::null_set_mode( m_videoOutput, qt_screen->depth(), qt_screen->pixelType() ); 322 ::null_set_mode( m_videoOutput, qt_screen->depth(), qt_screen->pixelType() );
323 m_wid->repaint(); 323 m_wid->repaint();
324} 324}
325 325
326void Lib::receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType ) 326void Lib::receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType )
327{ 327{
328 assert( sendType == ThreadUtil::Channel::OneWay ); 328 assert( sendType == ThreadUtil::Channel::OneWay );
329 handleXineEvent( msg->type() ); 329 handleXineEvent( msg->type(), msg->data(), msg->msg() );
330 delete msg; 330 delete msg;
331} 331}
332 332
333void Lib::handleXineEvent( const xine_event_t* t ) { 333void Lib::handleXineEvent( const xine_event_t* t ) {
334 send( new ThreadUtil::ChannelMessage( t->type ), OneWay ); 334 int prog = -1; const char* name = 0;
335 if ( t->type == XINE_EVENT_PROGRESS ) {
336 xine_progress_data_t *pt = static_cast<xine_progress_data_t*>( t->data );
337 prog = pt->percent;
338 name = pt->description;
339 }
340
341 send( new ThreadUtil::ChannelMessage( t->type, prog, name ), OneWay );
335} 342}
336 343
337void Lib::handleXineEvent( int type ) { 344void Lib::handleXineEvent( int type, int data, const char* name ) {
338 assert( m_initialized ); 345 assert( m_initialized );
339 346
340 if ( type == XINE_EVENT_UI_PLAYBACK_FINISHED ) { 347 if ( type == XINE_EVENT_UI_PLAYBACK_FINISHED ) {
341 emit stopped(); 348 emit stopped();
349 }else if ( type == XINE_EVENT_PROGRESS ) {
350 QString str = name == 0 ? QString::null : QString::fromUtf8( name );
351 Global::statusMessage( tr( "Progress: %1 %2" ).arg( name, data ) );;
342 } 352 }
343} 353}
344 354
345 355
346void Lib::setShowVideo( bool video ) { 356void Lib::setShowVideo( bool video ) {
347 assert( m_initialized ); 357 assert( m_initialized );
348 358
349 m_video = video; 359 m_video = video;
350 ::null_set_show_video( m_videoOutput, video ); 360 ::null_set_show_video( m_videoOutput, video );
351} 361}
352 362
353bool Lib::isShowingVideo() const { 363bool Lib::isShowingVideo() const {
354 assert( m_initialized ); 364 assert( m_initialized );
355 365
356 return ::null_is_showing_video( m_videoOutput ); 366 return ::null_is_showing_video( m_videoOutput );
357} 367}
358 368
359bool Lib::hasVideo() const { 369bool Lib::hasVideo() const {
360 assert( m_initialized ); 370 assert( m_initialized );
361 371
362 return xine_get_stream_info( m_stream, 18 ); 372 return xine_get_stream_info( m_stream, 18 );
363} 373}
364 374
365void Lib::showVideoFullScreen( bool fullScreen ) { 375void Lib::showVideoFullScreen( bool fullScreen ) {
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
@@ -182,35 +182,35 @@ namespace XINE {
182 182
183 void initialized(); 183 void initialized();
184 184
185 protected: 185 protected:
186 virtual void receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType ); 186 virtual void receiveMessage( ThreadUtil::ChannelMessage *msg, SendType sendType );
187 187
188 virtual void run(); 188 virtual void run();
189 189
190 private: 190 private:
191 void initialize(); 191 void initialize();
192 192
193 int m_bytes_per_pixel; 193 int m_bytes_per_pixel;
194 bool m_initialized:1; 194 bool m_initialized:1;
195 bool m_duringInitialization:1; 195 bool m_duringInitialization:1;
196 bool m_video:1; 196 bool m_video:1;
197 XineVideoWidget *m_wid; 197 XineVideoWidget *m_wid;
198 xine_t *m_xine; 198 xine_t *m_xine;
199 xine_stream_t *m_stream; 199 xine_stream_t *m_stream;
200 xine_cfg_entry_t *m_config; 200 xine_cfg_entry_t *m_config;
201 xine_vo_driver_t *m_videoOutput; 201 xine_vo_driver_t *m_videoOutput;
202 xine_ao_driver_t* m_audioOutput; 202 xine_ao_driver_t* m_audioOutput;
203 xine_event_queue_t *m_queue; 203 xine_event_queue_t *m_queue;
204 204
205 void handleXineEvent( const xine_event_t* t ); 205 void handleXineEvent( const xine_event_t* t );
206 void handleXineEvent( int type ); 206 void handleXineEvent( int type, int data, const char* name );
207 void drawFrame( uint8_t* frame, int width, int height, int bytes ); 207 void drawFrame( uint8_t* frame, int width, int height, int bytes );
208 // C -> C++ bridge for the event system 208 // C -> C++ bridge for the event system
209 static void xine_event_handler( void* user_data, const xine_event_t* t); 209 static void xine_event_handler( void* user_data, const xine_event_t* t);
210 static void xine_display_frame( void* user_data, uint8_t* frame , 210 static void xine_display_frame( void* user_data, uint8_t* frame ,
211 int width, int height, int bytes ); 211 int width, int height, int bytes );
212 }; 212 };
213}; 213};
214 214
215 215
216#endif 216#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
@@ -105,49 +105,49 @@ WaitCondition::~WaitCondition()
105bool WaitCondition::wait() 105bool WaitCondition::wait()
106{ 106{
107 Mutex m; 107 Mutex m;
108 m.lock(); 108 m.lock();
109 return wait( m ); 109 return wait( m );
110} 110}
111 111
112bool WaitCondition::wait( Mutex &mutex ) 112bool WaitCondition::wait( Mutex &mutex )
113{ 113{
114 return pthread_cond_wait( &d->waitCondition, &mutex.d->mutex ); 114 return pthread_cond_wait( &d->waitCondition, &mutex.d->mutex );
115} 115}
116 116
117void WaitCondition::wakeOne() 117void WaitCondition::wakeOne()
118{ 118{
119 pthread_cond_signal( &d->waitCondition ); 119 pthread_cond_signal( &d->waitCondition );
120} 120}
121 121
122void WaitCondition::wakeAll() 122void WaitCondition::wakeAll()
123{ 123{
124 pthread_cond_broadcast( &d->waitCondition ); 124 pthread_cond_broadcast( &d->waitCondition );
125} 125}
126 126
127struct Thread::Data 127struct Thread::Data
128{ 128{
129 Data() : isRunning( false ) 129 Data() : isRunning( false )
130 {} 130 {}
131 131
132 pthread_t self; 132 pthread_t self;
133 Mutex guard; 133 Mutex guard;
134 bool isRunning; 134 bool isRunning;
135 135
136 WaitCondition finishCondition; 136 WaitCondition finishCondition;
137 137
138 Thread *thr; 138 Thread *thr;
139 139
140 void run() { thr->run(); } 140 void run() { thr->run(); }
141}; 141};
142 142
143extern "C" 143extern "C"
144{ 144{
145 145
146static void terminate_thread( void *arg ) 146static void terminate_thread( void *arg )
147{ 147{
148 Thread::Data *data = ( Thread::Data* )arg; 148 Thread::Data *data = ( Thread::Data* )arg;
149 149
150 assert( data ); 150 assert( data );
151 151
152 AutoLock locker( data->guard ); 152 AutoLock locker( data->guard );
153 data->isRunning = false; 153 data->isRunning = false;
@@ -167,58 +167,58 @@ static void *start_thread( void *arg )
167 167
168 Thread::exit(); 168 Thread::exit();
169 return 0; // never reached 169 return 0; // never reached
170} 170}
171 171
172} 172}
173 173
174Thread::Thread() 174Thread::Thread()
175 : d( new Data ) 175 : d( new Data )
176{ 176{
177 d->thr = this; 177 d->thr = this;
178} 178}
179 179
180Thread::~Thread() 180Thread::~Thread()
181{ 181{
182 assert( d->isRunning == false ); 182 assert( d->isRunning == false );
183 delete d; 183 delete d;
184} 184}
185 185
186void Thread::start() 186void Thread::start()
187{ 187{
188 AutoLock lock( d->guard ); 188 AutoLock lock( d->guard );
189 189
190 if ( d->isRunning ) { 190 if ( d->isRunning ) {
191 odebug << "ThreadUtil::Thread::start() called for running thread." << oendl; 191 odebug << "ThreadUtil::Thread::start() called for running thread." << oendl;
192 return; 192 return;
193 } 193 }
194 194
195 pthread_attr_t attributes; 195 pthread_attr_t attributes;
196 pthread_attr_init( &attributes ); 196 pthread_attr_init( &attributes );
197 pthread_attr_setscope( &attributes, PTHREAD_SCOPE_SYSTEM ); 197 pthread_attr_setscope( &attributes, PTHREAD_SCOPE_SYSTEM );
198 int err = pthread_create( &d->self, &attributes, start_thread, ( void* )d ); 198 int err = pthread_create( &d->self, &attributes, start_thread, ( void* )d );
199 if ( err != 0 ) { 199 if ( err != 0 ) {
200 odebug << "ThreadUtil::Thread::start() : can't create thread: " << strerror( err ) << "" << oendl; 200 odebug << "ThreadUtil::Thread::start() : can't create thread: " << strerror( err ) << "" << oendl;
201 pthread_attr_destroy( &attributes ); 201 pthread_attr_destroy( &attributes );
202 return; 202 return;
203 } 203 }
204 pthread_attr_destroy( &attributes ); 204 pthread_attr_destroy( &attributes );
205} 205}
206 206
207void Thread::terminate() 207void Thread::terminate()
208{ 208{
209 AutoLock lock( d->guard ); 209 AutoLock lock( d->guard );
210 if ( !d->isRunning ) 210 if ( !d->isRunning )
211 return; 211 return;
212 212
213 pthread_cancel( d->self ); 213 pthread_cancel( d->self );
214} 214}
215 215
216bool Thread::wait() 216bool Thread::wait()
217{ 217{
218 AutoLock lock( d->guard ); 218 AutoLock lock( d->guard );
219 if ( !d->isRunning ) 219 if ( !d->isRunning )
220 return true; 220 return true;
221 221
222 return d->finishCondition.wait( d->guard ); 222 return d->finishCondition.wait( d->guard );
223} 223}
224 224
@@ -248,65 +248,64 @@ OnewayNotifier::OnewayNotifier()
248OnewayNotifier::~OnewayNotifier() 248OnewayNotifier::~OnewayNotifier()
249{ 249{
250 delete m_notifier; 250 delete m_notifier;
251 251
252 ::close( m_readFd ); 252 ::close( m_readFd );
253 ::close( m_writeFd ); 253 ::close( m_writeFd );
254} 254}
255 255
256void OnewayNotifier::notify() 256void OnewayNotifier::notify()
257{ 257{
258 const char c = 42; 258 const char c = 42;
259 ::write( m_writeFd, &c, 1 ); 259 ::write( m_writeFd, &c, 1 );
260} 260}
261 261
262void OnewayNotifier::wakeUp() 262void OnewayNotifier::wakeUp()
263{ 263{
264 char c = 0; 264 char c = 0;
265 265
266 if ( ::read( m_readFd, &c, 1 ) != 1 ) 266 if ( ::read( m_readFd, &c, 1 ) != 1 )
267 return; 267 return;
268 268
269 emit awake(); 269 emit awake();
270} 270}
271 271
272ChannelMessage::ChannelMessage( int type ) 272ChannelMessage::ChannelMessage( int type, int data, const char* msg )
273 : m_type( type ), m_isCall( false ), m_replied( false ), 273 : m_type( type ), m_data( data ), m_msg( msg ),
274 m_inEventHandler( false ) 274 m_isCall( false ), m_replied( false ), m_inEventHandler( false )
275{ 275{}
276}
277 276
278ChannelMessage::~ChannelMessage() 277ChannelMessage::~ChannelMessage()
279{ 278{
280 if ( m_guard.isLocked() ) 279 if ( m_guard.isLocked() )
281 m_guard.unlock(); 280 m_guard.unlock();
282} 281}
283 282
284void ChannelMessage::reply() 283void ChannelMessage::reply()
285{ 284{
286 if ( !m_isCall ) 285 if ( !m_isCall )
287 { 286 {
288 odebug << "ChannelMessage::reply() - can't reply oneway message!" << oendl; 287 odebug << "ChannelMessage::reply() - can't reply oneway message!" << oendl;
289 return; 288 return;
290 } 289 }
291 290
292 if ( m_inEventHandler ) 291 if ( m_inEventHandler )
293 { 292 {
294 m_replied = true; 293 m_replied = true;
295 return; 294 return;
296 } 295 }
297 296
298 m_condition.wakeOne(); 297 m_condition.wakeOne();
299 m_guard.unlock(); 298 m_guard.unlock();
300} 299}
301 300
302struct Channel::Private 301struct Channel::Private
303{ 302{
304 Private() 303 Private()
305 { 304 {
306 ownerThread = pthread_self(); 305 ownerThread = pthread_self();
307 } 306 }
308 307
309 pthread_t ownerThread; 308 pthread_t ownerThread;
310}; 309};
311 310
312Channel::Channel( QObject *parent, const char *name ) 311Channel::Channel( QObject *parent, const char *name )
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
@@ -112,60 +112,64 @@ namespace ThreadUtil
112 OnewayNotifier(); 112 OnewayNotifier();
113 ~OnewayNotifier(); 113 ~OnewayNotifier();
114 114
115 void notify(); 115 void notify();
116 116
117 signals: 117 signals:
118 void awake(); 118 void awake();
119 119
120 private slots: 120 private slots:
121 void wakeUp(); 121 void wakeUp();
122 122
123 private: 123 private:
124 int m_readFd; 124 int m_readFd;
125 int m_writeFd; 125 int m_writeFd;
126 QSocketNotifier *m_notifier; 126 QSocketNotifier *m_notifier;
127 }; 127 };
128 128
129 129
130 class Channel; 130 class Channel;
131 131
132 class ChannelMessage 132 class ChannelMessage
133 { 133 {
134 friend class Channel; 134 friend class Channel;
135 public: 135 public:
136 ChannelMessage( int type = -1 ); 136 ChannelMessage( int type = -1, int data = -1, const char* msg = 0 );
137 virtual ~ChannelMessage(); 137 virtual ~ChannelMessage();
138 138
139 int type() const { return m_type; } 139 int type() const { return m_type; }
140 int data() const { return m_data; }
141 const char* msg()const { return m_msg; }
140 142
141 void reply(); 143 void reply();
142 144
143 private: 145 private:
144 ChannelMessage( const ChannelMessage & ); 146 ChannelMessage( const ChannelMessage & );
145 ChannelMessage &operator=( const ChannelMessage ); 147 ChannelMessage &operator=( const ChannelMessage );
146 148
147 int m_type; 149 int m_type;
150 int m_data;
151 const char *m_msg;
148 bool m_isCall : 1; 152 bool m_isCall : 1;
149 bool m_replied : 1; 153 bool m_replied : 1;
150 bool m_inEventHandler : 1; 154 bool m_inEventHandler : 1;
151 Mutex m_guard; 155 Mutex m_guard;
152 WaitCondition m_condition; 156 WaitCondition m_condition;
153 }; 157 };
154 158
155 class Channel : public QObject 159 class Channel : public QObject
156 { 160 {
157 Q_OBJECT 161 Q_OBJECT
158 public: 162 public:
159 enum SendType { OneWay, WaitForReply }; 163 enum SendType { OneWay, WaitForReply };
160 Channel( QObject *parent = 0, const char *name = 0 ); 164 Channel( QObject *parent = 0, const char *name = 0 );
161 virtual ~Channel(); 165 virtual ~Channel();
162 166
163 void send( ChannelMessage *message, SendType type ); 167 void send( ChannelMessage *message, SendType type );
164 168
165 protected: 169 protected:
166 virtual void receiveMessage( ChannelMessage *message, SendType type ) = 0; 170 virtual void receiveMessage( ChannelMessage *message, SendType type ) = 0;
167 171
168 private slots: 172 private slots:
169 void deliver(); 173 void deliver();
170 174
171 private: 175 private: