From 4ab89b397e32c041fd8174071a7686b8547643d0 Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Wed, 20 Aug 2008 17:17:55 +0000 Subject: ext/pulse/: If downstream provides no channel layout and >2 channels should be used use the default layout that pulse... Original commit message from CVS: * ext/pulse/pulsesrc.c: (gst_pulsesrc_class_init), (gst_pulsesrc_create_stream), (gst_pulsesrc_negotiate), (gst_pulsesrc_prepare): * ext/pulse/pulseutil.c: (gst_pulse_gst_to_channel_map), (gst_pulse_channel_map_to_gst): * ext/pulse/pulseutil.h: If downstream provides no channel layout and >2 channels should be used use the default layout that pulseaudio chooses and also add this layout to the caps. Fixes bug #547258. --- ext/pulse/pulseutil.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) (limited to 'ext/pulse/pulseutil.c') 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; +} -- cgit