2

波形を表示するためにアップルの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で再度初期化することはできません。誰かが私がこの状況から抜け出すのを手伝ってくれる?

4

1 に答える 1

2

オーディオユニットをViewControllerで制御するのではなく、それだけを処理するシングルトンコントローラーを作成します。次に、そのコントローラーの共有インスタンスを任意のオーディオユニットから取得できます。

ところで、私はそのコントローラーでNovacaineを使用することを強くお勧めします。これにより、オーディオユニットの操作がはるかに楽しくなります。C++が少なくなり、ObjCが多くなります。:-)

于 2013-01-30T10:42:25.263 に答える