forked from enlightenment/enlightenment
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.
This commit is contained in:
parent
b08ad06ede
commit
246d28d3bf
|
@ -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++)
|
for (i = 0; i < eina_value_array_count(array); i++)
|
||||||
{
|
{
|
||||||
const char *key = NULL, *str_val;
|
const char *key = NULL, *str_val;
|
||||||
|
long long llval;
|
||||||
char *str_markup;
|
char *str_markup;
|
||||||
Eina_Value st, subst;
|
Eina_Value st, subst;
|
||||||
Efreet_Uri *uri;
|
Efreet_Uri *uri;
|
||||||
|
@ -318,8 +319,17 @@ parse_metadata(E_Music_Control_Module_Context *ctxt, Eina_Value *array)
|
||||||
}
|
}
|
||||||
eina_value_flush(&subst);
|
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:
|
// FIXME: to handle in future:
|
||||||
// mpris:length - int64
|
|
||||||
// xesam:url - s
|
// xesam:url - s
|
||||||
}
|
}
|
||||||
eina_value_flush(&st);
|
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;
|
else ctxt->playing = EINA_FALSE;
|
||||||
music_control_state_update_all(ctxt);
|
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"))
|
else if (!strcmp(event->name, "Metadata"))
|
||||||
{
|
{
|
||||||
parse_metadata(ctxt, (Eina_Value*)event->value);
|
parse_metadata(ctxt, (Eina_Value*)event->value);
|
||||||
music_control_metadata_update_all(ctxt);
|
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);
|
static void _bus_list(E_Music_Control_Module_Context *ctxt);
|
||||||
|
|
|
@ -23,6 +23,9 @@ typedef struct _E_Music_Control_Module_Context
|
||||||
Eina_Stringshare *meta_title;
|
Eina_Stringshare *meta_title;
|
||||||
Eina_Stringshare *meta_cover;
|
Eina_Stringshare *meta_cover;
|
||||||
Eina_Stringshare *meta_cover_prev;
|
Eina_Stringshare *meta_cover_prev;
|
||||||
|
double meta_length;
|
||||||
|
double position;
|
||||||
|
Eina_Bool loop;
|
||||||
Eldbus_Proxy *mrpis2;
|
Eldbus_Proxy *mrpis2;
|
||||||
Eldbus_Proxy *mpris2_player;
|
Eldbus_Proxy *mpris2_player;
|
||||||
E_Config_DD *conf_edd;
|
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);
|
const char *music_control_edj_path_get(void);
|
||||||
void music_control_popup_del(E_Music_Control_Instance *inst);
|
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_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);
|
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);
|
Eina_Bool music_control_dbus_init(E_Music_Control_Module_Context *ctxt, const char *bus);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,19 @@
|
||||||
|
|
||||||
extern Player music_player_players[];
|
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
|
static void
|
||||||
_play_state_update(E_Music_Control_Instance *inst, Eina_Bool without_delay)
|
_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");
|
edje_object_signal_emit(inst->content_popup, "btn,state,image,play,no_delay", "play");
|
||||||
else
|
else
|
||||||
edje_object_signal_emit(inst->content_popup, "btn,state,image,play", "play");
|
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
|
void
|
||||||
music_control_state_update_all(E_Music_Control_Module_Context *ctxt)
|
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 *list;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(ctxt->instances, list, inst)
|
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
|
static void
|
||||||
|
@ -146,6 +179,7 @@ _popup_new(E_Music_Control_Instance *inst)
|
||||||
_player_name_update(inst);
|
_player_name_update(inst);
|
||||||
_play_state_update(inst, EINA_TRUE);
|
_play_state_update(inst, EINA_TRUE);
|
||||||
_metadata_update(inst);
|
_metadata_update(inst);
|
||||||
|
_pos_update(inst);
|
||||||
e_comp_object_util_autoclose(inst->popup->comp_object,
|
e_comp_object_util_autoclose(inst->popup->comp_object,
|
||||||
_popup_autoclose_cb, NULL, inst);
|
_popup_autoclose_cb, NULL, inst);
|
||||||
e_gadcon_popup_show(inst->popup);
|
e_gadcon_popup_show(inst->popup);
|
||||||
|
|
Loading…
Reference in New Issue