在所有viewcontrollers中使用AudioUnit初始化

时间:2013-01-30 10:00:00

标签: iphone ios objective-c

我正在研究应用程序,其中我引用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中再次初始化它。   任何人都可以帮我摆脱这种情况吗?

1 个答案:

答案 0 :(得分:2)

不要让你的音频单元受到视图控制器的控制,使一个单独的控制器只处理它。然后,您可以从任何音频单元获取该控制器的共享实例。

顺便说一句,我强烈建议在该控制器中使用Novacaine,它使音频单元更有趣:C ++更少,更多ObjC。 : - )