mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-11 13:30:02 -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
|
|
@ -112,7 +112,7 @@ pa_channel_map* pa_channel_map_init_stereo(pa_channel_map *m) {
|
|||
return m;
|
||||
}
|
||||
|
||||
pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels) {
|
||||
pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, pa_channel_map_def_t def) {
|
||||
assert(m);
|
||||
assert(channels > 0);
|
||||
assert(channels <= PA_CHANNELS_MAX);
|
||||
|
|
@ -121,46 +121,99 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels) {
|
|||
|
||||
m->channels = channels;
|
||||
|
||||
/* This is somewhat compatible with RFC3551 */
|
||||
|
||||
switch (channels) {
|
||||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
case 6:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
m->map[3] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
m->map[4] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
m->map[5] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
switch (def) {
|
||||
case PA_CHANNEL_MAP_AIFF:
|
||||
|
||||
case 5:
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
m->map[3] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[4] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
/* This is somewhat compatible with RFC3551 */
|
||||
|
||||
case 2:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
return m;
|
||||
switch (channels) {
|
||||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
case 6:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
m->map[3] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
m->map[4] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
m->map[5] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
|
||||
case 5:
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
m->map[3] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[4] = 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;
|
||||
|
||||
case 3:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[2] = PA_CHANNEL_POSITION_CENTER;
|
||||
return m;
|
||||
|
||||
case 4:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_CENTER;
|
||||
m->map[2] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
case 3:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[2] = PA_CHANNEL_POSITION_CENTER;
|
||||
return m;
|
||||
case PA_CHANNEL_MAP_ALSA:
|
||||
|
||||
case 4:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_CENTER;
|
||||
m->map[2] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
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;
|
||||
}
|
||||
|
||||
case PA_CHANNEL_MAP_AUX: {
|
||||
unsigned i;
|
||||
|
||||
if (channels >= PA_CHANNELS_MAX)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < channels; i++)
|
||||
m->map[i] = PA_CHANNEL_POSITION_AUX0 + i;
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,6 +120,15 @@ typedef enum pa_channel_position {
|
|||
PA_CHANNEL_POSITION_MAX
|
||||
} pa_channel_position_t;
|
||||
|
||||
/** A list of channel mapping definitions for pa_channel_map_init_auto() */
|
||||
typedef enum pa_channel_map_def {
|
||||
PA_CHANNEL_MAP_AIFF, /**< The mapping from RFC3551, which is based on AIFF-C */
|
||||
PA_CHANNEL_MAP_ALSA, /**< The default mapping used by ALSA */
|
||||
PA_CHANNEL_MAP_AUX, /**< Only aux channels */
|
||||
|
||||
PA_CHANNEL_MAP_DEFAULT = PA_CHANNEL_MAP_AIFF /**< The default channel map */
|
||||
} pa_channel_map_def_t;
|
||||
|
||||
/** A channel map which can be used to attach labels to specific
|
||||
* channels of a stream. These values are relevant for conversion and
|
||||
* mixing of streams */
|
||||
|
|
@ -138,9 +147,8 @@ pa_channel_map* pa_channel_map_init_mono(pa_channel_map *m);
|
|||
pa_channel_map* pa_channel_map_init_stereo(pa_channel_map *m);
|
||||
|
||||
/** Initialize the specified channel map for the specified number
|
||||
* of channels using default labels and return a pointer to it.
|
||||
* Uses the mapping from RFC3551, which is based on AIFF-C. */
|
||||
pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels);
|
||||
* of channels using default labels and return a pointer to it. */
|
||||
pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, pa_channel_map_def_t def);
|
||||
|
||||
/** Return a text label for the specified channel position */
|
||||
const char* pa_channel_position_to_string(pa_channel_position_t pos);
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ pa_stream *pa_stream_new(pa_context *c, const char *name, const pa_sample_spec *
|
|||
if (map)
|
||||
s->channel_map = *map;
|
||||
else
|
||||
pa_channel_map_init_auto(&s->channel_map, ss->channels);
|
||||
pa_channel_map_init_auto(&s->channel_map, ss->channels, PA_CHANNEL_MAP_DEFAULT);
|
||||
|
||||
s->channel = 0;
|
||||
s->channel_valid = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue