Eolian: Integration of Video

This commit is contained in:
Daniel Zaoui 2014-03-27 10:21:26 +02:00
parent 9b798e7a64
commit 920f0d5a40
5 changed files with 302 additions and 343 deletions

View File

@ -658,7 +658,9 @@ BUILT_SOURCES = \
elm_thumb.eo.c \
elm_thumb.eo.h \
elm_toolbar.eo.c \
elm_toolbar.eo.h
elm_toolbar.eo.h \
elm_video.eo.c \
elm_video.eo.h
EXTRA_DIST += \
elm_widget.eo \
@ -727,7 +729,8 @@ EXTRA_DIST += \
elm_systray.eo \
elm_table.eo \
elm_thumb.eo \
elm_toolbar.eo
elm_toolbar.eo \
elm_video.eo
nodist_includesunstable_HEADERS = \
elm_widget.eo.h \
@ -796,5 +799,6 @@ nodist_includesunstable_HEADERS = \
elm_systray.eo.h \
elm_table.eo.h \
elm_thumb.eo.h \
elm_toolbar.eo.h
elm_toolbar.eo.h \
elm_video.eo.h

View File

@ -13,8 +13,6 @@
/* TODO: add buffering support to Emotion and display buffering
* progress in the theme when needed */
EAPI Eo_Op ELM_OBJ_VIDEO_BASE_ID = EO_NOOP;
#define MY_CLASS ELM_OBJ_VIDEO_CLASS
#define MY_CLASS_NAME "Elm_Video"
@ -26,20 +24,15 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
{NULL, NULL}
};
static void
_elm_video_smart_event(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
EOLIAN static Eina_Bool
_elm_video_elm_widget_event(Eo *obj, Elm_Video_Data *_pd EINA_UNUSED, Evas_Object *src, Evas_Callback_Type type, void *event_info)
{
Evas_Object *src = va_arg(*list, Evas_Object *);
Evas_Callback_Type type = va_arg(*list, Evas_Callback_Type);
Evas_Event_Key_Down *ev = va_arg(*list, void *);
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
if (ret) *ret = EINA_FALSE;
(void) src;
Evas_Event_Key_Down *ev = event_info;
if (elm_widget_disabled_get(obj)) return;
if (type != EVAS_CALLBACK_KEY_DOWN) return;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
if (elm_widget_disabled_get(obj)) return EINA_FALSE;
if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
if ((!strcmp(ev->key, "Left")) ||
((!strcmp(ev->key, "KP_Left")) && (!ev->string)))
@ -85,17 +78,16 @@ _elm_video_smart_event(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
}
INF("keyname: '%s' not handled", ev->key);
return;
return EINA_FALSE;
success:
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
if (ret) *ret = EINA_TRUE;
return EINA_TRUE;
}
static void
_elm_video_smart_sizing_eval(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
EOLIAN static void
_elm_video_elm_layout_sizing_eval(Eo *obj, Elm_Video_Data *sd)
{
Elm_Video_Smart_Data *sd = _pd;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
Evas_Coord minw = -1, minh = -1;
@ -211,11 +203,9 @@ _elm_video_check(Evas_Object *video)
return EINA_TRUE;
}
static void
_elm_video_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
EOLIAN static void
_elm_video_evas_smart_add(Eo *obj, Elm_Video_Data *priv)
{
Elm_Video_Smart_Data *priv = _pd;
_elm_emotion_init();
eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
@ -249,11 +239,9 @@ _elm_video_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
priv->timer = ecore_timer_add(20.0, _suspend_cb, obj);
}
static void
_elm_video_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
EOLIAN static void
_elm_video_evas_smart_del(Eo *obj, Elm_Video_Data *sd)
{
Elm_Video_Smart_Data *sd = _pd;
ecore_timer_del(sd->timer);
if (sd->remember) emotion_object_last_position_save(sd->emotion);
@ -269,8 +257,8 @@ elm_video_add(Evas_Object *parent)
return obj;
}
static void
_constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
EOLIAN static void
_elm_video_eo_base_constructor(Eo *obj, Elm_Video_Data *_pd EINA_UNUSED)
{
eo_do_super(obj, MY_CLASS, eo_constructor());
eo_do(obj,
@ -278,66 +266,30 @@ _constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list EINA_UNUSED)
evas_obj_smart_callbacks_descriptions_set(_smart_callbacks, NULL));
}
EAPI Eina_Bool
elm_video_file_set(Evas_Object *obj,
const char *filename)
EOLIAN static Eina_Bool
_elm_video_file_set(Eo *obj, Elm_Video_Data *sd, const char *filename)
{
ELM_VIDEO_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do(obj, elm_obj_video_file_set(filename, &ret));
return ret;
}
static void
_file_set(Eo *obj, void *_pd, va_list *list)
{
const char *filename = va_arg(*list, const char *);
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
if (ret) *ret = EINA_FALSE;
Elm_Video_Smart_Data *sd = _pd;
if (sd->remember) emotion_object_last_position_save(sd->emotion);
sd->stop = EINA_FALSE;
if (!emotion_object_file_set(sd->emotion, filename)) return;
if (!emotion_object_file_set(sd->emotion, filename)) return EINA_FALSE;
if (filename && ((!strncmp(filename, "file://", 7)) || (!strstr(filename, "://"))))
emotion_object_last_position_load(sd->emotion);
elm_layout_signal_emit(obj, "elm,video,load", "elm");
if (ret) *ret = EINA_TRUE;
return EINA_TRUE;
}
EAPI Evas_Object *
elm_video_emotion_get(const Evas_Object *obj)
EOLIAN static Evas_Object*
_elm_video_emotion_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) NULL;
Evas_Object *ret = NULL;
eo_do((Eo *) obj, elm_obj_video_emotion_get(&ret));
return ret;
return sd->emotion;
}
static void
_emotion_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static void
_elm_video_play(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
Evas_Object **ret = va_arg(*list, Evas_Object **);
*ret = NULL;
Elm_Video_Smart_Data *sd = _pd;
*ret = sd->emotion;
}
EAPI void
elm_video_play(Evas_Object *obj)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_play());
}
static void
_play(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
{
Elm_Video_Smart_Data *sd = _pd;
if (emotion_object_play_get(sd->emotion)) return;
ELM_SAFE_FREE(sd->timer, ecore_timer_del);
@ -349,18 +301,9 @@ _play(Eo *obj EINA_UNUSED, void *_pd, va_list *list EINA_UNUSED)
/* FIXME: pause will setup timer and go into sleep or
* hibernate after a while without activity.
*/
EAPI void
elm_video_pause(Evas_Object *obj)
EOLIAN static void
_elm_video_pause(Eo *obj, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_pause());
}
static void
_pause(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
{
Elm_Video_Smart_Data *sd = _pd;
if (!emotion_object_play_get(sd->emotion)) return;
if (!sd->timer) sd->timer = ecore_timer_add(20.0, _suspend_cb, obj);
@ -370,18 +313,9 @@ _pause(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
/* FIXME: stop should go into hibernate state directly.
*/
EAPI void
elm_video_stop(Evas_Object *obj)
EOLIAN static void
_elm_video_stop(Eo *obj, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_stop());
}
static void
_stop(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
{
Elm_Video_Smart_Data *sd = _pd;
if (!emotion_object_play_get(sd->emotion) && sd->stop) return;
ELM_SAFE_FREE(sd->timer, ecore_timer_del);
@ -392,293 +326,94 @@ _stop(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
emotion_object_suspend_set(sd->emotion, EMOTION_HIBERNATE);
}
EAPI Eina_Bool
elm_video_is_playing_get(const Evas_Object *obj)
EOLIAN static Eina_Bool
_elm_video_is_playing_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do((Eo *) obj, elm_obj_video_is_playing_get(&ret));
return ret;
return emotion_object_play_get(sd->emotion);
}
static void
_is_playing_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static Eina_Bool
_elm_video_is_seekable_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_FALSE;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_play_get(sd->emotion);
return emotion_object_seekable_get(sd->emotion);
}
EAPI Eina_Bool
elm_video_is_seekable_get(const Evas_Object *obj)
EOLIAN static Eina_Bool
_elm_video_audio_mute_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do((Eo *) obj, elm_obj_video_is_seekable_get(&ret));
return ret;
return emotion_object_audio_mute_get(sd->emotion);
}
static void
_is_seekable_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static void
_elm_video_audio_mute_set(Eo *obj EINA_UNUSED, Elm_Video_Data *sd, Eina_Bool mute)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_seekable_get(sd->emotion);
}
EAPI Eina_Bool
elm_video_audio_mute_get(const Evas_Object *obj)
{
ELM_VIDEO_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do((Eo *) obj, elm_obj_video_audio_mute_get(&ret));
return ret;
}
static void
_audio_mute_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_FALSE;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_audio_mute_get(sd->emotion);
}
EAPI void
elm_video_audio_mute_set(Evas_Object *obj,
Eina_Bool mute)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_audio_mute_set(mute));
}
static void
_audio_mute_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Eina_Bool mute = va_arg(*list, int);
Elm_Video_Smart_Data *sd = _pd;
emotion_object_audio_mute_set(sd->emotion, mute);
}
EAPI double
elm_video_audio_level_get(const Evas_Object *obj)
EOLIAN static double
_elm_video_audio_level_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) 0.0;
double ret = 0.0;
eo_do((Eo *) obj, elm_obj_video_audio_level_get(&ret));
return ret;
return emotion_object_audio_volume_get(sd->emotion);
}
static void
_audio_level_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static void
_elm_video_audio_level_set(Eo *obj EINA_UNUSED, Elm_Video_Data *sd, double volume)
{
double *ret = va_arg(*list, double *);
*ret = 0.0;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_audio_volume_get(sd->emotion);
}
EAPI void
elm_video_audio_level_set(Evas_Object *obj,
double volume)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_audio_level_set(volume));
}
static void
_audio_level_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
double volume = va_arg(*list, double);
Elm_Video_Smart_Data *sd = _pd;
emotion_object_audio_volume_set(sd->emotion, volume);
}
EAPI double
elm_video_play_position_get(const Evas_Object *obj)
EOLIAN static double
_elm_video_play_position_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) 0.0;
double ret = 0.0;
eo_do((Eo *) obj, elm_obj_video_play_position_get(&ret));
return ret;
return emotion_object_position_get(sd->emotion);
}
static void
_play_position_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static void
_elm_video_play_position_set(Eo *obj EINA_UNUSED, Elm_Video_Data *sd, double position)
{
double *ret = va_arg(*list, double *);
*ret = 0.0;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_position_get(sd->emotion);
}
EAPI void
elm_video_play_position_set(Evas_Object *obj,
double position)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_play_position_set(position));
}
static void
_play_position_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
double position = va_arg(*list, double);
Elm_Video_Smart_Data *sd = _pd;
emotion_object_position_set(sd->emotion, position);
}
EAPI double
elm_video_play_length_get(const Evas_Object *obj)
EOLIAN static double
_elm_video_play_length_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) 0.0;
double ret = 0.0;
eo_do((Eo *) obj, elm_obj_video_play_length_get(&ret));
return ret;
return emotion_object_play_length_get(sd->emotion);
}
static void
_play_length_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static const char*
_elm_video_title_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
double *ret = va_arg(*list, double *);
*ret = 0.0;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_play_length_get(sd->emotion);
return emotion_object_title_get(sd->emotion);
}
EAPI const char *
elm_video_title_get(const Evas_Object *obj)
EOLIAN static void
_elm_video_remember_position_set(Eo *obj EINA_UNUSED, Elm_Video_Data *sd, Eina_Bool remember)
{
ELM_VIDEO_CHECK(obj) NULL;
const char *ret = NULL;
eo_do((Eo *) obj, elm_obj_video_title_get(&ret));
return ret;
}
static void
_title_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
const char **ret = va_arg(*list, const char **);
*ret = NULL;
Elm_Video_Smart_Data *sd = _pd;
*ret = emotion_object_title_get(sd->emotion);
}
EAPI void
elm_video_remember_position_set(Evas_Object *obj,
Eina_Bool remember)
{
ELM_VIDEO_CHECK(obj);
eo_do(obj, elm_obj_video_remember_position_set(remember));
}
static void
_remember_position_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
{
Eina_Bool remember = va_arg(*list, int);
Elm_Video_Smart_Data *sd = _pd;
sd->remember = remember;
}
EAPI Eina_Bool
elm_video_remember_position_get(const Evas_Object *obj)
EOLIAN static Eina_Bool
_elm_video_remember_position_get(Eo *obj EINA_UNUSED, Elm_Video_Data *sd)
{
ELM_VIDEO_CHECK(obj) EINA_FALSE;
Eina_Bool ret = EINA_FALSE;
eo_do((Eo *) obj, elm_obj_video_remember_position_get(&ret));
return ret;
return sd->remember;
}
static void
_remember_position_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
EOLIAN static Eina_Bool
_elm_video_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Video_Data *_pd EINA_UNUSED)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_FALSE;
Elm_Video_Smart_Data *sd = _pd;
*ret = sd->remember;
return EINA_FALSE;
}
static void
_elm_video_smart_focus_next_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
EOLIAN static Eina_Bool
_elm_video_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Video_Data *_pd EINA_UNUSED)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_FALSE;
return EINA_FALSE;
}
static void
_elm_video_smart_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
EOLIAN static void
_elm_video_class_constructor(Eo_Class *klass)
{
Eina_Bool *ret = va_arg(*list, Eina_Bool *);
*ret = EINA_FALSE;
}
static void
_class_constructor(Eo_Class *klass)
{
const Eo_Op_Func_Description func_desc[] = {
EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_video_smart_add),
EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_video_smart_del),
EO_OP_FUNC(ELM_OBJ_WIDGET_ID(ELM_OBJ_WIDGET_SUB_ID_EVENT), _elm_video_smart_event),
EO_OP_FUNC(ELM_OBJ_WIDGET_ID(ELM_OBJ_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS), _elm_video_smart_focus_next_manager_is),
EO_OP_FUNC(ELM_OBJ_WIDGET_ID(ELM_OBJ_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS), _elm_video_smart_focus_direction_manager_is),
EO_OP_FUNC(ELM_OBJ_LAYOUT_ID(ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL), _elm_video_smart_sizing_eval),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_FILE_SET), _file_set),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_EMOTION_GET), _emotion_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_PLAY), _play),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_PAUSE), _pause),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_STOP), _stop),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_IS_PLAYING_GET), _is_playing_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_IS_SEEKABLE_GET), _is_seekable_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_AUDIO_MUTE_GET), _audio_mute_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_AUDIO_MUTE_SET), _audio_mute_set),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_AUDIO_LEVEL_GET), _audio_level_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_AUDIO_LEVEL_SET), _audio_level_set),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_PLAY_POSITION_GET), _play_position_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_PLAY_POSITION_SET), _play_position_set),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_PLAY_LENGTH_GET), _play_length_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_TITLE_GET), _title_get),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_REMEMBER_POSITION_SET), _remember_position_set),
EO_OP_FUNC(ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_REMEMBER_POSITION_GET), _remember_position_get),
EO_OP_FUNC_SENTINEL
};
eo_class_funcs_set(klass, func_desc);
evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
}
static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_FILE_SET, "Define the file or URI that will be the video source."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_EMOTION_GET, "Get the underlying Emotion object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_PLAY, "Start to play the video."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_PAUSE, "Pause the video."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_STOP, "Stop the video."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_IS_PLAYING_GET, "Is the video actually playing."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_IS_SEEKABLE_GET, "Is it possible to seek inside the video."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_AUDIO_MUTE_GET, "Is the audio muted."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_AUDIO_MUTE_SET, "Change the mute state of the Elm_Video object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_AUDIO_LEVEL_GET, "Get the audio level of the current video ."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_AUDIO_LEVEL_SET, "Set the audio level of an Elm_Video object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_PLAY_POSITION_GET, "Get the current position (in seconds) being played in the Elm_Video object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_PLAY_POSITION_SET, "Set the current position (in seconds) to be played in the Elm_Video object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_PLAY_LENGTH_GET, "Get the total playing time (in seconds) of the Elm_Video object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_TITLE_GET, "Get the title (for instance DVD title) from this emotion object."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_REMEMBER_POSITION_SET, "Set whether the object can remember the last played position."),
EO_OP_DESCRIPTION(ELM_OBJ_VIDEO_SUB_ID_REMEMBER_POSITION_GET, "Set whether the object can remember the last played position."),
EO_OP_DESCRIPTION_SENTINEL
};
static const Eo_Class_Description class_desc = {
EO_VERSION,
MY_CLASS_NAME,
EO_CLASS_TYPE_REGULAR,
EO_CLASS_DESCRIPTION_OPS(&ELM_OBJ_VIDEO_BASE_ID, op_desc, ELM_OBJ_VIDEO_SUB_ID_LAST),
NULL,
sizeof(Elm_Video_Smart_Data),
_class_constructor,
NULL
};
EO_DEFINE_CLASS(elm_obj_video_class_get, &class_desc, ELM_OBJ_LAYOUT_CLASS, NULL);
#include "elm_video.eo.c"

