summaryrefslogtreecommitdiffstats
path: root/audio/out/ao_coreaudio_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/out/ao_coreaudio_utils.c')
-rw-r--r--audio/out/ao_coreaudio_utils.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c
index f5cc43db0b..235e7fba42 100644
--- a/audio/out/ao_coreaudio_utils.c
+++ b/audio/out/ao_coreaudio_utils.c
@@ -25,6 +25,7 @@
#include "audio/out/ao_coreaudio_utils.h"
#include "audio/out/ao_coreaudio_properties.h"
#include "osdep/timer.h"
+#include "audio/format.h"
void ca_print_device_list(struct ao *ao)
{
@@ -125,6 +126,31 @@ bool check_ca_st(struct ao *ao, int level, OSStatus code, const char *message)
return false;
}
+void ca_fill_asbd(struct ao *ao, AudioStreamBasicDescription *asbd)
+{
+ asbd->mSampleRate = ao->samplerate;
+ asbd->mFormatID = AF_FORMAT_IS_AC3(ao->format) ?
+ kAudioFormat60958AC3 :
+ kAudioFormatLinearPCM;
+ asbd->mChannelsPerFrame = ao->channels.num;
+ asbd->mBitsPerChannel = af_fmt2bits(ao->format);
+ asbd->mFormatFlags = kAudioFormatFlagIsPacked;
+
+ if ((ao->format & AF_FORMAT_POINT_MASK) == AF_FORMAT_F)
+ asbd->mFormatFlags |= kAudioFormatFlagIsFloat;
+
+ if ((ao->format & AF_FORMAT_SIGN_MASK) == AF_FORMAT_SI)
+ asbd->mFormatFlags |= kAudioFormatFlagIsSignedInteger;
+
+ if ((ao->format & AF_FORMAT_END_MASK) == AF_FORMAT_BE)
+ asbd->mFormatFlags |= kAudioFormatFlagIsBigEndian;
+
+ asbd->mFramesPerPacket = 1;
+ asbd->mBytesPerPacket = asbd->mBytesPerFrame =
+ asbd->mFramesPerPacket * asbd->mChannelsPerFrame *
+ (asbd->mBitsPerChannel / 8);
+}
+
void ca_print_asbd(struct ao *ao, const char *description,
const AudioStreamBasicDescription *asbd)
{