mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
osxaudio: Avoid making a duplicate structure in caps for mono/stereo case
For 1ch or 2ch devices, we just need to set the caps to allow both options since CoreAudio will up/downmix appropriately. Also fixes the condition for the 2ch case to be exact, rather than at least 2 channels since the downmix will not take place in the >stereo case.
This commit is contained in:
parent
691ecebe22
commit
8f0f976375
1 changed files with 14 additions and 26 deletions
|
@ -542,6 +542,10 @@ gst_core_audio_get_channel_layout (GstCoreAudio * core_audio, gboolean outer)
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define STEREO_CHANNEL_MASK \
|
||||||
|
(GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) | \
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT))
|
||||||
|
|
||||||
GstCaps *
|
GstCaps *
|
||||||
gst_core_audio_probe_caps (GstCoreAudio * core_audio, GstCaps * in_caps)
|
gst_core_audio_probe_caps (GstCoreAudio * core_audio, GstCaps * in_caps)
|
||||||
{
|
{
|
||||||
|
@ -617,43 +621,27 @@ gst_core_audio_probe_caps (GstCoreAudio * core_audio, GstCaps * in_caps)
|
||||||
gst_structure_remove_field (out_s, "channel-mask");
|
gst_structure_remove_field (out_s, "channel-mask");
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_caps_append_structure (caps, out_s);
|
|
||||||
|
|
||||||
/* Special cases for upmixing and downmixing.
|
/* Special cases for upmixing and downmixing.
|
||||||
* Other than that, the AUs don't upmix or downmix multi-channel audio,
|
* Other than that, the AUs don't upmix or downmix multi-channel audio,
|
||||||
* e.g. if you push 5.1-surround audio to a stereo configuration,
|
* e.g. if you push 5.1-surround audio to a stereo configuration,
|
||||||
* the left and right channels will be played accordingly,
|
* the left and right channels will be played accordingly,
|
||||||
* and the rest will be dropped. */
|
* and the rest will be dropped. */
|
||||||
|
|
||||||
if (channels >= 2 &&
|
if (channels == 1 || (channels == 2 &&
|
||||||
(channel_mask & GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT)) &&
|
(channel_mask == 0 || channel_mask == STEREO_CHANNEL_MASK))) {
|
||||||
(channel_mask & GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT))) {
|
|
||||||
|
|
||||||
/* If have stereo channels, then also offer mono since CoreAudio
|
/* If have stereo channels, then also offer mono since CoreAudio
|
||||||
* upmixes it */
|
* upmixes it. If mono, then also offer stereo since CoreAudio
|
||||||
|
* downmixes to it */
|
||||||
|
|
||||||
out_s = gst_structure_copy (out_s);
|
gst_structure_set (out_s, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL);
|
||||||
|
|
||||||
gst_structure_set (out_s, "channels", G_TYPE_INT, 1, NULL);
|
if (channels == 1)
|
||||||
/* Mono has no channel-mask */
|
gst_structure_set (out_s, "channel-mask", GST_TYPE_BITMASK,
|
||||||
gst_structure_remove_field (out_s, "channel-mask");
|
STEREO_CHANNEL_MASK, NULL);
|
||||||
|
|
||||||
gst_caps_append_structure (caps, out_s);
|
|
||||||
|
|
||||||
} else if (channels == 1 && channel_mask == 0) {
|
|
||||||
|
|
||||||
/* If mono, then also offer stereo since CoreAudio downmixes to it */
|
|
||||||
|
|
||||||
out_s = gst_structure_copy (out_s);
|
|
||||||
|
|
||||||
gst_structure_set (out_s,
|
|
||||||
"channels", G_TYPE_INT, 1,
|
|
||||||
"channel-mask", GST_TYPE_BITMASK,
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) |
|
|
||||||
GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT), NULL);
|
|
||||||
|
|
||||||
gst_caps_append_structure (caps, out_s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_caps_append_structure (caps, out_s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue