mixer: take advantage of Channel capabilities bitmap

split channels list into 4 groups:
   Playback, Capture, Switch, Boost
nicely disable volume sliders and mute check when appropriate
This commit is contained in:
Jérémy Zurcher 2013-02-28 23:09:58 +01:00
parent b34e7b440d
commit 00681f3ada
3 changed files with 103 additions and 71 deletions

View File

@ -141,23 +141,19 @@ _update_channel_editor_state(E_Mixer_App_Dialog_Data *app, const E_Mixer_Channel
{
struct e_mixer_app_ui_channel_editor *ui = &app->ui.channel_editor;
e_widget_disabled_set(ui->left, 0);
e_widget_disabled_set(ui->right, 0);
e_widget_disabled_set(ui->lock_sliders, 0);
e_widget_slider_value_int_set(ui->left, state.left);
e_widget_slider_value_int_set(ui->right, state.right);
if (e_mod_mixer_mutable_get(app->sys, app->channel_info))
if (!e_mod_mixer_channel_has_no_volume(app->channel_info))
{
e_widget_disabled_set(ui->mute, 0);
e_widget_check_checked_set(ui->mute, state.mute);
}
else
{
e_widget_disabled_set(ui->mute, 1);
e_widget_check_checked_set(ui->mute, 0);
if (e_mod_mixer_channel_is_mono(app->channel_info))
e_widget_slider_value_int_set(ui->left, state.left);
else
{
e_widget_slider_value_int_set(ui->left, state.left);
e_widget_slider_value_int_set(ui->right, state.right);
}
}
if (e_mod_mixer_channel_is_mutable(app->channel_info))
e_widget_check_checked_set(ui->mute, state.mute);
}
static void
@ -180,15 +176,52 @@ _populate_channel_editor(E_Mixer_App_Dialog_Data *app)
e_widget_entry_text_set(ui->channel, app->channel_name);
if (e_mod_mixer_capture_get(app->sys, app->channel_info))
if (e_mod_mixer_channel_is_boost(app->channel_info))
e_widget_entry_text_set(ui->type, _("Boost"));
else if (e_mod_mixer_channel_has_playback(app->channel_info))
e_widget_entry_text_set(ui->type, _("Playback"));
else if (e_mod_mixer_channel_has_capture(app->channel_info))
e_widget_entry_text_set(ui->type, _("Capture"));
else
e_widget_entry_text_set(ui->type, _("Playback"));
e_widget_entry_text_set(ui->type, _("Switch"));
e_mod_mixer_state_get(app->sys, app->channel_info, &state);
_update_channel_editor_state(app, state);
app->lock_sliders = (state.left == state.right);
if (e_mod_mixer_channel_is_mutable(app->channel_info))
{
e_widget_disabled_set(ui->mute, 0);
}
else
{
e_widget_disabled_set(ui->mute, 1);
e_widget_check_checked_set(ui->mute, 0);
}
if (e_mod_mixer_channel_has_no_volume(app->channel_info))
{
app->lock_sliders = 1;
e_widget_slider_value_int_set(ui->left, 0);
e_widget_slider_value_int_set(ui->right, 0);
e_widget_disabled_set(ui->lock_sliders, 1);
e_widget_disabled_set(ui->left, 1);
e_widget_disabled_set(ui->right, 1);
}
else if (e_mod_mixer_channel_is_mono(app->channel_info))
{
app->lock_sliders = 0;
e_widget_slider_value_int_set(ui->right, 0);
e_widget_disabled_set(ui->lock_sliders, 1);
e_widget_disabled_set(ui->left, 0);
e_widget_disabled_set(ui->right, 1);
}
else
{
app->lock_sliders = (state.left == state.right);
e_widget_disabled_set(ui->lock_sliders, 0);
e_widget_disabled_set(ui->left, 0);
e_widget_disabled_set(ui->right, 0);
}
e_widget_check_checked_set(ui->lock_sliders, app->lock_sliders);
}
@ -244,31 +277,23 @@ _populate_channels(E_Mixer_App_Dialog_Data *app)
e_mod_mixer_channel_infos_free(app->channel_infos);
app->channel_infos = e_mod_mixer_channel_infos_get(app->sys);
if (app->channel_infos)
{
E_Mixer_Channel_Info *info = app->channel_infos->data;
if (e_mod_mixer_channel_has_capture(info))
{
e_widget_ilist_header_append(ilist, NULL, _("Input"));
header_input = 1;
i = 1;
}
else
{
e_widget_ilist_header_append(ilist, NULL, _("Output"));
header_input = 0;
i = 1;
}
}
i = 0;
header_input = 0;
for (l = app->channel_infos; l; l = l->next, i++)
{
E_Mixer_Channel_Info *info = l->data;
if ((!header_input) && e_mod_mixer_channel_has_capture(info))
if (header_input != e_mod_mixer_channel_group_get(info))
{
e_widget_ilist_header_append(ilist, NULL, _("Input"));
header_input = 1;
if (e_mod_mixer_channel_is_boost(info))
e_widget_ilist_header_append(ilist, NULL, _("Boost"));
else if (e_mod_mixer_channel_has_playback(info))
e_widget_ilist_header_append(ilist, NULL, _("Playback"));
else if (e_mod_mixer_channel_has_capture(info))
e_widget_ilist_header_append(ilist, NULL, _("Capture"));
else
e_widget_ilist_header_append(ilist, NULL, _("Switch"));
header_input = e_mod_mixer_channel_group_get(info);
i++;
}
@ -529,19 +554,12 @@ _find_channel_by_name(E_Mixer_App_Dialog_Data *app, const char *channel_name)
if (!channel_name)
return 0;
if (app->channel_infos)
{
info = app->channel_infos->data;
header_input = !!e_mod_mixer_channel_has_capture(info);
i = 1;
}
header_input = 0;
EINA_LIST_FOREACH(app->channel_infos, l, info)
{
if ((!header_input) && e_mod_mixer_channel_has_capture(info))
if (header_input != e_mod_mixer_channel_group_get(info))
{
header_input = 1;
header_input = e_mod_mixer_channel_group_get(info);
i++;
}

View File

@ -366,7 +366,7 @@ _mixer_toggle_mute(E_Mixer_Instance *inst, Eina_Bool non_ui)
{
E_Mixer_Channel_State *state;
if (!e_mod_mixer_mutable_get(inst->sys, inst->channel))
if (!e_mod_mixer_channel_is_mutable(inst->channel))
return;
state = &inst->mixer_state;
@ -588,11 +588,12 @@ _mixer_popup_new(E_Mixer_Instance *inst)
state = &inst->mixer_state;
e_mod_mixer_state_get(inst->sys, inst->channel, state);
if ((state->right >= 0) &&
(inst->conf->show_locked || (!inst->conf->lock_sliders)))
colspan = 2;
else
if (e_mod_mixer_channel_has_no_volume(inst->channel) ||
e_mod_mixer_channel_is_mono(inst->channel) ||
(inst->conf->lock_sliders && !inst->conf->show_locked))
colspan = 1;
else
colspan = 2;
inst->popup = e_gadcon_popup_new(inst->gcc);
evas = inst->popup->win->evas;
@ -603,28 +604,38 @@ _mixer_popup_new(E_Mixer_Instance *inst)
e_widget_table_object_append(inst->ui.table, inst->ui.label,
0, 0, colspan, 1, 0, 0, 0, 0);
if (state->left >= 0)
if (colspan==2)
{
inst->ui.left = _mixer_popup_add_slider(
inst, state->left, _mixer_popup_cb_volume_left_change);
inst->ui.left = _mixer_popup_add_slider(inst, state->left,
_mixer_popup_cb_volume_left_change);
e_widget_table_object_append(inst->ui.table, inst->ui.left,
0, 1, 1, 1, 1, 1, 1, 1);
}
else
inst->ui.left = NULL;
if ((state->right >= 0) &&
(inst->conf->show_locked || (!inst->conf->lock_sliders)))
{
inst->ui.right = _mixer_popup_add_slider(
inst, state->right, _mixer_popup_cb_volume_right_change);
inst->ui.right = _mixer_popup_add_slider(inst, state->right,
_mixer_popup_cb_volume_right_change);
e_widget_table_object_append(inst->ui.table, inst->ui.right,
1, 1, 1, 1, 1, 1, 1, 1);
}
else
inst->ui.right = NULL;
{
if (e_mod_mixer_channel_has_no_volume(inst->channel))
{
inst->ui.left = _mixer_popup_add_slider(inst, 0, NULL);
e_widget_table_object_append(inst->ui.table, inst->ui.left,
0, 1, 1, 1, 1, 1, 1, 1);
e_slider_disabled_set(inst->ui.left, 1);
}
else
{
inst->ui.left = _mixer_popup_add_slider(inst, state->left,
_mixer_popup_cb_volume_left_change);
e_widget_table_object_append(inst->ui.table, inst->ui.left,
0, 1, 1, 1, 1, 1, 1, 1);
}
inst->ui.right = NULL;
}
if (e_mod_mixer_mutable_get(inst->sys, inst->channel))
if (e_mod_mixer_channel_is_mutable(inst->channel))
{
inst->ui.mute = e_widget_check_add(evas, _("Mute"), &state->mute);
evas_object_show(inst->ui.mute);

View File

@ -70,12 +70,15 @@ _channel_info_cmp(const void *data_a, const void *data_b)
{
const E_Mixer_Channel_Info *a = data_a, *b = data_b;
if (e_mod_mixer_channel_has_capture(a) < e_mod_mixer_channel_has_capture(b))
return -1;
else if (e_mod_mixer_channel_has_capture(a) > e_mod_mixer_channel_has_capture(b))
if (e_mod_mixer_channel_group_get(a) == e_mod_mixer_channel_group_get(b))
return strcmp(a->name, b->name);
if (e_mod_mixer_channel_is_boost(a))
return 1;
return strcmp(a->name, b->name);
if (e_mod_mixer_channel_is_boost(b))
return -1;
if (e_mod_mixer_channel_group_get(a) < e_mod_mixer_channel_group_get(b))
return 1;
return -1;
}
void e_mod_mixer_channel_info_free(E_Mixer_Channel_Info* info)