raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=246d28d3bf0e99bbeb6ffbfcb2b974e1d8d364c4

commit 246d28d3bf0e99bbeb6ffbfcb2b974e1d8d364c4
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sat Jan 9 04:00:38 2021 +0000

    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);

-- 


Reply via email to