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,10 +109,8 @@ 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: case Arts::posIdle:
if(needReload) if(needReload)
reload(); reload();

@ -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,6 +106,12 @@ 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);

@ -140,31 +140,59 @@ int ao_fifo_arts_delay()
return (int)(1000 * Arts::AudioSubSystem::the()->outputDelay()); return (int)(1000 * Arts::AudioSubSystem::the()->outputDelay());
} }
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;
}
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;
}
static int xine_play_object_xio_errhandler( Display * ) {
arts_fatal( "Fatal IO error: client killed" );
return 0;
}
xinePlayObject_impl::xinePlayObject_impl(bool audioOnly) xinePlayObject_impl::xinePlayObject_impl(bool audioOnly)
: mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly) : mrl( "" ), xine( 0 ), stream( 0 ), queue( 0 ), ao_port( 0 ), vo_port( 0 ), audioOnly(audioOnly)
{ {
if (!audioOnly) {
if (!audioOnly)
{
XInitThreads(); XInitThreads();
if (!(display = XOpenDisplay( NULL ))) if (!(display = XOpenDisplay( NULL ))) {
{
arts_fatal( "could not open X11 display" ); arts_fatal( "could not open X11 display" );
} }
// Install default error handlers
XSetErrorHandler( xine_play_object_x_errhandler );
XSetIOErrorHandler( xine_play_object_xio_errhandler );
XFlush( display ); XFlush( display );
// Create a special window for uninterrupted X11 communication // Create a special window for uninterrupted X11 communication
xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ), xcomWindow = XCreateSimpleWindow( display, DefaultRootWindow( display ), 0, 0, 1, 1, 0, 0, 0 );
0, 0, 1, 1, 0, 0, 0 );
XSelectInput( display, xcomWindow, ExposureMask ); XSelectInput( display, xcomWindow, ExposureMask );
} }
pthread_mutex_init( &mutex, 0 ); pthread_mutex_init( &mutex, 0 );
if (!audioOnly) if (!audioOnly) {
{
// Initialize X11 properties // Initialize X11 properties
xcomAtomQuit = XInternAtom( display, "VPO_INTERNAL_EVENT", False ); xcomAtomQuit = XInternAtom( display, "VPO_INTERNAL_EVENT", False );
xcomAtomResize = XInternAtom( display, "VPO_RESIZE_NOTIFY", False ); xcomAtomResize = XInternAtom( display, "VPO_RESIZE_NOTIFY", False );
@ -192,11 +220,11 @@ xinePlayObject_impl::xinePlayObject_impl(bool audioOnly)
audio.bits_per_sample = 0; audio.bits_per_sample = 0;
flpos = 0.0; flpos = 0.0;
if (!audioOnly) if (!audioOnly) {
if (pthread_create( &thread, 0, pthread_start_routine, this )) if (pthread_create( &thread, 0, pthread_start_routine, this )) {
{
arts_fatal( "could not create thread" ); arts_fatal( "could not create thread" );
} }
}
} }
xinePlayObject_impl::~xinePlayObject_impl() xinePlayObject_impl::~xinePlayObject_impl()

Loading…
Cancel
Save