summaryrefslogtreecommitdiffstats
path: root/src/polyp
diff options
context:
space:
mode:
Diffstat (limited to 'src/polyp')
-rw-r--r--src/polyp/channelmap.c125
-rw-r--r--src/polyp/channelmap.h14
-rw-r--r--src/polyp/stream.c2
3 files changed, 101 insertions, 40 deletions
diff --git a/src/polyp/channelmap.c b/src/polyp/channelmap.c
index 794711ae..8d16f7b3 100644
--- a/src/polyp/channelmap.c
+++ b/src/polyp/channelmap.c
@@ -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:
+
+ 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 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;
+ 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;
}
diff --git a/src/polyp/channelmap.h b/src/polyp/channelmap.h
index 0fd1e593..8270a5b3 100644
--- a/src/polyp/channelmap.h
+++ b/src/polyp/channelmap.h
@@ -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);
diff --git a/src/polyp/stream.c b/src/polyp/stream.c
index bccdebe5..b2711ce0 100644
--- a/src/polyp/stream.c
+++ b/src/polyp/stream.c
@@ -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;