Enlightenment CVS committal Author : raster Project : e17 Module : apps/elation
Dir : e17/apps/elation/src/modules Modified Files: Makefile.am elation_dvd.c Log Message: actually works as a dvd player.. now xine is screwed when it comes to ejecting.. i cant shutdown the xine subsytem - it freezes inside a xine call. all say YAY to threads! grrrr. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/elation/src/modules/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- Makefile.am 15 Jul 2004 09:47:01 -0000 1.1 +++ Makefile.am 18 Jul 2004 08:04:21 -0000 1.2 @@ -6,9 +6,7 @@ pkgdir = $(libdir)/elation -pkg_LTLIBRARIES = elation_menu.la - -# elation_dvd.la +pkg_LTLIBRARIES = elation_menu.la elation_dvd.la elation_menu_la_SOURCES = elation_menu.c elation_menu_la_LIBADD = @my_libs@ @@ -16,6 +14,6 @@ elation_menu_la_DEPENDENCIES = $(top_builddir)/config.h elation_dvd_la_SOURCES = elation_dvd.c -elation_dvd_la_LIBADD = @my_libs@ +elation_dvd_la_LIBADD = @my_libs@ -ldvdnav elation_dvd_la_LDFLAGS = $(LDFLAGS) -no-undefined -module -avoid-version elation_dvd_la_DEPENDENCIES = $(top_builddir)/config.h =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/elation/src/modules/elation_dvd.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- elation_dvd.c 15 Jul 2004 09:47:01 -0000 1.1 +++ elation_dvd.c 18 Jul 2004 08:04:21 -0000 1.2 @@ -3,57 +3,95 @@ #include <dvdnav/dvdnav.h> #include <dvdnav/nav_read.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/cdrom.h> + /* external module symbols. the rest is private */ void *init(Elation_Module *em); +/********************/ typedef struct _Elation_Module_Private Elation_Module_Private; struct _Elation_Module_Private { + Evas_Object *overlay; + Evas_Object *background1; + Evas_Object *background2; Evas_Object *video; + + Ecore_Timer *media_check_timer; + Ecore_Timer *media_play_timer; + double media_fade_in_start; + Ecore_Timer *media_fade_in_timer; + + unsigned char have_media : 1; + unsigned char check_media_done : 1; + unsigned char menu_visible : 1; }; static void shutdown(Elation_Module *em); static void resize(Elation_Module *em); -static void hide(Elation_Module *em); static void show(Elation_Module *em); +static void hide(Elation_Module *em); +static void focus(Elation_Module *em); +static void unfocus(Elation_Module *em); +static void action(Elation_Module *em, int action); static void frame_decode_cb(void *data, Evas_Object *obj, void *event_info); static void frame_resize_cb(void *data, Evas_Object *obj, void *event_info); static void length_change_cb(void *data, Evas_Object *obj, void *event_info); +static void decode_stop_cb(void *data, Evas_Object *obj, void *event_info); +static void button_num_change_cb(void *data, Evas_Object *obj, void *event_info); +static void key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static int media_check_timer_cb(void *data); +static int media_play_timer_cb(void *data); +static int media_fade_in_timer_cb(void *data); void * init(Elation_Module *em) { - Elation_Module *em; Elation_Module_Private *pr; - Evas_Coord w, h; - em = calloc(1, sizeof(Elation_Module)); - if (!em) return NULL; - em->info = ei; pr = calloc(1, sizeof(Elation_Module_Private)); - if (!pr) - { - free(em); - return NULL; - } - em->data = pr; + if (!pr) return NULL; + + /* set up module methods */ + em->shutdown = shutdown; + em->resize = resize; + em->show = show; + em->hide = hide; + em->focus = focus; + em->unfocus = unfocus; + em->action = action; + + pr->background1 = evas_object_rectangle_add(em->info->evas); + evas_object_color_set(pr->background1, 0, 0, 0, 255); + pr->background2 = evas_object_rectangle_add(em->info->evas); + evas_object_color_set(pr->background2, 0, 0, 0, 255); + + pr->video = emotion_object_add(em->info->evas); + evas_object_event_callback_add(pr->video, EVAS_CALLBACK_KEY_DOWN, key_down_cb, em); - evas_viewport_get(em->info->evas, NULL, NULL, &w, &h); - pr->video = elation_object_add(em->info->evas); - evas_object_smart_callback_add(pr->video, "frame_decode", frame_decode_cb, em); evas_object_smart_callback_add(pr->video, "frame_resize", frame_resize_cb, em); evas_object_smart_callback_add(pr->video, "length_change",length_change_cb, em); + evas_object_smart_callback_add(pr->video, "decode_stop", decode_stop_cb, em); + evas_object_smart_callback_add(pr->video, "button_num_change", button_num_change_cb, em); - elation_object_file_set(pr->video, "dvd://"); - evas_object_move(pr->video, 0, 0); - evas_object_resize(pr->video, w, h); - elation_object_smooth_scale_set(pr->video, 1); - elation_object_play_set(pr->video, 1); + emotion_object_smooth_scale_set(pr->video, 1); + + pr->overlay = edje_object_add(em->info->evas); + edje_object_file_set(pr->overlay, PACKAGE_DATA_DIR"/data/theme.eet", "dvd"); + edje_object_signal_emit(pr->overlay, "media", "0"); + + pr->media_check_timer = ecore_timer_add(0.5, media_check_timer_cb, em); - return em; + return pr; } static void @@ -62,21 +100,99 @@ Elation_Module_Private *pr; pr = em->data; + evas_object_del(pr->background1); + evas_object_del(pr->background2); evas_object_del(pr->video); + evas_object_del(pr->overlay); + if (pr->media_check_timer) ecore_timer_del(pr->media_check_timer); + if (pr->media_play_timer) ecore_timer_del(pr->media_play_timer); + if (pr->media_fade_in_timer) ecore_timer_del(pr->media_fade_in_timer); free(pr); - free(em); } static void resize(Elation_Module *em) { Elation_Module_Private *pr; - Evas_Coord w, h; + Evas_Coord x, y, w, h, ww, hh; + double ratio; + int vw, vh; + + pr = em->data; + evas_output_viewport_get(em->info->evas, NULL, NULL, &w, &h); + + ww = w; + hh = h; + + evas_object_move(pr->overlay, 0, 0); + evas_object_resize(pr->overlay, w, h); + + emotion_object_size_get(pr->video, &vw, &vh); + ratio = emotion_object_ratio_get(pr->video); + if (ratio > 0.0) + { + x = 0; + y = (h - (w / ratio)) / 2; + if (y < 0) + { + y = 0; + x = (w - (h * ratio)) / 2; + w = h * ratio; + } + else + h = w / ratio; + evas_object_move(pr->video, x, y); + evas_object_resize(pr->video, w, h); + } + else + { + if (vh > 1) + { + ratio = (double)vw / (double)vh; + x = 0; + y = (h - (w / ratio)) / 2; + if (y < 0) + { + y = 0; + x = (w - (h * ratio)) / 2; + w = h * ratio; + } + else + h = w / ratio; + } + evas_object_move(pr->video, 0, 0); + evas_object_resize(pr->video, w, h); + } + + if (w == ww) + { + evas_object_move(pr->background1, 0, 0); + evas_object_resize(pr->background1, ww, y); + evas_object_move(pr->background2, 0, y + h); + evas_object_resize(pr->background2, ww, hh - h - y); + } + else + { + evas_object_move(pr->background1, 0, 0); + evas_object_resize(pr->background1, x, hh); + evas_object_move(pr->background2, x + w, 0); + evas_object_resize(pr->background2, ww - w - x, hh); + } +} + +static void +show(Elation_Module *em) +{ + Elation_Module_Private *pr; pr = em->data; - evas_viewport_get(em->info->evas, NULL, NULL, &w, &h); - evas_object_move(pr->video, 0, 0); - evas_object_resize(pr->video, w, h); + if (pr->have_media) + { + evas_object_show(pr->background1); + evas_object_show(pr->background2); + evas_object_show(pr->video); + } + evas_object_show(pr->overlay); } static void @@ -85,18 +201,224 @@ Elation_Module_Private *pr; pr = em->data; + evas_object_hide(pr->background1); + evas_object_hide(pr->background2); evas_object_hide(pr->video); + evas_object_hide(pr->overlay); } static void -show(Elation_Module *em) +focus(Elation_Module *em) +{ + Elation_Module_Private *pr; + + pr = em->data; + evas_object_focus_set(pr->video, 1); +} + +static void +unfocus(Elation_Module *em) +{ + Elation_Module_Private *pr; + + pr = em->data; + evas_object_focus_set(pr->video, 0); +} + +static void +action(Elation_Module *em, int action) { Elation_Module_Private *pr; pr = em->data; - evas_object_show(pr->video); + switch (action) + { + case ELATION_ACT_NEXT: + if (pr->menu_visible) + { + } + else + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_NEXT); + break; + case ELATION_ACT_PREV: + if (pr->menu_visible) + { + } + else + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_PREV); + break; + case ELATION_ACT_SELECT: + if (pr->menu_visible) + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_SELECT); + else + { + if (emotion_object_play_get(pr->video)) + emotion_object_play_set(pr->video, 0); + else + emotion_object_play_set(pr->video, 1); + } + break; + case ELATION_ACT_EXIT: + { + int fd; + + printf("stop...\n"); + emotion_object_play_set(pr->video, 0); + printf("rewind...\n"); + while (emotion_object_position_get(pr->video) != 0.0) + emotion_object_position_set(pr->video, 0.0); + printf("eject...\n"); +// emotion_object_eject(pr->video); + printf("fset...\n"); + if (0) + { + evas_object_del(pr->video); + pr->video = emotion_object_add(em->info->evas); + evas_object_event_callback_add(pr->video, EVAS_CALLBACK_KEY_DOWN, key_down_cb, em); + + evas_object_smart_callback_add(pr->video, "frame_decode", frame_decode_cb, em); + evas_object_smart_callback_add(pr->video, "frame_resize", frame_resize_cb, em); + evas_object_smart_callback_add(pr->video, "length_change",length_change_cb, em); + evas_object_smart_callback_add(pr->video, "decode_stop", decode_stop_cb, em); + evas_object_smart_callback_add(pr->video, "button_num_change", button_num_change_cb, em); + + emotion_object_smooth_scale_set(pr->video, 1); + + evas_object_stack_above(pr->video, pr->background1); + } + else + emotion_object_file_set(pr->video, NULL); + printf("emit..\n"); + edje_object_signal_emit(pr->overlay, "media", "0"); + evas_object_hide(pr->background1); + evas_object_hide(pr->background2); + evas_object_hide(pr->video); + pr->have_media = 0; + fd = open("/dev/dvd", O_RDONLY | O_NONBLOCK); + if (fd >= 0) + { + int i; + printf("eject disk!\n"); + + for (i = 0; i < 5; i++) + { + if (ioctl(fd, CDROMEJECT, 0) == 0) break; + perror("ioctl"); + sleep(1); + } + close(fd); + } + } + break; + case ELATION_ACT_UP: + if (pr->menu_visible) + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_UP); + else + { + // FIXME: bring up config menu + } + break; + case ELATION_ACT_DOWN: + if (pr->menu_visible) + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_DOWN); + else + { + // FIXME: bring up config menu + } + break; + case ELATION_ACT_LEFT: + if (pr->menu_visible) + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_LEFT); + else + { + double pos; + + pos = emotion_object_position_get(pr->video); + emotion_object_position_set(pr->video, pos - 30.0); + } + break; + case ELATION_ACT_RIGHT: + if (pr->menu_visible) + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_RIGHT); + else + { + double pos; + + pos = emotion_object_position_get(pr->video); + emotion_object_position_set(pr->video, pos + 30.0); + } + break; + case ELATION_ACT_MENU: + if (pr->menu_visible) + { + // FIXME: bring up config menu + } + else + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_MENU1); + break; + case ELATION_ACT_INFO: + if (pr->menu_visible) + { + // FIXME: bring up config menu + } + else + { + } + break; + case ELATION_ACT_INPUT: + if (pr->menu_visible) + { + // FIXME: bring up config menu + } + else + { + } + break; + case ELATION_ACT_PLAY: + if (pr->menu_visible) + { + emotion_object_event_simple_send(pr->video, EMOTION_EVENT_NEXT); + } + else + { + emotion_object_play_set(pr->video, 1); + } + break; + case ELATION_ACT_PAUSE: + if (pr->menu_visible) + { + } + else + { + if (emotion_object_play_get(pr->video)) + emotion_object_play_set(pr->video, 0); + else + emotion_object_play_set(pr->video, 1); + } + break; + case ELATION_ACT_STOP: + if (pr->menu_visible) + { + } + else + { + emotion_object_play_set(pr->video, 0); + emotion_object_position_set(pr->video, 0.0); + } + break; + case ELATION_ACT_REC: + break; + case ELATION_ACT_SKIP: + break; + case ELATION_ACT_NONE: + default: + break; + } } +/*** private stuff ***/ + +#if 0 static void dvd_info_get(Elation_Module *em) { @@ -118,6 +440,7 @@ } dvdnav_close(dvd); } +#endif static void frame_decode_cb(void *data, Evas_Object *obj, void *event_info) @@ -126,21 +449,17 @@ double pos, len; em = data; - pos = elation_object_position_get(obj); - len = elation_object_play_length_get(obj); + pos = emotion_object_position_get(obj); + len = emotion_object_play_length_get(obj); } static void frame_resize_cb(void *data, Evas_Object *obj, void *event_info) { Elation_Module *em; - int iw, ih; - double ratio; em = data; - elation_object_size_get(obj, &iw, &ih); - ratio = elation_object_ratio_get(obj); - if (ratio > 0.0) iw = ih * ratio; + em->resize(em); } static void @@ -150,6 +469,193 @@ double pos, len; em = data; - pos = elation_object_position_get(obj); - len = elation_object_play_length_get(obj); + pos = emotion_object_position_get(obj); + len = emotion_object_play_length_get(obj); +} + +static void +decode_stop_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elation_Module *em; + Elation_Module_Private *pr; + + em = data; + pr = em->data; +// emotion_object_position_set(pr->video, 0.0); +// emotion_object_play_set(pr->video, 1); +} + +static void +button_num_change_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elation_Module *em; + Elation_Module_Private *pr; + + em = data; + pr = em->data; + if (emotion_object_spu_button_count_get(pr->video) > 0) + pr->menu_visible = 1; + else + pr->menu_visible = 0; +} + +static void +key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev; + Elation_Module *em; + Elation_Module_Private *pr; + int action = ELATION_ACT_NONE; + + ev = (Evas_Event_Key_Down *)event_info; + em = data; + pr = em->data; + + /* translator */ + /* FIXME: create proper translator sys later to amke remote config easy */ + + if (!strcmp(ev->keyname, "Escape")) action = ELATION_ACT_EXIT; + else if (!strcmp(ev->keyname, "Up")) action = ELATION_ACT_UP; + else if (!strcmp(ev->keyname, "Down")) action = ELATION_ACT_DOWN; + else if (!strcmp(ev->keyname, "Left")) action = ELATION_ACT_LEFT; + else if (!strcmp(ev->keyname, "Right")) action = ELATION_ACT_RIGHT; + else if (!strcmp(ev->keyname, "Return")) action = ELATION_ACT_SELECT; + else if (!strcmp(ev->keyname, "Prior")) action = ELATION_ACT_PREV; + else if (!strcmp(ev->keyname, "Next")) action = ELATION_ACT_NEXT; + else if (!strcmp(ev->keyname, "m")) action = ELATION_ACT_MENU; + else if (!strcmp(ev->keyname, "i")) action = ELATION_ACT_INFO; + else if (!strcmp(ev->keyname, "o")) action = ELATION_ACT_INPUT; + else if (!strcmp(ev->keyname, "p")) action = ELATION_ACT_PLAY; + else if (!strcmp(ev->keyname, "a")) action = ELATION_ACT_PAUSE; + else if (!strcmp(ev->keyname, "s")) action = ELATION_ACT_STOP; + else if (!strcmp(ev->keyname, "k")) action = ELATION_ACT_SKIP; + em->action(em, action); +} + +/* seriously - there should be a media detect module all on its own */ +static int +media_check_timer_cb(void *data) +{ + Elation_Module *em; + Elation_Module_Private *pr; + dvdnav_t *dvd; + int ok = 0; + int fd; + + em = data; + pr = em->data; + + if (pr->have_media) return 1; + fd = open("/dev/dvd", O_RDONLY | O_NONBLOCK); + if (fd >= 0) + { + if (pr->check_media_done) + { + struct cdrom_generic_command cgc; + struct request_sense sense; + unsigned char buffer[8]; + int ret; + + memset(&sense, 0, sizeof(sense)); + cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION; + cgc.cmd[1] = 1; + cgc.cmd[4] = 16; + cgc.cmd[8] = sizeof(buffer); + cgc.timeout = 600; + cgc.buffer = buffer; + cgc.buflen = sizeof(buffer); + cgc.data_direction = CGC_DATA_READ; + cgc.sense = &sense; + cgc.quiet = 1; + ret = ioctl(fd, CDROM_SEND_PACKET, &cgc); + if (ret == -1) + ok = 0; + else + { + int val; + + val = buffer[4] & 0xf; + /* 3 = eject request */ + /* 2 = inseted new disk */ + if ((val == 2) || (val == 4)) ok = 1; + } + } + else + { + unsigned char buffer[8]; + int ret; + + ret = read(fd, buffer, 8); + if (ret == -1) + ok = 0; + else + ok = 1; + pr->check_media_done = 1; + } + close(fd); + } + if (ok) + { + pr->have_media = 1; + printf("have media\n"); + edje_object_signal_emit(pr->overlay, "media", "1"); + pr->media_play_timer = ecore_timer_add(2.0, media_play_timer_cb, em); + } + else + { + pr->have_media = 0; + } + return 1; +} + +static int +media_play_timer_cb(void *data) +{ + Elation_Module *em; + Elation_Module_Private *pr; + + em = data; + pr = em->data; + pr->media_play_timer = NULL; + if (!pr->have_media) return 0; + + edje_object_signal_emit(pr->overlay, "media", "ok"); + emotion_object_file_set(pr->video, "dvd:/"); + emotion_object_play_set(pr->video, 1); + if (evas_object_visible_get(pr->overlay)) + { + evas_object_color_set(pr->background1, 0, 0, 0, 0); + evas_object_color_set(pr->background2, 0, 0, 0, 0); + evas_object_color_set(pr->video, 255, 255, 255, 0); + evas_object_show(pr->background1); + evas_object_show(pr->background2); + evas_object_show(pr->video); + } + em->resize(em); + + pr->media_fade_in_timer = ecore_timer_add(1.0 / 30.0, media_fade_in_timer_cb, em); + pr->media_fade_in_start = ecore_time_get(); + + return 0; +} + +static int +media_fade_in_timer_cb(void *data) +{ + Elation_Module *em; + Elation_Module_Private *pr; + int a; + double t; + + em = data; + pr = em->data; + t = ecore_time_get() - pr->media_fade_in_start; + a = (t * 255) / 10.0; + if (a > 255) a = 255; + evas_object_color_set(pr->background1, 0, 0, 0, a); + evas_object_color_set(pr->background2, 0, 0, 0, a); + evas_object_color_set(pr->video, 255, 255, 255, a); + if (a < 255) return 1; + pr->media_fade_in_timer = NULL; + return 0; } ------------------------------------------------------- This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools! Get your free copy of BEA WebLogic Workshop 8.1 today. http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click _______________________________________________ enlightenment-cvs mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs