osxaudio: try to fix up according to Sebastian's comments

This commit is contained in:
Takashi Nakajima 2013-04-10 01:21:49 +09:00 committed by Sebastian Dröge
parent ab64837bf2
commit 09e980d2c9
2 changed files with 28 additions and 29 deletions

View file

@ -159,8 +159,7 @@ gst_osx_audio_sink_do_init (GType type)
#define gst_osx_audio_sink_parent_class parent_class #define gst_osx_audio_sink_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstOsxAudioSink, gst_osx_audio_sink, G_DEFINE_TYPE_WITH_CODE (GstOsxAudioSink, gst_osx_audio_sink,
GST_TYPE_AUDIO_BASE_SINK, GST_TYPE_AUDIO_BASE_SINK, gst_osx_audio_sink_do_init (g_define_type_id));
gst_osx_audio_sink_do_init (GST_TYPE_AUDIO_BASE_SINK));
static void static void
gst_osx_audio_sink_class_init (GstOsxAudioSinkClass * klass) gst_osx_audio_sink_class_init (GstOsxAudioSinkClass * klass)
@ -431,6 +430,11 @@ gst_osx_audio_sink_create_ringbuffer (GstAudioBaseSink * sink)
{ {
GstOsxAudioSink *osxsink; GstOsxAudioSink *osxsink;
GstOsxAudioRingBuffer *ringbuffer; GstOsxAudioRingBuffer *ringbuffer;
GstStructure *s;
GstCaps *caps;
gint channels;
guint64 channel_mask;
GstAudioChannelPosition positions[9];
osxsink = GST_OSX_AUDIO_SINK (sink); osxsink = GST_OSX_AUDIO_SINK (sink);
@ -452,6 +456,14 @@ gst_osx_audio_sink_create_ringbuffer (GstAudioBaseSink * sink)
ringbuffer->core_audio->device_id = osxsink->device_id; ringbuffer->core_audio->device_id = osxsink->device_id;
ringbuffer->core_audio->is_src = FALSE; ringbuffer->core_audio->is_src = FALSE;
caps = osxsink->cached_caps;
s = gst_caps_get_structure (caps, 0);
gst_structure_get_int (s, "channels", &channels);
gst_structure_get (s, "channel-mask", GST_TYPE_BITMASK, &channel_mask, NULL);
gst_audio_channel_positions_from_mask (channels, channel_mask, positions);
gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_RING_BUFFER
(ringbuffer), positions);
return GST_AUDIO_RING_BUFFER (ringbuffer); return GST_AUDIO_RING_BUFFER (ringbuffer);
} }
@ -526,12 +538,11 @@ static gboolean
gst_osx_audio_sink_allowed_caps (GstOsxAudioSink * osxsink) gst_osx_audio_sink_allowed_caps (GstOsxAudioSink * osxsink)
{ {
gint i, max_channels = 0; gint i, max_channels = 0;
gboolean spdif_allowed, use_positions = FALSE; gboolean spdif_allowed;
AudioChannelLayout *layout; AudioChannelLayout *layout;
GstElementClass *element_class; GstElementClass *element_class;
GstPadTemplate *pad_template; GstPadTemplate *pad_template;
GstCaps *caps, *in_caps; GstCaps *caps, *in_caps;
guint64 channel_mask = 0; guint64 channel_mask = 0;
/* First collect info about the HW capabilites and preferences */ /* First collect info about the HW capabilites and preferences */
@ -543,16 +554,7 @@ gst_osx_audio_sink_allowed_caps (GstOsxAudioSink * osxsink)
(unsigned) osxsink->device_id, spdif_allowed); (unsigned) osxsink->device_id, spdif_allowed);
if (layout) { if (layout) {
max_channels = layout->mNumberChannelDescriptions; max_channels = MIN (layout->mNumberChannelDescriptions, 9);
} else {
GST_WARNING_OBJECT (osxsink, "This driver does not support "
"kAudioDevicePropertyPreferredChannelLayout.");
max_channels = 2;
}
if (max_channels > 2) {
max_channels = MIN (max_channels, 9);
use_positions = TRUE;
for (i = 0; i < max_channels; i++) { for (i = 0; i < max_channels; i++) {
switch (layout->mChannelDescriptions[i].mChannelLabel) { switch (layout->mChannelDescriptions[i].mChannelLabel) {
case kAudioChannelLabel_Left: case kAudioChannelLabel_Left:
@ -585,11 +587,16 @@ gst_osx_audio_sink_allowed_caps (GstOsxAudioSink * osxsink)
default: default:
GST_WARNING_OBJECT (osxsink, "unrecognized channel: %d", GST_WARNING_OBJECT (osxsink, "unrecognized channel: %d",
(int) layout->mChannelDescriptions[i].mChannelLabel); (int) layout->mChannelDescriptions[i].mChannelLabel);
use_positions = FALSE;
max_channels = 2; max_channels = 2;
break; break;
} }
} }
} else {
GST_WARNING_OBJECT (osxsink, "This driver does not support "
"kAudioDevicePropertyPreferredChannelLayout.");
max_channels = 2;
channel_mask |= GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) |
GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT);
} }
g_free (layout); g_free (layout);
@ -610,20 +617,13 @@ gst_osx_audio_sink_allowed_caps (GstOsxAudioSink * osxsink)
if (spdif_allowed) { if (spdif_allowed) {
gst_caps_append_structure (caps, gst_structure_copy (in_s)); gst_caps_append_structure (caps, gst_structure_copy (in_s));
} }
} else {
if (max_channels > 2 && use_positions) {
out_s = gst_structure_copy (in_s);
gst_structure_remove_field (out_s, "channels");
gst_structure_set (out_s, "channels", G_TYPE_INT, max_channels,
"channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
gst_caps_append_structure (caps, out_s);
} }
out_s = gst_structure_copy (in_s); out_s = gst_structure_copy (in_s);
gst_structure_remove_fields (out_s, "channels", "channel-mask", NULL); gst_structure_remove_fields (out_s, "channels", "channel-mask", NULL);
gst_structure_set (out_s, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); gst_structure_set (out_s, "channels", G_TYPE_INT, max_channels,
"channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
gst_caps_append_structure (caps, out_s); gst_caps_append_structure (caps, out_s);
} }
}
if (osxsink->cached_caps) { if (osxsink->cached_caps) {
gst_caps_unref (osxsink->cached_caps); gst_caps_unref (osxsink->cached_caps);

View file

@ -128,8 +128,7 @@ gst_osx_audio_src_do_init (GType type)
} }
G_DEFINE_TYPE_WITH_CODE (GstOsxAudioSrc, gst_osx_audio_src, G_DEFINE_TYPE_WITH_CODE (GstOsxAudioSrc, gst_osx_audio_src,
GST_TYPE_AUDIO_BASE_SRC, GST_TYPE_AUDIO_BASE_SRC, gst_osx_audio_src_do_init (g_define_type_id));
gst_osx_audio_src_do_init (GST_TYPE_AUDIO_BASE_SRC));
static void static void
gst_osx_audio_src_class_init (GstOsxAudioSrcClass * klass) gst_osx_audio_src_class_init (GstOsxAudioSrcClass * klass)