mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-07 13:30:03 -05:00
* modify pa_channel_map_init_auto() to take an extra argument specifying the standard to use (ALSA, AIFF, ...)
* add some more validity checks to pa_source_new(),pa_sink_new(),pa_sink_input_new(),pa_source_output_new() git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@888 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
c63cc7bb79
commit
4b6ab291a7
27 changed files with 237 additions and 191 deletions
|
|
@ -340,47 +340,3 @@ snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char *name) {
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,4 @@ 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);
|
||||
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
|
||||
|
|
|
|||
|
|
@ -324,19 +324,8 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec(ma, &ss) < 0) {
|
||||
pa_log(__FILE__": failed to parse sample specification");
|
||||
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.");
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
|
||||
pa_log(__FILE__": failed to parse sample specification and channel map");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -316,22 +316,11 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec(ma, &ss) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
|
||||
pa_log(__FILE__": failed to parse sample specification");
|
||||
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);
|
||||
|
||||
/* Fix latency to 100ms */
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
if (ss.channels == master_sink->sample_spec.channels)
|
||||
map = master_sink->channel_map;
|
||||
else
|
||||
pa_channel_map_init_auto(&map, ss.channels);
|
||||
pa_channel_map_init_auto(&map, ss.channels, PA_CHANNEL_MAP_DEFAULT);
|
||||
|
||||
if ((pa_modargs_get_channel_map(ma, &map) < 0)) {
|
||||
pa_log(__FILE__": invalid channel map.");
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
pa_channel_map_init_auto(&map, channels);
|
||||
pa_channel_map_init_auto(&map, channels, PA_CHANNEL_MAP_ALSA);
|
||||
if (pa_modargs_get_channel_map(ma, &map) < 0 || map.channels != channels) {
|
||||
pa_log(__FILE__": failed to parse channel_map= argument.");
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
pa_channel_map_init_auto(&map, channels);
|
||||
pa_channel_map_init_auto(&map, channels, PA_CHANNEL_MAP_ALSA);
|
||||
if (pa_modargs_get_channel_map(ma, &map) < 0 || map.channels != channels) {
|
||||
pa_log(__FILE__": failed to parse channel_map= argument.");
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
|
||||
pa_log(__FILE__": invalid sample format specification or channel map.");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
u->sample_spec = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &u->sample_spec, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &u->sample_spec, &map, PA_CHANNEL_MAP_ALSA) < 0) {
|
||||
pa_log(__FILE__": failed to parse sample specification or channel map");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
mode = (playback&&record) ? O_RDWR : (playback ? O_WRONLY : (record ? O_RDONLY : 0));
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
|
||||
pa_log(__FILE__": failed to parse sample specification or channel map");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
|
||||
pa_log(__FILE__": invalid sample format specification");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
|
||||
pa_log(__FILE__": invalid sample format specification or channel map");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -895,7 +895,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
ss = c->default_sample_spec;
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map) < 0) {
|
||||
if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
|
||||
pa_log(__FILE__": invalid sample format specification");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
}
|
||||
|
||||
if (ss.channels != cm.channels)
|
||||
pa_channel_map_init_auto(&cm, ss.channels);
|
||||
pa_channel_map_init_auto(&cm, ss.channels, PA_CHANNEL_MAP_AIFF);
|
||||
|
||||
payload = pa_rtp_payload_from_sample_spec(&ss);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue