summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-10-09 13:29:39 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-10-09 13:29:39 -0500
commitc0913ce69ba56f01e0b197f6c7a4776080da35a0 (patch)
treee15a785a8ee00f8d2c0c61fefd543cf1d82de45b
parent0ecfaa944652fa9b7a632e6135741c4b9f473a20 (diff)
downloadtdemultimedia-c0913ce69ba56f01e0b197f6c7a4776080da35a0.tar.gz
tdemultimedia-c0913ce69ba56f01e0b197f6c7a4776080da35a0.zip
Fix artsd exiting on Xine-generated Xorg errors
This relates to Bug 2150 Fix Kaboodle not playing newly loaded videos This relates to Bug 1905
-rw-r--r--kaboodle/engine.cpp26
-rw-r--r--kaboodle/player.cpp14
-rw-r--r--xine_artsplugin/xinePlayObject_impl.cpp126
3 files changed, 100 insertions, 66 deletions
diff --git a/kaboodle/engine.cpp b/kaboodle/engine.cpp
index a53989d2..9008dab0 100644
--- a/kaboodle/engine.cpp
+++ b/kaboodle/engine.cpp
@@ -109,20 +109,18 @@ bool Kaboodle::Engine::reload(void)
void Kaboodle::Engine::play()
{
- if(d->playobj)
- {
- switch(d->playobj->state())
- {
- case Arts::posIdle:
- if(needReload)
- reload();
- d->playobj->play();
- break;
- case Arts::posPaused:
- d->playobj->play();
- break;
- default:
- break;
+ if(d->playobj) {
+ switch(d->playobj->state()) {
+ case Arts::posIdle:
+ if(needReload)
+ reload();
+ d->playobj->play();
+ break;
+ case Arts::posPaused:
+ d->playobj->play();
+ break;
+ default:
+ break;
}
}
}
diff --git a/kaboodle/player.cpp b/kaboodle/player.cpp
index af53a91b..4ec345c7 100644
--- a/kaboodle/player.cpp
+++ b/kaboodle/player.cpp
@@ -88,15 +88,17 @@ KMediaPlayer::View *Kaboodle::Player::view(void)
// notice how this is just an expanded stop() ? weird.
bool Kaboodle::Player::openURL(const KURL &f)
{
- if(!current.isEmpty())
+ bool previousLoad = !current.isEmpty();
+ if (previousLoad)
{
uncompleted = false;
engine->stop();
+ current = f;
}
emit started(0);
current = f;
- if(!engine->load(current))
+ if (!engine->load(current))
{
current = KURL();
setState(Empty);
@@ -104,12 +106,18 @@ bool Kaboodle::Player::openURL(const KURL &f)
return false;
}
+ if (previousLoad)
+ {
+ TQTimer::singleShot( 0, this, SLOT(play()) );
+ return true;
+ }
+
stopAction->setEnabled(false);
playAction->setEnabled(true);
pauseAction->setEnabled(false);
setState(Empty); // so stateChanged() is emitted and autoPlay works
setState(Stop);
-
+
tickerTimeout();
return true;
}
diff --git a/xine_artsplugin/xinePlayObject_impl.cpp b/xine_artsplugin/xinePlayObject_impl.cpp
index 6fd108d2..076a4dc3 100644
--- a/xine_artsplugin/xinePlayObject_impl.cpp
+++ b/xine_artsplugin/xinePlayObject_impl.cpp
@@ -140,63 +140,91 @@ int ao_fifo_arts_delay()
return (int)(1000 * Arts::AudioSubSystem::the()->outputDelay());
}
-xinePlayObject_impl::xinePlayObject_impl(bool audioOnly)
- : mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly)
-{
+static int xine_play_object_x_errhandler( Display *dpy, XErrorEvent *err ) {
+ if ( err->error_code == BadWindow ) {
+ return 0;
+ }
+ else if ( err->error_code == BadMatch &&
+ err->request_code == 42 /* X_SetInputFocus */ ) {
+ return 0;
+ }
- if (!audioOnly)
- {
- XInitThreads();
+ char errstr[256];
+ XGetErrorText( dpy, err->error_code, errstr, 256 );
+ arts_warning( "X Error: %s %d\n"
+ " Major opcode: %d\n"
+ " Minor opcode: %d\n"
+ " Resource id: 0x%lx",
+ errstr, err->error_code,
+ err->request_code,
+ err->minor_code,
+ err->resourceid );
+
+ return 0;
+}
- if (!(display = XOpenDisplay( NULL )))
- {
- arts_fatal( "could not open X11 display" );
- }
- XFlush( display );
+static int xine_play_object_xio_errhandler( Display * ) {
+ arts_fatal( "Fatal IO error: client killed" );
+ return 0;
+}
- // Create a special window for uninterrupted X11 communication
- xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ),
- 0, 0, 1, 1, 0, 0, 0 );
+xinePlayObject_impl::xinePlayObject_impl(bool audioOnly)
+ : mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly)
+{
+ if (!audioOnly) {
+ XInitThreads();
+
+ if (!(display = XOpenDisplay( NULL ))) {
+ arts_fatal( "could not open X11 display" );
+ }
- XSelectInput( display, xcomWindow, ExposureMask );
- }
- pthread_mutex_init( &mutex, 0 );
+ // Install default error handlers
+ XSetErrorHandler( xine_play_object_x_errhandler );
+ XSetIOErrorHandler( xine_play_object_xio_errhandler );
- if (!audioOnly)
- {
- // Initialize X11 properties
- xcomAtomQuit = XInternAtom( display, "VPO_INTERNAL_EVENT", False );
- xcomAtomResize = XInternAtom( display, "VPO_RESIZE_NOTIFY", False );
- screen = DefaultScreen( display );
- shmCompletionType = (XShmQueryExtension( display ) == True)
- ? XShmGetEventBase( display ) + ShmCompletion : -1;
-
- width = 0;
- height = 0;
- dscbTimeOut = 0;
-
- // Initialize xine visual structure
- visual.display = display;
- visual.screen = screen;
- visual.d = xcomWindow;
- visual.dest_size_cb = &dest_size_cb;
- visual.frame_output_cb = &frame_output_cb;
- visual.user_data = this;
- }
+ XFlush( display );
- // Initialize audio and video details
- Arts::SoundServerV2 server = Arts::Reference( "global:Arts_SoundServerV2" );
- audio.sample_rate = 0;
- audio.num_channels = 0;
- audio.bits_per_sample = 0;
+ // Create a special window for uninterrupted X11 communication
+ xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ), 0, 0, 1, 1, 0, 0, 0 );
- flpos = 0.0;
- if (!audioOnly)
- if (pthread_create( &thread, 0, pthread_start_routine, this ))
- {
- arts_fatal( "could not create thread" );
- }
+ XSelectInput( display, xcomWindow, ExposureMask );
+ }
+ pthread_mutex_init( &mutex, 0 );
+
+ if (!audioOnly) {
+ // Initialize X11 properties
+ xcomAtomQuit = XInternAtom( display, "VPO_INTERNAL_EVENT", False );
+ xcomAtomResize = XInternAtom( display, "VPO_RESIZE_NOTIFY", False );
+ screen = DefaultScreen( display );
+ shmCompletionType = (XShmQueryExtension( display ) == True)
+ ? XShmGetEventBase( display ) + ShmCompletion : -1;
+
+ width = 0;
+ height = 0;
+ dscbTimeOut = 0;
+
+ // Initialize xine visual structure
+ visual.display = display;
+ visual.screen = screen;
+ visual.d = xcomWindow;
+ visual.dest_size_cb = &dest_size_cb;
+ visual.frame_output_cb = &frame_output_cb;
+ visual.user_data = this;
+ }
+
+ // Initialize audio and video details
+ Arts::SoundServerV2 server = Arts::Reference( "global:Arts_SoundServerV2" );
+ audio.sample_rate = 0;
+ audio.num_channels = 0;
+ audio.bits_per_sample = 0;
+
+ flpos = 0.0;
+ if (!audioOnly) {
+ if (pthread_create( &thread, 0, pthread_start_routine, this )) {
+ arts_fatal( "could not create thread" );
+ }
+ }
}
xinePlayObject_impl::~xinePlayObject_impl()