media: audio visualization support (phase 1)

support audio visualization for typop, tycat
This is just first phase with hard coded type (EMOTION_VIS_LIBVISUAL_INFINITE)

TODO:
1. configurable visualizing type in option
2. hide visualizing option if it is not supported.
   (it's currently supported with "gstreamer" engine)
This commit is contained in:
Wonguk Jeong 2014-08-21 20:32:58 +02:00
parent 1f68d2836b
commit bce172cc87
9 changed files with 85 additions and 0 deletions

View File

@ -102,6 +102,8 @@ config_init(void)
(edd_base, Config, "opacity", opacity, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "mute", mute, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "visualize", visualize, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC
(edd_base, Config, "urg_bell", urg_bell, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC
@ -216,6 +218,7 @@ config_sync(const Config *config_src, Config *config)
config->bell_rings = config_src->bell_rings;
config->active_links = config_src->active_links;
config->mute = config_src->mute;
config->visualize = config_src->visualize;
config->urg_bell = config_src->urg_bell;
config->multi_instance = config_src->multi_instance;
config->application_server = config_src->application_server;
@ -342,6 +345,7 @@ config_load(const char *key)
config->active_links = EINA_TRUE;
config->vidmod = 0;
config->mute = EINA_FALSE;
config->visualize = EINA_FALSE;
config->urg_bell = EINA_TRUE;
config->multi_instance = EINA_FALSE;
config->application_server = EINA_FALSE;
@ -418,6 +422,7 @@ config_fork(Config *config)
CPY(translucent);
CPY(opacity);
CPY(mute);
CPY(visualize);
CPY(urg_bell);
CPY(multi_instance);
CPY(application_server);

View File

@ -46,6 +46,7 @@ struct _Config
Eina_Bool translucent;
int opacity;
Eina_Bool mute;
Eina_Bool visualize;
Eina_Bool urg_bell;
Eina_Bool multi_instance;
Eina_Bool application_server;

View File

@ -1981,6 +1981,23 @@ main_media_mute_update(const Config *config)
}
}
void
main_media_visualize_update(const Config *config)
{
Win *wn;
Term *term;
Eina_List *l, *ll;
EINA_LIST_FOREACH(wins, l, wn)
{
EINA_LIST_FOREACH(wn->terms, ll, term)
{
if (term->media) media_visualize_set(term->media, config->visualize);
termio_media_visualize_set(term->term, config->visualize);
}
}
}
void
main_config_sync(const Config *config)
{

View File

@ -16,6 +16,7 @@ void main_close(Evas_Object *win, Evas_Object *term);
void main_trans_update(const Config *config);
void main_media_update(const Config *config);
void main_media_mute_update(const Config *config);
void main_media_visualize_update(const Config *config);
void main_config_sync(const Config *config);
void change_theme(Evas_Object *win, Config *config);

View File

@ -773,6 +773,7 @@ _type_mov_init(Evas_Object *obj)
media_play_set(obj, EINA_TRUE);
if (sd->config->mute) media_mute_set(obj, EINA_TRUE);
if (sd->config->visualize) media_visualize_set(obj, EINA_TRUE);
}
static void
@ -1280,6 +1281,25 @@ media_mute_set(Evas_Object *obj, Eina_Bool mute)
edje_object_signal_emit(sd->o_ctrl, "mute,unset", "terminology");
}
void
media_visualize_set(Evas_Object *obj, Eina_Bool visualize)
{
Media *sd = evas_object_smart_data_get(obj);
if ((!sd) || (sd->type != TYPE_MOV)) return;
if (visualize)
{
/*
* FIXME: configure visualizing type, not hard coded one
*/
if (!emotion_object_vis_supported(sd->o_img, EMOTION_VIS_LIBVISUAL_INFINITE))
ERR(_("Media visualizing is not supported"));
else
emotion_object_vis_set(sd->o_img, EMOTION_VIS_LIBVISUAL_INFINITE);
}
else
emotion_object_vis_set(sd->o_img, EMOTION_VIS_NONE);
}
void
media_play_set(Evas_Object *obj, Eina_Bool play)
{

View File

@ -28,6 +28,7 @@ void media_play_set(Evas_Object *obj, Eina_Bool play);
Eina_Bool media_play_get(Evas_Object *obj);
void media_position_set(Evas_Object *obj, double pos);
void media_volume_set(Evas_Object *obj, double vol);
void media_visualize_set(Evas_Object *obj, Eina_Bool visualize);
void media_stop(Evas_Object *obj);
const char *media_get(const Evas_Object *obj);
int media_src_type_get(const char *src);

View File

@ -41,6 +41,16 @@ _cb_op_video_mute_chg(void *data, Evas_Object *obj, void *event EINA_UNUSED)
config_save(config, NULL);
}
static void
_cb_op_video_visualize_chg(void *data, Evas_Object *obj, void *event EINA_UNUSED)
{
Evas_Object *term = data;
Config *config = termio_config_get(term);
config->visualize = elm_check_state_get(obj);
main_media_visualize_update(config);
config_save(config, NULL);
}
static void
_cb_op_video_vidmod_chg(void *data, Evas_Object *obj, void *event EINA_UNUSED)
{
@ -112,6 +122,20 @@ options_video(Evas_Object *opbox, Evas_Object *term)
evas_object_show(o);
evas_object_smart_callback_add(o, "changed",
_cb_op_video_mute_chg, term);
/*
* TODO: visualizing type configuration
*/
o = elm_check_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);
elm_object_text_set(o, _("Audio visualized"));
elm_check_state_set(o, config->visualize);
elm_box_pack_end(bx0, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "changed",
_cb_op_video_visualize_chg, term);
o = elm_separator_add(opbox);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.5);

View File

@ -377,6 +377,21 @@ termio_media_mute_set(Evas_Object *obj, Eina_Bool mute)
}
}
void
termio_media_visualize_set(Evas_Object *obj, Eina_Bool visualize)
{
Termio *sd = evas_object_smart_data_get(obj);
Eina_List *l;
Termblock *blk;
EINA_SAFETY_ON_NULL_RETURN(sd);
EINA_LIST_FOREACH(sd->pty->block.active, l, blk)
{
if (blk->obj && !blk->edje)
media_visualize_set(blk->obj, visualize);
}
}
Eina_Bool
termio_selection_exists(const Evas_Object *obj)
{

View File

@ -36,6 +36,7 @@ Evas_Object *termio_win_get(Evas_Object *obj);
const char *termio_title_get(Evas_Object *obj);
const char *termio_icon_name_get(Evas_Object *obj);
void termio_media_mute_set(Evas_Object *obj, Eina_Bool mute);
void termio_media_visualize_set(Evas_Object *obj, Eina_Bool visualize);
void termio_config_set(Evas_Object *obj, Config *config);
Config *termio_config_get(const Evas_Object *obj);