use default alsa channel map for alsa devices

git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@851 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
Lennart Poettering 2006-05-13 20:29:32 +00:00
parent afdec0532f
commit b6812029ba
4 changed files with 74 additions and 2 deletions

View file

@ -340,3 +340,47 @@ snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char *name) {
return elem; return elem;
} }
pa_channel_map* pa_alsa_channel_map_init_auto(pa_channel_map *m, unsigned channels) {
assert(m);
assert(channels > 0);
assert(channels <= PA_CHANNELS_MAX);
pa_channel_map_init(m);
m->channels = channels;
/* The standard ALSA channel order */
switch (channels) {
case 1:
m->map[0] = PA_CHANNEL_POSITION_MONO;
return m;
case 8:
m->map[6] = PA_CHANNEL_POSITION_SIDE_LEFT;
m->map[7] = PA_CHANNEL_POSITION_SIDE_RIGHT;
/* Fall through */
case 6:
m->map[5] = PA_CHANNEL_POSITION_LFE;
/* Fall through */
case 5:
m->map[4] = PA_CHANNEL_POSITION_FRONT_CENTER;
/* Fall through */
case 4:
m->map[2] = PA_CHANNEL_POSITION_REAR_LEFT;
m->map[3] = PA_CHANNEL_POSITION_REAR_RIGHT;
/* Fall through */
case 2:
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
return m;
default:
return NULL;
}
}

View file

@ -27,6 +27,8 @@
#include <polyp/sample.h> #include <polyp/sample.h>
#include <polyp/mainloop-api.h> #include <polyp/mainloop-api.h>
#include <polyp/channelmap.h>
struct pa_alsa_fdlist; struct pa_alsa_fdlist;
struct pa_alsa_fdlist *pa_alsa_fdlist_new(void); struct pa_alsa_fdlist *pa_alsa_fdlist_new(void);
@ -40,4 +42,6 @@ int pa_alsa_set_hw_params(snd_pcm_t *pcm_handle, const pa_sample_spec *ss, uint3
int pa_alsa_prepare_mixer(snd_mixer_t *mixer, const char *dev); int pa_alsa_prepare_mixer(snd_mixer_t *mixer, const char *dev);
snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char *name); snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char *name);
pa_channel_map* pa_alsa_channel_map_init_auto(pa_channel_map *m, unsigned channels);
#endif #endif

View file

@ -324,10 +324,22 @@ int pa__init(pa_core *c, pa_module*m) {
} }
ss = c->default_sample_spec; ss = c->default_sample_spec;
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) { if (pa_modargs_get_sample_spec(ma, &ss) < 0) {
pa_log(__FILE__": failed to parse sample specification"); pa_log(__FILE__": failed to parse sample specification");
goto fail; goto fail;
} }
pa_alsa_channel_map_init_auto(&map, ss.channels);
if ((pa_modargs_get_channel_map(ma, &map) < 0)) {
pa_log(__FILE__": invalid channel map.");
goto fail;
}
if (ss.channels != map.channels) {
pa_log(__FILE__": channel map and sample specification don't match.");
goto fail;
}
frame_size = pa_frame_size(&ss); frame_size = pa_frame_size(&ss);
periods = 8; periods = 8;

View file

@ -312,10 +312,22 @@ int pa__init(pa_core *c, pa_module*m) {
} }
ss = c->default_sample_spec; ss = c->default_sample_spec;
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) { if (pa_modargs_get_sample_spec(ma, &ss) < 0) {
pa_log(__FILE__": failed to parse sample specification"); pa_log(__FILE__": failed to parse sample specification");
goto fail; goto fail;
} }
pa_alsa_channel_map_init_auto(&map, ss.channels);
if ((pa_modargs_get_channel_map(ma, &map) < 0)) {
pa_log(__FILE__": invalid channel map.");
goto fail;
}
if (ss.channels != map.channels) {
pa_log(__FILE__": channel map and sample specification don't match.");
goto fail;
}
frame_size = pa_frame_size(&ss); frame_size = pa_frame_size(&ss);
periods = 12; periods = 12;