我正在研究应用程序,其中我引用apple的aurioTouch应用程序来显示波形。 要求我必须在每个视图控制器的顶部显示波形。 所以,我在firstViewController的viewDidLoad方法中设置了AudioUnit。
XThrowIfError(AudioSessionInitialize(NULL, NULL, rioInterruptionListener, self), "couldn't initialize audio session");
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;
XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");
XThrowIfError(AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self), "couldn't set property listener");
Float32 preferredBufferSize = .005;
XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize), "couldn't set i/o buffer duration");
UInt32 size = sizeof(hwSampleRate);
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &hwSampleRate), "couldn't get hw sample rate");
XThrowIfError(AudioSessionSetActive(true), "couldn't set audio session active\n");
XThrowIfError(SetupRemoteIO(rioUnit, inputProc, thruFormat), "couldn't setup remote i/o unit");
在这里,我可以显示输入声音的波形, 现在当我点击secondTab时,在FirstviewController的viewWillDisappear方法中,我停止了AudioUnit。
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:YES];
AudioOutputUnitStop(rioUnit);
AudioUnitUninitialize(rioUnit);
AudioSessionSetActive(false);
//[self performSelectorOnMainThread:@selector(disposeCoreAudio) withObject:nil waitUntilDone:NO];
//[eaglView stopAnimation];
}
在secondViewController中我再次尝试初始化AudioUnit
XThrowIfError(AudioSessionInitialize(NULL, NULL, rioInterruptionListener, self), "couldn't initialize audio session");
但它显示异常: 即将抛出' init':无法初始化音频会话 错误:无法初始化音频会话(' init')
在第一个viewController中,我能够停止AudioUnit的实例但是无法在secondViewController中再次初始化它。 任何人都可以帮我摆脱这种情况吗?
答案 0 :(得分:2)
不要让你的音频单元受到视图控制器的控制,使一个单独的控制器只处理它。然后,您可以从任何音频单元获取该控制器的共享实例。
顺便说一句,我强烈建议在该控制器中使用Novacaine,它使音频单元更有趣:C ++更少,更多ObjC。 : - )