mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 18:21:04 +00:00
osxaudio: try to fix up according to Sebastian's comments
This commit is contained in:
parent
ab64837bf2
commit
09e980d2c9
2 changed files with 28 additions and 29 deletions
|
@ -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,19 +617,12 @@ 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);
|
|
||||||
gst_structure_remove_fields (out_s, "channels", "channel-mask", NULL);
|
|
||||||
gst_structure_set (out_s, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL);
|
|
||||||
gst_caps_append_structure (caps, out_s);
|
|
||||||
}
|
}
|
||||||
|
out_s = gst_structure_copy (in_s);
|
||||||
|
gst_structure_remove_fields (out_s, "channels", "channel-mask", 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (osxsink->cached_caps) {
|
if (osxsink->cached_caps) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue