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错误的东西,那将是非常有帮助的。
编辑:上传完整的源代码。 这里
- 按播放声音(可能需要耳机)
- 按RestartAudioUnit
- 返回到跳板
- 重新inputTestAudioUnit应用程序
audio将跳过
当应用程序重新初始化时,您正在调用AudioUnitInitialize()
,这并不好。 当您的应用程序启动时,您只需调用一次AudioUnitInitialize()
,并且每次应用程序进入前台时都不必构build整个AUgraphics。
切换到使用AUGraph来设置我的audio单元path,我有更好的运气。
- 从Socket连接在iOS上播放audio
- 调用AUGraphStart进行播放时接收kAUGraphErr_CannotDoInCurrentContext
- 核心audio:文件播放呈现callback函数
- iOS:设置基本的语音处理I / O音频单元-Swift
- 启动一个AVAssetReader,停止对远程I / O AudioUnit的callback
- 从IO单元将audio写入磁盘
- 设置audio单元格式并渲染交错PCMaudio的回叫
- 无法使用AudioFileStreamOpen的AudioFileStream_PacketsProccallback中的AudioConverterFillComplexBuffer将MP3转换成PCM
- 从iOS上的“audio单元渲染过程”触发UI代码