20 #include "../stdafx.h" 
   22 #include "../driver.h" 
   24 #include "../core/endian_type.hpp" 
   28 #define Point       OTTDPoint 
   29 #include <AudioUnit/AudioUnit.h> 
   33 #include "../safeguards.h" 
   37 static AudioUnit _outputAudioUnit;
 
   40 static OSStatus audioCallback(
void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, 
const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData)
 
   42   MxMixSamples(ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / 4);
 
   51   ComponentDescription desc;
 
   52   struct AURenderCallbackStruct callback;
 
   53   AudioStreamBasicDescription requestedDesc;
 
   56   requestedDesc.mFormatID = kAudioFormatLinearPCM;
 
   57   requestedDesc.mFormatFlags = kLinearPCMFormatFlagIsPacked;
 
   58   requestedDesc.mChannelsPerFrame = 2;
 
   61   requestedDesc.mBitsPerChannel = 16;
 
   62   requestedDesc.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
 
   64 #if TTD_ENDIAN == TTD_BIG_ENDIAN 
   65   requestedDesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
 
   68   requestedDesc.mFramesPerPacket = 1;
 
   69   requestedDesc.mBytesPerFrame = requestedDesc.mBitsPerChannel * requestedDesc.mChannelsPerFrame / 8;
 
   70   requestedDesc.mBytesPerPacket = requestedDesc.mBytesPerFrame * requestedDesc.mFramesPerPacket;
 
   72   MxInitialize((uint)requestedDesc.mSampleRate);
 
   75   desc.componentType = kAudioUnitType_Output;
 
   76   desc.componentSubType = kAudioUnitSubType_HALOutput;
 
   77   desc.componentManufacturer = kAudioUnitManufacturer_Apple;
 
   78   desc.componentFlags = 0;
 
   79   desc.componentFlagsMask = 0;
 
   81   comp = FindNextComponent (NULL, &desc);
 
   83     return "cocoa_s: Failed to start CoreAudio: FindNextComponent returned NULL";
 
   87   if (OpenAComponent(comp, &_outputAudioUnit) != noErr) {
 
   88     return "cocoa_s: Failed to start CoreAudio: OpenAComponent";
 
   91   if (AudioUnitInitialize(_outputAudioUnit) != noErr) {
 
   92     return "cocoa_s: Failed to start CoreAudio: AudioUnitInitialize";
 
   96   if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &requestedDesc, 
sizeof(requestedDesc)) != noErr) {
 
   97     return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_StreamFormat)";
 
  101   callback.inputProc = audioCallback;
 
  102   callback.inputProcRefCon = NULL;
 
  103   if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, 
sizeof(callback)) != noErr) {
 
  104     return "cocoa_s: Failed to start CoreAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback)";
 
  108   if (AudioOutputUnitStart(_outputAudioUnit) != noErr) {
 
  109     return "cocoa_s: Failed to start CoreAudio: AudioOutputUnitStart";
 
  119   struct AURenderCallbackStruct callback;
 
  122   if (AudioOutputUnitStop(_outputAudioUnit) != noErr) {
 
  123     DEBUG(driver, 0, 
"cocoa_s: Core_CloseAudio: AudioOutputUnitStop failed");
 
  128   callback.inputProc = 0;
 
  129   callback.inputProcRefCon = 0;
 
  130   if (AudioUnitSetProperty(_outputAudioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &callback, 
sizeof(callback)) != noErr) {
 
  131     DEBUG(driver, 0, 
"cocoa_s: Core_CloseAudio: AudioUnitSetProperty (kAudioUnitProperty_SetRenderCallback) failed");
 
  135   if (CloseComponent(_outputAudioUnit) != noErr) {
 
  136     DEBUG(driver, 0, 
"cocoa_s: Core_CloseAudio: CloseComponent failed");