summaryrefslogtreecommitdiffstats
path: root/ext/pulse/pulseutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pulse/pulseutil.c')
-rw-r--r--ext/pulse/pulseutil.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/ext/pulse/pulseutil.c b/ext/pulse/pulseutil.c
index 518bce2f..62dbc5b0 100644
--- a/ext/pulse/pulseutil.c
+++ b/ext/pulse/pulseutil.c
@@ -45,6 +45,30 @@ static const pa_channel_position_t gst_pos_to_pa[GST_AUDIO_CHANNEL_POSITION_NUM]
[GST_AUDIO_CHANNEL_POSITION_NONE] = PA_CHANNEL_POSITION_INVALID
};
+/* All index are increased by one because PA_CHANNEL_POSITION_INVALID == -1 */
+static const GstAudioChannelPosition
+ pa_to_gst_pos[GST_AUDIO_CHANNEL_POSITION_NUM]
+ = {
+ [PA_CHANNEL_POSITION_MONO + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO,
+ [PA_CHANNEL_POSITION_FRONT_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
+ [PA_CHANNEL_POSITION_FRONT_RIGHT + 1] =
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
+ [PA_CHANNEL_POSITION_REAR_CENTER + 1] =
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ [PA_CHANNEL_POSITION_REAR_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ [PA_CHANNEL_POSITION_REAR_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
+ [PA_CHANNEL_POSITION_LFE + 1] = GST_AUDIO_CHANNEL_POSITION_LFE,
+ [PA_CHANNEL_POSITION_FRONT_CENTER + 1] =
+ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+ [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER + 1] =
+ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
+ [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER + 1] =
+ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
+ [PA_CHANNEL_POSITION_SIDE_LEFT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ [PA_CHANNEL_POSITION_SIDE_RIGHT + 1] = GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT,
+ [PA_CHANNEL_POSITION_INVALID + 1] = GST_AUDIO_CHANNEL_POSITION_NONE,
+};
+
gboolean
gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss)
{
@@ -95,7 +119,8 @@ gst_pulse_client_name (void)
}
pa_channel_map *
-gst_pulse_gst_to_channel_map (pa_channel_map * map, GstRingBufferSpec * spec)
+gst_pulse_gst_to_channel_map (pa_channel_map * map,
+ const GstRingBufferSpec * spec)
{
int i;
@@ -136,3 +161,39 @@ gst_pulse_gst_to_channel_map (pa_channel_map * map, GstRingBufferSpec * spec)
return map;
}
+
+GstRingBufferSpec *
+gst_pulse_channel_map_to_gst (const pa_channel_map * map,
+ GstRingBufferSpec * spec)
+{
+ int i;
+ GstAudioChannelPosition *pos;
+ gboolean invalid = FALSE;
+
+ g_return_val_if_fail (map->channels == spec->channels, NULL);
+
+ pos = g_new0 (GstAudioChannelPosition, spec->channels + 1);
+
+ for (i = 0; i < spec->channels; i++) {
+ if (map->map[i] == PA_CHANNEL_POSITION_INVALID) {
+ invalid = TRUE;
+ break;
+ } else if (map->map[i] < GST_AUDIO_CHANNEL_POSITION_NUM) {
+ pos[i] = pa_to_gst_pos[map->map[i] + 1];
+ } else {
+ invalid = TRUE;
+ break;
+ }
+ }
+
+ if (invalid) {
+ for (i = 0; i < spec->channels; i++)
+ pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
+ }
+
+ gst_audio_set_channel_positions (gst_caps_get_structure (spec->caps, 0), pos);
+
+ g_free (pos);
+
+ return spec;
+}