alsa: factor out alsa_detect_channels_mapping()
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 21 Mar 2016 09:09:10 +0000 (05:09 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 12 Apr 2016 18:34:13 +0000 (14:34 -0400)
This code was duplicated in alsasrc and alsasink.

https://bugzilla.gnome.org/show_bug.cgi?id=763985

ext/alsa/gstalsa.c
ext/alsa/gstalsa.h
ext/alsa/gstalsasink.c
ext/alsa/gstalsasrc.c

index 9d2a973..ea4b74b 100644 (file)
@@ -761,4 +761,19 @@ alsa_chmap_to_channel_positions (const snd_pcm_chmap_t * chmap,
   }
   return TRUE;
 }
+
+void
+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);
+    }
+    free (chmap);
+  }
+}
 #endif /* SND_CHMAP_API_VERSION */
index 3c3d2d6..56fa075 100644 (file)
@@ -74,6 +74,12 @@ extern const GstAudioChannelPosition alsa_position[][8];
 #ifdef SND_CHMAP_API_VERSION
 gboolean alsa_chmap_to_channel_positions (const snd_pcm_chmap_t *chmap,
                                           GstAudioChannelPosition *pos);
+
+void alsa_detect_channels_mapping (GstObject * obj,
+                                   snd_pcm_t * handle,
+                                   GstAudioRingBufferSpec * spec,
+                                   guint channels,
+                                   GstAudioRingBuffer * buf);
 #endif
 
 #endif /* __GST_ALSA_H__ */
index 2d81f52..86606f7 100644 (file)
@@ -909,16 +909,8 @@ gst_alsasink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec)
   }
 
 #ifdef SND_CHMAP_API_VERSION
-  if (spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW && alsa->channels < 9) {
-    snd_pcm_chmap_t *chmap = snd_pcm_get_chmap (alsa->handle);
-    if (chmap && chmap->channels == alsa->channels) {
-      GstAudioChannelPosition pos[8];
-      if (alsa_chmap_to_channel_positions (chmap, pos))
-        gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_BASE_SINK
-            (alsa)->ringbuffer, pos);
-    }
-    free (chmap);
-  }
+  alsa_detect_channels_mapping (GST_OBJECT (alsa), alsa->handle, spec,
+      alsa->channels, GST_AUDIO_BASE_SINK (alsa)->ringbuffer);
 #endif /* SND_CHMAP_API_VERSION */
 
   return TRUE;
index 8cf148e..74b8bf9 100644 (file)
@@ -785,16 +785,8 @@ gst_alsasrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
   }
 
 #ifdef SND_CHMAP_API_VERSION
-  if (spec->type == GST_AUDIO_RING_BUFFER_FORMAT_TYPE_RAW && alsa->channels < 9) {
-    snd_pcm_chmap_t *chmap = snd_pcm_get_chmap (alsa->handle);
-    if (chmap && chmap->channels == alsa->channels) {
-      GstAudioChannelPosition pos[8];
-      if (alsa_chmap_to_channel_positions (chmap, pos))
-        gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_BASE_SRC
-            (alsa)->ringbuffer, pos);
-    }
-    free (chmap);
-  }
+  alsa_detect_channels_mapping (GST_OBJECT (alsa), alsa->handle, spec,
+      alsa->channels, GST_AUDIO_BASE_SRC (alsa)->ringbuffer);
 #endif /* SND_CHMAP_API_VERSION */
 
   return TRUE;