summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_coreaudio_utils.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-06-26 15:49:52 +0200
committerwm4 <wm4@nowhere>2015-06-26 15:58:11 +0200
commitcd6d846b70afc366a6d353571f3b730f7698106a (patch)
tree5ad8502131b035b8b1a2ec439431c9b9dab4ebcf /audio/out/ao_coreaudio_utils.c
parent8134a0601b0cafbd466bf2b44f15a8592ce7b05f (diff)
downloadmpv-cd6d846b70afc366a6d353571f3b730f7698106a.tar.bz2
mpv-cd6d846b70afc366a6d353571f3b730f7698106a.tar.xz
ao_coreaudio: support non-interleaved output
This saves us the trouble of interleaving the audio data for no reason.
Diffstat (limited to 'audio/out/ao_coreaudio_utils.c')
-rw-r--r--audio/out/ao_coreaudio_utils.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c
index aa1c9934d6..08341a6f7c 100644
--- a/audio/out/ao_coreaudio_utils.c
+++ b/audio/out/ao_coreaudio_utils.c
@@ -175,6 +175,12 @@ static void ca_fill_asbd_raw(AudioStreamBasicDescription *asbd, int mp_format,
asbd->mBitsPerChannel = af_fmt2bits(mp_format);
asbd->mFormatFlags = kAudioFormatFlagIsPacked;
+ int channels_per_buffer = num_channels;
+ if (AF_FORMAT_IS_PLANAR(mp_format)) {
+ asbd->mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
+ channels_per_buffer = 1;
+ }
+
if ((mp_format & AF_FORMAT_TYPE_MASK) == AF_FORMAT_F) {
asbd->mFormatFlags |= kAudioFormatFlagIsFloat;
} else if (!af_fmt_unsigned(mp_format)) {
@@ -186,7 +192,7 @@ static void ca_fill_asbd_raw(AudioStreamBasicDescription *asbd, int mp_format,
asbd->mFramesPerPacket = 1;
asbd->mBytesPerPacket = asbd->mBytesPerFrame =
- asbd->mFramesPerPacket * asbd->mChannelsPerFrame *
+ asbd->mFramesPerPacket * channels_per_buffer *
(asbd->mBitsPerChannel / 8);
}