Commit 380f145b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Rationalize ALSA device choices

parent 2c142482
...@@ -54,7 +54,7 @@ static int Open (vlc_object_t *); ...@@ -54,7 +54,7 @@ static int Open (vlc_object_t *);
static void Close (vlc_object_t *); static void Close (vlc_object_t *);
static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name, static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
vlc_value_t newval, vlc_value_t oldval, void *p_unused ); vlc_value_t newval, vlc_value_t oldval, void *p_unused );
static void GetDevices( vlc_object_t *, module_config_t * ); static void GetDevices (vlc_object_t *, module_config_t *, const char *);
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
...@@ -144,7 +144,7 @@ static void DumpDeviceStatus (vlc_object_t *obj, snd_pcm_t *pcm) ...@@ -144,7 +144,7 @@ static void DumpDeviceStatus (vlc_object_t *obj, snd_pcm_t *pcm)
/** /**
* Initializes list of devices. * Initializes list of devices.
*/ */
static void Probe (vlc_object_t *obj) static void Probe (vlc_object_t *obj, const char *dev)
{ {
/* Due to design bug in audio output core, this hack is required: */ /* Due to design bug in audio output core, this hack is required: */
if (var_Type (obj, "audio-device") == 0) if (var_Type (obj, "audio-device") == 0)
...@@ -156,7 +156,7 @@ static void Probe (vlc_object_t *obj) ...@@ -156,7 +156,7 @@ static void Probe (vlc_object_t *obj)
text.psz_string = _("Audio Device"); text.psz_string = _("Audio Device");
var_Change (obj, "audio-device", VLC_VAR_SETTEXT, &text, NULL); var_Change (obj, "audio-device", VLC_VAR_SETTEXT, &text, NULL);
GetDevices (obj, NULL); GetDevices (obj, NULL, dev);
} }
var_AddCallback (obj, "audio-device", aout_ChannelsRestart, NULL); var_AddCallback (obj, "audio-device", aout_ChannelsRestart, NULL);
var_TriggerCallback (obj, "intf-change"); var_TriggerCallback (obj, "intf-change");
...@@ -342,7 +342,6 @@ static int Open (vlc_object_t *obj) ...@@ -342,7 +342,6 @@ static int Open (vlc_object_t *obj)
/* Print some potentially useful debug */ /* Print some potentially useful debug */
msg_Dbg (aout, "using ALSA device: %s", device); msg_Dbg (aout, "using ALSA device: %s", device);
free (device);
DumpDevice (VLC_OBJECT(aout), pcm); DumpDevice (VLC_OBJECT(aout), pcm);
/* Setup */ /* Setup */
...@@ -575,11 +574,13 @@ static int Open (vlc_object_t *obj) ...@@ -575,11 +574,13 @@ static int Open (vlc_object_t *obj)
} }
aout->pf_flush = Flush; aout->pf_flush = Flush;
Probe (obj); Probe (obj, device);
free (device);
return 0; return 0;
error: error:
snd_pcm_close (pcm); snd_pcm_close (pcm);
free (device);
free (sys); free (sys);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -733,7 +734,7 @@ static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name, ...@@ -733,7 +734,7 @@ static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
} }
p_item->i_list = 1; p_item->i_list = 1;
GetDevices( p_this, p_item ); GetDevices (p_this, p_item, "default");
/* Signal change to the interface */ /* Signal change to the interface */
p_item->b_dirty = true; p_item->b_dirty = true;
...@@ -742,10 +743,12 @@ static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name, ...@@ -742,10 +743,12 @@ static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
} }
static void GetDevices (vlc_object_t *obj, module_config_t *item) static void GetDevices (vlc_object_t *obj, module_config_t *item,
const char *prefs_dev)
{ {
void **hints; void **hints;
bool hinted_default = false; bool hinted_default = false;
bool hinted_prefs = !strcmp (prefs_dev, "default");
msg_Dbg(obj, "Available ALSA PCM devices:"); msg_Dbg(obj, "Available ALSA PCM devices:");
...@@ -755,16 +758,10 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item) ...@@ -755,16 +758,10 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item)
for (size_t i = 0; hints[i] != NULL; i++) for (size_t i = 0; hints[i] != NULL; i++)
{ {
void *hint = hints[i]; void *hint = hints[i];
char *dev;
char *name = snd_device_name_get_hint(hint, "NAME"); char *name = snd_device_name_get_hint(hint, "NAME");
if (unlikely(name == NULL)) if (unlikely(name == NULL))
continue; continue;
if (unlikely(asprintf (&dev, "plug:'%s'", name) == -1))
{
free(name);
continue;
}
char *desc = snd_device_name_get_hint(hint, "DESC"); char *desc = snd_device_name_get_hint(hint, "DESC");
if (desc != NULL) if (desc != NULL)
...@@ -774,6 +771,8 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item) ...@@ -774,6 +771,8 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item)
if (!strcmp (name, "default")) if (!strcmp (name, "default"))
hinted_default = true; hinted_default = true;
if (!strcmp (name, prefs_dev))
hinted_prefs = true;
if (item != NULL) if (item != NULL)
{ {
...@@ -781,7 +780,7 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item) ...@@ -781,7 +780,7 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item)
(item->i_list + 2) * sizeof(char *)); (item->i_list + 2) * sizeof(char *));
item->ppsz_list_text = xrealloc(item->ppsz_list_text, item->ppsz_list_text = xrealloc(item->ppsz_list_text,
(item->i_list + 2) * sizeof(char *)); (item->i_list + 2) * sizeof(char *));
item->ppsz_list[item->i_list] = dev; item->ppsz_list[item->i_list] = name;
if (desc == NULL) if (desc == NULL)
desc = strdup(name); desc = strdup(name);
item->ppsz_list_text[item->i_list] = desc; item->ppsz_list_text[item->i_list] = desc;
...@@ -791,11 +790,10 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item) ...@@ -791,11 +790,10 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item)
{ {
vlc_value_t val, text; vlc_value_t val, text;
val.psz_string = dev; val.psz_string = name;
text.psz_string = desc; text.psz_string = desc;
var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text); var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text);
free(desc); free(desc);
free(dev);
free(name); free(name);
} }
} }
...@@ -818,14 +816,12 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item) ...@@ -818,14 +816,12 @@ static void GetDevices (vlc_object_t *obj, module_config_t *item)
var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text); var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text);
} }
val.psz_string = var_InheritString (obj, "alsa-audio-device"); val.psz_string = (char *)prefs_dev;
if (likely(val.psz_string != NULL) if (!hinted_prefs)
&& strcmp (val.psz_string, "default"))
{ {
text.psz_string = (char *)N_("VLC preferences"); text.psz_string = (char *)N_("VLC preferences");
var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text); var_Change(obj, "audio-device", VLC_VAR_ADDCHOICE, &val, &text);
} }
var_Change(obj, "audio-device", VLC_VAR_SETVALUE, &val, NULL); var_Change(obj, "audio-device", VLC_VAR_SETVALUE, &val, NULL);
free (val.psz_string);
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment