alsa_detect_channels_mapping (GstObject * obj, snd_pcm_t * handle,
GstAudioRingBufferSpec * spec, guint channels, GstAudioRingBuffer * buf)
{
- if (spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW && channels < 9) {
- snd_pcm_chmap_t *chmap = snd_pcm_get_chmap (handle);
- if (chmap && chmap->channels == channels) {
- GstAudioChannelPosition pos[8];
- if (alsa_chmap_to_channel_positions (chmap, pos))
- gst_audio_ring_buffer_set_channel_positions (buf, pos);
+ snd_pcm_chmap_t *chmap;
+ GstAudioChannelPosition pos[8];
+
+ if (spec->type != GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW || channels >= 9)
+ return;
+
+ chmap = snd_pcm_get_chmap (handle);
+ if (!chmap) {
+ GST_LOG_OBJECT (obj, "ALSA driver does not implement channels mapping API");
+ return;
+ }
+
+ if (chmap->channels != channels) {
+ GST_LOG_OBJECT (obj,
+ "got channels mapping for %u channels but stream has %u channels; ignoring",
+ chmap->channels, channels);
+ goto out;
+ }
+
+ if (alsa_chmap_to_channel_positions (chmap, pos)) {
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ gchar *tmp = gst_audio_channel_positions_to_string (pos, channels);
+
+ GST_LOG_OBJECT (obj, "got channels mapping %s", tmp);
+ g_free (tmp);
}
- free (chmap);
+#endif /* GST_DISABLE_GST_DEBUG */
+
+ gst_audio_ring_buffer_set_channel_positions (buf, pos);
+ } else {
+ GST_LOG_OBJECT (obj, "failed to convert ALSA channels mapping");
}
+
+out:
+ free (chmap);
}
#endif /* SND_CHMAP_API_VERSION */