View File

@ -0,0 +1,219 @@
class Elm_Video (Elm_Layout)
{
eo_prefix: elm_obj_video;
properties {
audio_level {
set {
/*@
@brief Set the audio level of an Elm_Video object.
@ingroup Video */
}
get {
/*@
@brief Get the audio level of the current video.
@return the current audio level.
@ingroup Video */
}
values {
double volume; /*@ The new audio volume. */
}
}
remember_position {
set {
/*@
@brief Set whether the object can remember the last played position.
@note This API only serves as indication. System support is required.
@ingroup Video */
}
get {
/*@
@brief Set whether the object can remember the last played position.
@return whether the object remembers the last played position (@c EINA_TRUE)
or not.
@note This API only serves as indication. System support is required.
@ingroup Video */
}
values {
Eina_Bool remember; /*@ the last played position of the Elm_Video object. */
}
}
play_position {
set {
/*@
@brief Set the current position (in seconds) to be played in the
Elm_Video object.
@ingroup Video */
}
get {
/*@
@brief Get the current position (in seconds) being played in the
Elm_Video object.
@return The time (in seconds) since the beginning of the media file.
@ingroup Video */
}
values {
double position; /*@ The time (in seconds) since the beginning of the media file. */
}
}
audio_mute {
set {
/*@
@brief Change the mute state of the Elm_Video object.
@ingroup Video */
}
get {
/*@
@brief Is the audio muted.
@return @c EINA_TRUE if the audio is muted.
@ingroup Video */
}
values {
Eina_Bool mute; /*@ The new mute state. */
}
}
file {
set {
/*@
@brief Define the file or URI that will be the video source.
@return @c EINA_TRUE on success, @c EINA_FALSE otherwise
This function will explicitly define a file or URI as a source
for the video of the Elm_Video object.
@see elm_video_add()
@see elm_player_add()
@ingroup Video */
return Eina_Bool;
}
values {
const char *filename; /*@ The file or URI to target.
Local files can be specified using file:// or by using full file paths.
URI could be remote source of video, like http:// or local source like
WebCam (v4l2://). (You can use Emotion API to request and list
the available Webcam on your system). */
}
}
is_playing {
get {
/*@
@brief Is the video actually playing.
@return @c EINA_TRUE if the video is actually playing.
You should consider watching event on the object instead of polling
the object state.
@ingroup Video */
return Eina_Bool;
}
}
play_length {
get {
/*@
@brief Get the total playing time (in seconds) of the Elm_Video object.
@return The total duration (in seconds) of the media file.
@ingroup Video */
return double;
}
}
emotion {
get {
/*@
@brief Get the underlying Emotion object.
@return the underlying Emotion object.
@ingroup Video */
return Evas_Object *;
}
}
is_seekable {
get {
/*@
@brief Is it possible to seek inside the video.
@return @c EINA_TRUE if is possible to seek inside the video.
@ingroup Video */
return Eina_Bool;
}
}
title {
get {
/*@
@brief Get the title (for instance DVD title) from this emotion object.
@return A string containing the title.
This function is only useful when playing a DVD.
@note Don't change or free the string returned by this function.
@ingroup Video */
return const char *;
}
}
}
methods {
play {
/*@
@brief Start to play the video
Start to play the video and cancel all suspend state.
@ingroup Video */
}
pause {
/*@
@brief Pause the video
Pause the video and start a timer to trigger suspend mode.
@ingroup Video */
}
stop {
/*@
@brief Stop the video
Stop the video and put the emotion in deep sleep mode.
@ingroup Video */
}
}
implements {
class::constructor;
Eo_Base::constructor;
Evas_Smart::add;
Evas_Smart::del;
Elm_Widget::focus_next_manager_is;
Elm_Widget::focus_direction_manager_is;
Elm_Widget::event;
Elm_Layout::sizing_eval;
}
events {
focused;
unfocused;
}
}

