如何解决从Springboard返回后,AudioUnit导致通用跳过
| 我在使用AudioUnits的应用程序中遇到问题。在退出Springboard并返回到应用程序之后,所有应用程序音频(包括未通过AudioUnits播放的音频)将开始跳过。 我将问题分解成一个新的单独的测试应用程序。以下是重复此步骤的步骤: 使用开始播放音频文件 AVAudioPlayer。 创建,删除,然后再次创建 音频单元 退出跳板 返回应用 来自AvAudioPlayer的音频将开始跳过 这是我使用的一些代码:- (IBAction)restartAudioUnit {
MySoundStream* audioUnitClass;
audioUnitClass = Load();
[audioUnitClass release];
audioUnitClass = Load();
}
原谅冗长的代码转储,但是AudioUnits很复杂,我敢肯定我只是在设置它们或错误地将它们取下。
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,&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,&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,&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
返回跳板
重新输入TestAudioUnit应用
音频将跳过
解决方法
重新初始化应用程序时,您正在呼叫
AudioUnitInitialize()
,这不好。您只需在应用启动时调用一次ѭ2once,并且不必每次应用进入前台时都构建整个AU图形。
,切换到使用AUGraph设置我的音频单元路径,我的运气更好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。