AudioUnits从Springboard返回后导致通用跳过

我在使用AudioUnits的应用程序中遇到问题。 所有应用程序audio(包括未通过AudioUnits播放的audio)将在退出到Springboard并返回到应用程序后开始跳过。

我把这个问题分解成了一个新的单独的testing应用程序。 这里是重复它的步骤:

  • 开始使用AVAudioPlayer播放audio文件。
  • 创build,删除,然后再创build一个AudioUnit
  • 退出到跳板
  • 返回到应用程序
  • 来自AvAudioPlayer的audio将开始跳过

以下是我使用的一些代码:

- (IBAction)restartAudioUnit { MySoundStream* audioUnitClass; audioUnitClass = Load(); [audioUnitClass release]; audioUnitClass = Load(); } 

原谅长的代码转储,但audio单元是复杂的,我相当肯定,我只是设置或不正确地把他们closures。

MySoundStream类:

 OSStatus UnitRenderCB(void* pRefCon, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* timeStamp, UInt32 busNum, UInt32 numFrames, AudioBufferList* pData){ OSStatus tErr = noErr; //Do Nothing return tErr; } @implementation MySoundStream -(void) dealloc { [self Unload]; [super dealloc]; } -(void) Unload { OSStatus tErr = noErr; tErr = AudioUnitUninitialize(OutUnit); } @end MySoundStream* Load() { OSStatus tErr = noErr; AudioComponentInstance tRIO; AudioComponentDescription tRIOCD; AURenderCallbackStruct tRIOCB; AudioStreamBasicDescription tAUF; tRIOCD.componentType = kAudioUnitType_Output; tRIOCD.componentSubType = kAudioUnitSubType_RemoteIO; tRIOCD.componentManufacturer = kAudioUnitManufacturer_Apple; tRIOCD.componentFlags = 0; tRIOCD.componentFlagsMask = 0; AudioComponent tRIOC = AudioComponentFindNext(NULL, &tRIOCD); tErr = AudioComponentInstanceNew(tRIOC, &tRIO); if (tErr != noErr) return NULL; int tOutEnable = 1; tErr = AudioUnitSetProperty(tRIO, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &tOutEnable, sizeof(tOutEnable)); if (tErr != noErr) return NULL; tAUF.mSampleRate = 44100.00; tAUF.mFormatID = kAudioFormatLinearPCM; tAUF.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; tAUF.mFramesPerPacket = 1; tAUF.mChannelsPerFrame = 2; tAUF.mBitsPerChannel = 16; tAUF.mBytesPerPacket = 4; tAUF.mBytesPerFrame = 4; tErr = AudioUnitSetProperty(tRIO, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &tAUF, sizeof(tAUF)); if (tErr != noErr) return false; MySoundStream* pRet = [MySoundStream alloc]; tRIOCB.inputProc = UnitRenderCB; tRIOCB.inputProcRefCon = pRet; tErr = AudioUnitSetProperty(tRIO, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &tRIOCB, sizeof(tRIOCB)); if (tErr != noErr){ delete pRet; return NULL; } tErr = AudioUnitInitialize(tRIO); if (tErr != noErr){ delete pRet; return NULL; } pRet->OutUnit = tRIO; return pRet; } 

如果任何人都可以看到我在做这个AudioUnit错误的东西,那将是非常有帮助的。

编辑:上传完整的源代码。 这里

  1. 按播放声音(可能需要耳机)
  2. 按RestartAudioUnit
  3. 返回到跳板
  4. 重新inputTestAudioUnit应用程序

audio将跳过

当应用程序重新初始化时,您正在调用AudioUnitInitialize() ,这并不好。 当您的应用程序启动时,您只需调用一次AudioUnitInitialize() ,并且每次应用程序进入前台时都不必构build整个AUgraphics。

切换到使用AUGraph来设置我的audio单元path,我有更好的运气。