18 #include "../stdafx.h"
19 #include "../os/macosx/macos.h"
21 #include "../driver.h"
23 #include "../core/endian_type.hpp"
27 #define Point OTTDPoint
28 #include <AudioUnit/AudioUnit.h>
32 #include "../safeguards.h"
36 static AudioUnit _outputAudioUnit;
39 static OSStatus audioCallback(
void *inRefCon, AudioUnitRenderActionFlags *inActionFlags,
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData)
41 MxMixSamples(ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / 4);
49 struct AURenderCallbackStruct callback;
50 AudioStreamBasicDescription requestedDesc;
53 requestedDesc.mFormatID = kAudioFormatLinearPCM;
54 requestedDesc.mFormatFlags = kLinearPCMFormatFlagIsPacked;
55 requestedDesc.mChannelsPerFrame = 2;
58 requestedDesc.mBitsPerChannel = 16;
59 requestedDesc.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
61 #if TTD_ENDIAN == TTD_BIG_ENDIAN
62 requestedDesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
65 requestedDesc.mFramesPerPacket = 1;
66 requestedDesc.mBytesPerFrame = requestedDesc.mBitsPerChannel * requestedDesc.mChannelsPerFrame / 8;
67 requestedDesc.mBytesPerPacket = requestedDesc.mBytesPerFrame * requestedDesc.mFramesPerPacket;
69 MxInitialize((uint)requestedDesc.mSampleRate);
72 AudioComponentDescription desc;
73 desc.componentType = kAudioUnitType_Output;
74 desc.componentSubType = kAudioUnitSubType_HALOutput;
75 desc.componentManufacturer = kAudioUnitManufacturer_Apple;
76 desc.componentFlags = 0;
77 desc.componentFlagsMask = 0;
79 AudioComponent comp = AudioComponentFindNext (
nullptr, &desc);
80 if (comp ==
nullptr) {
81 return "cocoa_s: Failed to start CoreAudio: AudioComponentFindNext returned nullptr";
85 if (AudioComponentInstanceNew(comp, &_outputAudioUnit) != noErr) {
86 return "cocoa_s: Failed to start CoreAudio: AudioComponentInstanceNew";
89 if (AudioUnitInitialize(_outputAudioUnit) != noErr) {
90 return "cocoa_s: Failed to start CoreAudio: AudioUnitInitialize";
94 if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &requestedDesc,
sizeof(requestedDesc)) != noErr) {
95 return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_StreamFormat)";
99 callback.inputProc = audioCallback;
100 callback.inputProcRefCon =
nullptr;
101 if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback,
sizeof(callback)) != noErr) {
102 return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback)";
106 if (AudioOutputUnitStart(_outputAudioUnit) != noErr) {
107 return "cocoa_s: Failed to start CoreAudio: AudioOutputUnitStart";
117 struct AURenderCallbackStruct callback;
120 if (AudioOutputUnitStop(_outputAudioUnit) != noErr) {
121 Debug(driver, 0,
"cocoa_s: Core_CloseAudio: AudioOutputUnitStop failed");
126 callback.inputProc = 0;
127 callback.inputProcRefCon = 0;
128 if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback,
sizeof(callback)) != noErr) {
129 Debug(driver, 0,
"cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback) failed");
133 if (AudioComponentInstanceDispose(_outputAudioUnit) != noErr) {
134 Debug(driver, 0,
"cocoa_s: Core_CloseAudio: AudioComponentInstanceDispose failed");