grr - i'm trying to debug why xine locks up on closing/stopping/deleting a

stream in elation but NOt in emotion when emotion_test shuts down.

ok emotion_test:

emotion_test dvd://

now once its played a bit of the dvd hit:

q

and it will quit
destroy video objects then exit main loop and exit.

now with elation:

elation

now put a dvd in the drive (or already have one) elation will detect this.
now let it play a bit of the dvd, and hit "Escape" to eject the dvd (which
will try delete thevideo object). elatiojn will get STUCK inside an emotion
call whihc get stuckin the emotion_xine module call thsat gets stuck inside
xine_stop().

now WHY. what is it about elation that triggers xine to go batty?


SVN revision: 10910
This commit is contained in:
Carsten Haitzler 2004-07-19 04:50:14 +00:00
parent 7ed4bd13cd
commit 755168f03b
3 changed files with 42 additions and 8 deletions

View File

@ -132,6 +132,13 @@ static int
main_signal_exit(void *data, int ev_type, void *ev)
{
ecore_main_loop_quit();
while (video_objs)
{
printf("del obj!\n");
evas_object_del(video_objs->data);
video_objs = evas_list_remove_list(video_objs, video_objs);
printf("done\n");
}
return 1;
}
@ -332,6 +339,17 @@ bg_key_down(void *data, Evas * e, Evas_Object * obj, void *event_info)
else
ecore_evas_borderless_set(ecore_evas, 0);
}
else if (!strcmp(ev->keyname, "q"))
{
ecore_main_loop_quit();
while (video_objs)
{
printf("del obj!\n");
evas_object_del(video_objs->data);
video_objs = evas_list_remove_list(video_objs, video_objs);
printf("done\n");
}
}
else
{
printf("UNHANDLED: %s\n", ev->keyname);

View File

@ -338,19 +338,29 @@ em_file_close(void *ef)
pthread_cond_broadcast(&(ev->get_pos_len_cond));
while (ev->seek_to);
while (ev->get_poslen);
printf("EX pause...\n");
// xine_set_param(ev->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
printf("EX stop\n");
xine_stop(ev->stream);
printf("EX close\n");
xine_close(ev->stream);
printf("EX dispose\n");
xine_dispose(ev->stream);
printf("EX dispose evq\n");
xine_event_dispose_queue(ev->queue);
printf("EX close video drv\n");
if (ev->video) xine_close_video_driver(decoder, ev->video);
printf("EX close audio drv\n");
if (ev->audio) xine_close_audio_driver(decoder, ev->audio);
printf("EX del timer\n");
if (ev->timer) ecore_timer_del(ev->timer);
printf("EX del fds\n");
ecore_main_fd_handler_del(ev->fd_handler);
close(ev->fd_write);
close(ev->fd_read);
ecore_main_fd_handler_del(ev->fd_ev_handler);
close(ev->fd_ev_write);
close(ev->fd_ev_read);
xine_stop(ev->stream);
xine_close(ev->stream);
xine_dispose(ev->stream);
xine_event_dispose_queue(ev->queue);
if (ev->video) xine_close_video_driver(decoder, ev->video);
if (ev->audio) xine_close_audio_driver(decoder, ev->audio);
if (ev->timer) ecore_timer_del(ev->timer);
free(ev);
}

View File

@ -122,7 +122,8 @@ _emotion_class_init(xine_t *xine, void *visual)
cl->driver_class.dispose = _emotion_class_dispose;
cl->config = xine->config;
cl->xine = xine;
printf("VO class init\n");
return cl;
}
@ -133,6 +134,7 @@ _emotion_class_dispose(video_driver_class_t *driver_class)
cl = (Emotion_Class *)driver_class;
free(cl);
printf("VO class dispose\n");
}
static char *
@ -183,6 +185,7 @@ _emotion_open(video_driver_class_t *driver_class, const void *visual)
dv->vo_driver.dispose = _emotion_dispose;
dv->vo_driver.redraw_needed = _emotion_redraw;
dv->ev = (Emotion_Xine_Video *)visual;
printf("VO open\n");
return &dv->vo_driver;
}
@ -194,6 +197,7 @@ _emotion_dispose(vo_driver_t *vo_driver)
dv = (Emotion_Driver *)vo_driver;
// printf("emotion: _emotion_dispose()\n");
free(dv);
printf("VO dispose\n");
}
/***************************************************************************/
@ -319,6 +323,7 @@ _emotion_frame_alloc(vo_driver_t *vo_driver)
fr->vo_frame.dispose = _emotion_frame_dispose;
fr->vo_frame.driver = vo_driver;
printf("VO frame alloc\n");
return (vo_frame_t *)fr;
}
@ -328,6 +333,7 @@ _emotion_frame_dispose(vo_frame_t *vo_frame)
Emotion_Frame *fr;
fr = (Emotion_Frame *)vo_frame;
printf("VO frame dispose\n");
// printf("emotion: _emotion_frame_dispose()\n");
_emotion_frame_data_free(fr);
free(fr);