From 246d28d3bf0e99bbeb6ffbfcb2b974e1d8d364c4 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sat, 9 Jan 2021 04:00:38 +0000 Subject: [PATCH] music control - support popup display of song position look at property updates for position and track it and tell the popup about it along with loop mode. --- src/modules/music-control/e_mod_main.c | 32 ++++++++++++++++++++++- src/modules/music-control/private.h | 4 +++ src/modules/music-control/ui.c | 36 +++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/modules/music-control/e_mod_main.c b/src/modules/music-control/e_mod_main.c index 7119f54ee..bc162621b 100644 --- a/src/modules/music-control/e_mod_main.c +++ b/src/modules/music-control/e_mod_main.c @@ -238,6 +238,7 @@ parse_metadata(E_Music_Control_Module_Context *ctxt, Eina_Value *array) for (i = 0; i < eina_value_array_count(array); i++) { const char *key = NULL, *str_val; + long long llval; char *str_markup; Eina_Value st, subst; Efreet_Uri *uri; @@ -318,8 +319,17 @@ parse_metadata(E_Music_Control_Module_Context *ctxt, Eina_Value *array) } eina_value_flush(&subst); } + else if (!strcmp(key, "mpris:length")) + { + llval = -1; + if (eina_value_struct_value_get(&st, "arg1", &subst) && + eina_value_struct_get(&subst, "arg0", &llval)) + { + ctxt->meta_length = (double)llval / 1000000.0; + } + eina_value_flush(&subst); + } // FIXME: to handle in future: - // mpris:length - int64 // xesam:url - s } eina_value_flush(&st); @@ -372,11 +382,31 @@ prop_changed(void *data, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info) else ctxt->playing = EINA_FALSE; music_control_state_update_all(ctxt); } + else if (!strcmp(event->name, "LoopStatus")) + { + const Eina_Value *value = event->value; + const char *status; + + eina_value_get(value, &status); + if (!strcmp(status, "None")) ctxt->loop = EINA_FALSE; + else if (!strcmp(status, "Track")) ctxt->loop = EINA_TRUE; + if (!strcmp(status, "Playlist")) ctxt->loop = EINA_TRUE; + music_control_state_update_all(ctxt); + } else if (!strcmp(event->name, "Metadata")) { parse_metadata(ctxt, (Eina_Value*)event->value); music_control_metadata_update_all(ctxt); } + else if (!strcmp(event->name, "Position")) + { + const Eina_Value *value = event->value; + long long llval = 0; + + eina_value_get(value, &llval); + ctxt->position = (double)llval / 1000000.0; + music_control_pos_update(ctxt); + } } static void _bus_list(E_Music_Control_Module_Context *ctxt); diff --git a/src/modules/music-control/private.h b/src/modules/music-control/private.h index d8caef610..880f45ae7 100644 --- a/src/modules/music-control/private.h +++ b/src/modules/music-control/private.h @@ -23,6 +23,9 @@ typedef struct _E_Music_Control_Module_Context Eina_Stringshare *meta_title; Eina_Stringshare *meta_cover; Eina_Stringshare *meta_cover_prev; + double meta_length; + double position; + Eina_Bool loop; Eldbus_Proxy *mrpis2; Eldbus_Proxy *mpris2_player; E_Config_DD *conf_edd; @@ -47,6 +50,7 @@ void music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void const char *music_control_edj_path_get(void); void music_control_popup_del(E_Music_Control_Instance *inst); void music_control_state_update_all(E_Music_Control_Module_Context *ctxt); +void music_control_pos_update(E_Music_Control_Module_Context *ctxt); void music_control_metadata_update_all(E_Music_Control_Module_Context *ctxt); Eina_Bool music_control_dbus_init(E_Music_Control_Module_Context *ctxt, const char *bus); diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c index 6552954b7..ea3b97f92 100644 --- a/src/modules/music-control/ui.c +++ b/src/modules/music-control/ui.c @@ -2,6 +2,19 @@ extern Player music_player_players[]; +static void +_pos_update(E_Music_Control_Instance *inst) +{ + Edje_Message_Float_Set *msg; + + if (!inst->popup) return; + msg = alloca(sizeof(Edje_Message_Float_Set) + (2 * sizeof(double))); + msg->count = 2; + msg->val[0] = inst->ctxt->position; + msg->val[1] = inst->ctxt->meta_length; + edje_object_message_send(inst->content_popup, EDJE_MESSAGE_FLOAT_SET, 1, msg); +} + static void _play_state_update(E_Music_Control_Instance *inst, Eina_Bool without_delay) { @@ -16,8 +29,14 @@ _play_state_update(E_Music_Control_Instance *inst, Eina_Bool without_delay) edje_object_signal_emit(inst->content_popup, "btn,state,image,play,no_delay", "play"); else edje_object_signal_emit(inst->content_popup, "btn,state,image,play", "play"); + if (inst->ctxt->loop) + edje_object_signal_emit(inst->content_popup, "loop,state,on", "play"); + else + edje_object_signal_emit(inst->content_popup, "loop,state,off", "play"); + _pos_update(inst); } + void music_control_state_update_all(E_Music_Control_Module_Context *ctxt) { @@ -25,7 +44,21 @@ music_control_state_update_all(E_Music_Control_Module_Context *ctxt) Eina_List *list; EINA_LIST_FOREACH(ctxt->instances, list, inst) - _play_state_update(inst, EINA_FALSE); + { + _play_state_update(inst, EINA_FALSE); + } +} + +void +music_control_pos_update(E_Music_Control_Module_Context *ctxt) +{ + E_Music_Control_Instance *inst; + Eina_List *list; + + EINA_LIST_FOREACH(ctxt->instances, list, inst) + { + _pos_update(inst); + } } static void @@ -146,6 +179,7 @@ _popup_new(E_Music_Control_Instance *inst) _player_name_update(inst); _play_state_update(inst, EINA_TRUE); _metadata_update(inst); + _pos_update(inst); e_comp_object_util_autoclose(inst->popup->comp_object, _popup_autoclose_cb, NULL, inst); e_gadcon_popup_show(inst->popup);