2011-08-27 124 views
0

我使用自定义的voip应用程序。它依靠CoreAudio的音频输入/输出。 我发现了一个问题 - 当应用程序调用AudioOutputUnitStart时,它冻结了几秒钟。AudioOutputUnitStart在iPhone模拟器和设备上运行缓慢

OSStatus status; 

InitializeAudioSession(); 
AudioComponentDescription desc; 
desc.componentType = kAudioUnitType_Output; 
desc.componentSubType = kAudioUnitSubType_RemoteIO; 
desc.componentManufacturer = kAudioUnitManufacturer_Apple; 
desc.componentFlags = 0; 
desc.componentFlagsMask = 0; 
mVoiceUnitComponent = AudioComponentFindNext(NULL, &desc); 

status = AudioComponentInstanceNew(mVoiceUnitComponent, &mVoiceUnit); 
UInt32 enable = 1; 
AudioUnitElement inputBus = 1, outputBus = 0; 
status = AudioUnitSetProperty(mVoiceUnit, kAudioOutputUnitProperty_EnableIO, 
                  kAudioUnitScope_Input, inputBus, 
                  &enable, sizeof(enable)); 
status = AudioUnitSetProperty(mVoiceUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 
                  outputBus, &enable, sizeof(enable)); 

memset(&mStreamDesc, 0, sizeof(mStreamDesc)); 
mStreamDesc.mSampleRate = SPK_SAMPLE_RATE; 
mStreamDesc.mFormatID = kAudioFormatLinearPCM; 
mStreamDesc.mFormatFlags = kAudioFormatFlagsCanonical; 
mStreamDesc.mBitsPerChannel = 16; 
mStreamDesc.mChannelsPerFrame = 1; 
mStreamDesc.mBytesPerFrame = 2; 
mStreamDesc.mFramesPerPacket = 1; 
mStreamDesc.mBytesPerPacket = 2; 
status = AudioUnitSetProperty(mVoiceUnit, kAudioUnitProperty_StreamFormat, 
                  kAudioUnitScope_Output, 
                  inputBus, &mStreamDesc, sizeof(mStreamDesc)); 
StartAudioSession(); 

status = AudioUnitInitialize(mVoiceUnit); 
status = AudioUnitSetProperty(mVoiceUnit, kAudioUnitProperty_StreamFormat, 
                  kAudioUnitScope_Input, 
                  outputBus, &mStreamDesc, sizeof(mStreamDesc)); 


AURenderCallbackStruct outputCallback; 
outputCallback.inputProc = IOSAudio::OutputRenderCallback; 
outputCallback.inputProcRefCon = this; 
status = AudioUnitSetProperty(mVoiceUnit, kAudioUnitProperty_SetRenderCallback, 
                  kAudioUnitScope_Input, outputBus, 
                  &outputCallback, sizeof(outputCallback)); 

AURenderCallbackStruct inputCallback; 
inputCallback.inputProc = IOSAudio::InputRenderCallback; 
inputCallback.inputProcRefCon = this; 
status = AudioUnitSetProperty(mVoiceUnit, kAudioOutputUnitProperty_SetInputCallback, 
                  kAudioUnitScope_Global, inputBus, 
                  &inputCallback, sizeof(inputCallback)); 


status = AudioOutputUnitStart(mVoiceUnit); 

mActive = true; 

的SPK_SAMPLE_RATE为8000或32000 - 我测试了他们两个。

有人可以给我建议吗?

回答

0

我做了一点调查。 看起来我错了 - 只有模拟器的问题。 我没有找到任何原因。 所以我添加解决方法 - 在工作线程中打开音频。

相关问题