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
pull/1/head
Timothy Pearson 10 years ago
parent 0ecfaa9446
commit c0913ce69b

@ -109,20 +109,18 @@ bool Kaboodle::Engine::reload(void)
void Kaboodle::Engine::play() void Kaboodle::Engine::play()
{ {
if(d->playobj) if(d->playobj) {
{ switch(d->playobj->state()) {
switch(d->playobj->state()) case Arts::posIdle:
{ if(needReload)
case Arts::posIdle: reload();
if(needReload) d->playobj->play();
reload(); break;
d->playobj->play(); case Arts::posPaused:
break; d->playobj->play();
case Arts::posPaused: break;
d->playobj->play(); default:
break; break;
default:
break;
} }
} }
} }

@ -88,15 +88,17 @@ KMediaPlayer::View *Kaboodle::Player::view(void)
// notice how this is just an expanded stop() ? weird. // notice how this is just an expanded stop() ? weird.
bool Kaboodle::Player::openURL(const KURL &f) bool Kaboodle::Player::openURL(const KURL &f)
{ {
if(!current.isEmpty()) bool previousLoad = !current.isEmpty();
if (previousLoad)
{ {
uncompleted = false; uncompleted = false;
engine->stop(); engine->stop();
current = f;
} }
emit started(0); emit started(0);
current = f; current = f;
if(!engine->load(current)) if (!engine->load(current))
{ {
current = KURL(); current = KURL();
setState(Empty); setState(Empty);
@ -104,12 +106,18 @@ bool Kaboodle::Player::openURL(const KURL &f)
return false; return false;
} }
if (previousLoad)
{
TQTimer::singleShot( 0, this, SLOT(play()) );
return true;
}
stopAction->setEnabled(false); stopAction->setEnabled(false);
playAction->setEnabled(true); playAction->setEnabled(true);
pauseAction->setEnabled(false); pauseAction->setEnabled(false);
setState(Empty); // so stateChanged() is emitted and autoPlay works setState(Empty); // so stateChanged() is emitted and autoPlay works
setState(Stop); setState(Stop);
tickerTimeout(); tickerTimeout();
return true; return true;
} }

@ -140,63 +140,91 @@ int ao_fifo_arts_delay()
return (int)(1000 * Arts::AudioSubSystem::the()->outputDelay()); return (int)(1000 * Arts::AudioSubSystem::the()->outputDelay());
} }
xinePlayObject_impl::xinePlayObject_impl(bool audioOnly) static int xine_play_object_x_errhandler( Display *dpy, XErrorEvent *err ) {
: mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly) if ( err->error_code == BadWindow ) {
{ return 0;
}
else if ( err->error_code == BadMatch &&
err->request_code == 42 /* X_SetInputFocus */ ) {
return 0;
}
if (!audioOnly) char errstr[256];
{ XGetErrorText( dpy, err->error_code, errstr, 256 );
XInitThreads(); 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 xinePlayObject_impl::xinePlayObject_impl(bool audioOnly)
xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ), : mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly)
0, 0, 1, 1, 0, 0, 0 ); {
if (!audioOnly) {
XInitThreads();
if (!(display = XOpenDisplay( NULL ))) {
arts_fatal( "could not open X11 display" );
}
XSelectInput( display, xcomWindow, ExposureMask ); // Install default error handlers
} XSetErrorHandler( xine_play_object_x_errhandler );
pthread_mutex_init( &mutex, 0 ); XSetIOErrorHandler( xine_play_object_xio_errhandler );
if (!audioOnly) XFlush( display );
{
// 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 // Create a special window for uninterrupted X11 communication
Arts::SoundServerV2 server = Arts::Reference( "global:Arts_SoundServerV2" ); xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ), 0, 0, 1, 1, 0, 0, 0 );
audio.sample_rate = 0;
audio.num_channels = 0;
audio.bits_per_sample = 0;
flpos = 0.0; XSelectInput( display, xcomWindow, ExposureMask );
if (!audioOnly) }
if (pthread_create( &thread, 0, pthread_start_routine, this )) pthread_mutex_init( &mutex, 0 );
{
arts_fatal( "could not create thread" ); 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() xinePlayObject_impl::~xinePlayObject_impl()

Loading…
Cancel
Save