View File

@ -1,4 +1,5 @@
#include "elc_player.eo.h"
#include "elm_video.eo.h"
#if 0
#define ELM_OBJ_PLAYER_CLASS elm_obj_player_class_get()
@ -12,7 +13,6 @@ enum
};
#define ELM_OBJ_PLAYER_ID(sub_id) (ELM_OBJ_PLAYER_BASE_ID + sub_id)
#endif
/**
* ELM_OBJ_VIDEO_CLASS
@ -285,3 +285,4 @@ enum
* @ingroup Video
*/
#define elm_obj_video_remember_position_get(ret) ELM_OBJ_VIDEO_ID(ELM_OBJ_VIDEO_SUB_ID_REMEMBER_POSITION_GET), EO_TYPECHECK(Eina_Bool *, ret)
#endif

View File

@ -17,8 +17,8 @@
/**
* Base layout smart data extended with video instance data.
*/
typedef struct _Elm_Video_Smart_Data Elm_Video_Smart_Data;
struct _Elm_Video_Smart_Data
typedef struct _Elm_Video_Data Elm_Video_Data;
struct _Elm_Video_Data
{
Evas_Object *emotion;
Ecore_Timer *timer;
@ -32,7 +32,7 @@ struct _Elm_Video_Smart_Data
*/
#define ELM_VIDEO_DATA_GET(o, sd) \
Elm_Video_Smart_Data * sd = eo_data_scope_get(o, ELM_OBJ_VIDEO_CLASS)
Elm_Video_Data * sd = eo_data_scope_get(o, ELM_OBJ_VIDEO_CLASS)
#define ELM_VIDEO_DATA_GET_OR_RETURN(o, ptr) \
ELM_VIDEO_DATA_GET(o, ptr); \