20 #include "TiPhoneCoreAudioRenderer.h"
22 static void PrintStreamDesc(AudioStreamBasicDescription *inDesc)
24 printf(
"- - - - - - - - - - - - - - - - - - - -\n");
25 printf(
" Sample Rate:%f\n", inDesc->mSampleRate);
26 printf(
" Format ID:%.*s\n", (
int)
sizeof(inDesc->mFormatID), (
char*)&inDesc->mFormatID);
27 printf(
" Format Flags:%lX\n", inDesc->mFormatFlags);
28 printf(
" Bytes per Packet:%ld\n", inDesc->mBytesPerPacket);
29 printf(
" Frames per Packet:%ld\n", inDesc->mFramesPerPacket);
30 printf(
" Bytes per Frame:%ld\n", inDesc->mBytesPerFrame);
31 printf(
" Channels per Frame:%ld\n", inDesc->mChannelsPerFrame);
32 printf(
" Bits per Channel:%ld\n", inDesc->mBitsPerChannel);
33 printf(
"- - - - - - - - - - - - - - - - - - - -\n");
36 static void printError(OSStatus err)
39 case kAudioConverterErr_FormatNotSupported:
40 printf(
"error code : kAudioConverterErr_FormatNotSupported\n");
42 case kAudioConverterErr_OperationNotSupported:
43 printf(
"error code : kAudioConverterErr_OperationNotSupported\n");
45 case kAudioConverterErr_PropertyNotSupported:
46 printf(
"error code : kAudioConverterErr_PropertyNotSupported\n");
48 case kAudioConverterErr_InvalidInputSize:
49 printf(
"error code : kAudioConverterErr_InvalidInputSize\n");
51 case kAudioConverterErr_InvalidOutputSize:
52 printf(
"error code : kAudioConverterErr_InvalidOutputSize\n");
54 case kAudioConverterErr_UnspecifiedError:
55 printf(
"error code : kAudioConverterErr_UnspecifiedError\n");
57 case kAudioConverterErr_BadPropertySizeError:
58 printf(
"error code : kAudioConverterErr_BadPropertySizeError\n");
60 case kAudioConverterErr_RequiresPacketDescriptionsError:
61 printf(
"error code : kAudioConverterErr_RequiresPacketDescriptionsError\n");
63 case kAudioConverterErr_InputSampleRateOutOfRange:
64 printf(
"error code : kAudioConverterErr_InputSampleRateOutOfRange\n");
66 case kAudioConverterErr_OutputSampleRateOutOfRange:
67 printf(
"error code : kAudioConverterErr_OutputSampleRateOutOfRange\n");
70 printf(
"error code : unknown\n");
75 OSStatus TiPhoneCoreAudioRenderer::Render(
void *inRefCon,
76 AudioUnitRenderActionFlags *ioActionFlags,
77 const AudioTimeStamp *inTimeStamp,
79 UInt32 inNumberFrames,
80 AudioBufferList *ioData)
83 AudioUnitRender(renderer->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, renderer->fCAInputData);
85 float coef = float(LONG_MAX);
86 float inv_coef = 1.f/float(LONG_MAX);
88 for (
int chan = 0; chan < renderer->fDevNumInChans; chan++) {
89 for (
int frame = 0; frame < inNumberFrames; frame++) {
90 renderer->fInChannel[chan][frame] = float(((
int*)renderer->fCAInputData->mBuffers[chan].mData)[frame]) * inv_coef;
94 renderer->PerformAudioCallback((
int)inNumberFrames);
96 for (
int chan = 0; chan < renderer->fDevNumOutChans; chan++) {
97 for (
int frame = 0; frame < inNumberFrames; frame++) {
98 ((
int*)ioData->mBuffers[chan].mData)[frame] = int(renderer->fOutChannel[chan][frame] * coef);
105 void TiPhoneCoreAudioRenderer::InterruptionListener(
void *inClientData, UInt32 inInterruption)
108 printf(
"Session interrupted! --- %s ---", inInterruption == kAudioSessionBeginInterruption ?
"Begin Interruption" :
"End Interruption");
110 if (inInterruption == kAudioSessionEndInterruption) {
112 AudioSessionSetActive(
true);
113 AudioOutputUnitStart(obj->fAUHAL);
116 if (inInterruption == kAudioSessionBeginInterruption) {
117 AudioOutputUnitStop(obj->fAUHAL);
121 int TiPhoneCoreAudioRenderer::Open(
int bufferSize,
int samplerate)
126 AudioStreamBasicDescription srcFormat, dstFormat;
128 printf(
"Open fDevNumInChans = %ld fDevNumOutChans = %ld bufferSize = %ld samplerate = %ld\n", fDevNumInChans, fDevNumOutChans, bufferSize, samplerate);
131 err1 = AudioSessionInitialize(NULL, NULL, InterruptionListener,
this);
133 printf(
"Couldn't initialize audio session\n");
138 err1 = AudioSessionSetActive(
true);
140 printf(
"Couldn't set audio session active\n");
145 UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
146 err1 = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(audioCategory), &audioCategory);
148 printf(
"Couldn't set audio category\n");
155 Float64 hwSampleRate;
156 outSize =
sizeof(hwSampleRate);
157 err1 = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &outSize, &hwSampleRate);
159 printf(
"Couldn't get hw sample rate\n");
163 printf(
"Get hw sample rate %f\n", hwSampleRate);
166 Float32 hwBufferSize;
167 outSize =
sizeof(hwBufferSize);
168 err1 = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &outSize, &hwBufferSize);
170 printf(
"Couldn't get hw buffer duration\n");
174 printf(
"Get hw buffer duration %f\n", hwBufferSize);
178 outSize =
sizeof(hwInput);
179 err1 = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels, &outSize, &hwInput);
181 printf(
"Couldn't get hw input channels\n");
185 printf(
"Get hw input channels %d\n", hwInput);
189 outSize =
sizeof(hwOutput);
190 err1 = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputNumberChannels, &outSize, &hwOutput);
192 printf(
"Couldn't get hw output channels\n");
196 printf(
"Get hw output channels %d\n", hwOutput);
199 Float32 preferredBufferSize = float(bufferSize) / float(samplerate);
200 printf(
"preferredBufferSize %f \n", preferredBufferSize);
202 err1 = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
sizeof(preferredBufferSize), &preferredBufferSize);
204 printf(
"Couldn't set i/o buffer duration\n");
209 Float64 preferredSamplerate = float(samplerate);
210 err1 = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareSampleRate,
sizeof(preferredSamplerate), &preferredSamplerate);
212 printf(
"Couldn't set i/o sample rate\n");
218 AudioComponentDescription cd = {kAudioUnitType_Output, kAudioUnitSubType_RemoteIO, kAudioUnitManufacturer_Apple, 0, 0};
219 AudioComponent HALOutput = AudioComponentFindNext(NULL, &cd);
221 err1 = AudioComponentInstanceNew(HALOutput, &fAUHAL);
223 printf(
"Error calling OpenAComponent\n");
229 err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &enableIO,
sizeof(enableIO));
231 printf(
"Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output\n");
237 err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &enableIO,
sizeof(enableIO));
239 printf(
"Error calling AudioUnitSetProperty - kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input\n");
245 outSize =
sizeof(maxFPS);
246 err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maxFPS, &outSize);
248 printf(
"Couldn't get kAudioUnitProperty_MaximumFramesPerSlice\n");
252 printf(
"Get kAudioUnitProperty_MaximumFramesPerSlice %d\n", maxFPS);
255 err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 1, (UInt32*)&bufferSize,
sizeof(UInt32));
257 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice\n");
262 err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, (UInt32*)&bufferSize,
sizeof(UInt32));
264 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_MaximumFramesPerSlice\n");
269 err1 = AudioUnitInitialize(fAUHAL);
271 printf(
"Cannot initialize AUHAL unit\n");
278 if (fDevNumInChans > 0) {
279 outSize =
sizeof(AudioStreamBasicDescription);
280 err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &srcFormat, &outSize);
282 printf(
"Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output\n");
285 PrintStreamDesc(&srcFormat);
287 srcFormat.mFormatID = kAudioFormatLinearPCM;
288 srcFormat.mFormatFlags = kAudioFormatFlagsCanonical | kLinearPCMFormatFlagIsNonInterleaved;
289 srcFormat.mBytesPerPacket =
sizeof(AudioUnitSampleType);
290 srcFormat.mFramesPerPacket = 1;
291 srcFormat.mBytesPerFrame =
sizeof(AudioUnitSampleType);
292 srcFormat.mChannelsPerFrame = fDevNumInChans;
293 srcFormat.mBitsPerChannel = 32;
295 PrintStreamDesc(&srcFormat);
297 err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &srcFormat,
sizeof(AudioStreamBasicDescription));
299 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output\n");
304 if (fDevNumOutChans > 0) {
305 outSize =
sizeof(AudioStreamBasicDescription);
306 err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &dstFormat, &outSize);
308 printf(
"Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input\n");
311 PrintStreamDesc(&dstFormat);
313 dstFormat.mFormatID = kAudioFormatLinearPCM;
314 dstFormat.mFormatFlags = kAudioFormatFlagsCanonical | kLinearPCMFormatFlagIsNonInterleaved;
315 dstFormat.mBytesPerPacket =
sizeof(AudioUnitSampleType);
316 dstFormat.mFramesPerPacket = 1;
317 dstFormat.mBytesPerFrame =
sizeof(AudioUnitSampleType);
318 dstFormat.mChannelsPerFrame = fDevNumOutChans;
319 dstFormat.mBitsPerChannel = 32;
321 PrintStreamDesc(&dstFormat);
323 err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &dstFormat,
sizeof(AudioStreamBasicDescription));
325 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input\n");
330 if (fDevNumInChans > 0 && fDevNumOutChans == 0) {
331 AURenderCallbackStruct output;
332 output.inputProc = Render;
333 output.inputProcRefCon =
this;
334 err1 = AudioUnitSetProperty(fAUHAL, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &output,
sizeof(output));
336 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 1\n");
341 AURenderCallbackStruct output;
342 output.inputProc = Render;
343 output.inputProcRefCon =
this;
344 err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &output,
sizeof(output));
346 printf(
"Error calling AudioUnitSetProperty - kAudioUnitProperty_SetRenderCallback 0\n");
353 fCAInputData = (AudioBufferList*)malloc(
sizeof(UInt32) + fDevNumInChans *
sizeof(AudioBuffer));
354 fCAInputData->mNumberBuffers = fDevNumInChans;
355 for (
int i = 0; i < fDevNumInChans; i++) {
356 fCAInputData->mBuffers[i].mNumberChannels = 1;
357 fCAInputData->mBuffers[i].mDataByteSize = bufferSize *
sizeof(int);
358 fCAInputData->mBuffers[i].mData = malloc(bufferSize *
sizeof(
int));
374 AudioUnitUninitialize(fAUHAL);
375 AudioComponentInstanceDispose(fAUHAL);
379 int TiPhoneCoreAudioRenderer::Close()
381 AudioUnitUninitialize(fAUHAL);
382 AudioComponentInstanceDispose(fAUHAL);
386 int TiPhoneCoreAudioRenderer::Start()
388 AudioSessionSetActive(
true);
389 OSStatus err = AudioOutputUnitStart(fAUHAL);
392 printf(
"Error while opening device : device open error \n");
399 int TiPhoneCoreAudioRenderer::Stop()
401 OSStatus err = AudioOutputUnitStop(fAUHAL);
404 printf(
"Error while closing device : device close error \n");