2

Audio Units を使用してシンプルな iOS アプリを作成しています。残響効果をつけたい。したがって、グラフは RemoteIO_Input -> Reverb -> RemoveIO_Output のようになります。しかし、リバーブ ユニットのストリーム フォーマットを設定しようとすると、エラーが発生しますkAudioUnitErr_FormatNotSupported。そのコードは、リバーブ ユニット (グラフ内の単一のリモート IO) を使用せずに正常に動作するため、他の構成は問題ないようで、コードを提供していません。

UPD:iOS 6が使用されています

だから質問:

  1. 使用できるフォーマットに制限はありますか?

  2. どのフォーマット パラメータを使用すればよいですか?

  3. RemoteIO 出力要素の任意のスコープでフォーマットを設定する必要がありますか?

ご清聴ありがとうございました。

コード: 説明:

desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;

descRev.componentType = kAudioUnitType_Effect;
descRev.componentSubType = kAudioUnitSubType_Reverb2;
descRev.componentFlags = 0;
descRev.componentFlagsMask = 0;
descRev.componentManufacturer = kAudioUnitManufacturer_Apple;

グラフの設定

NewAUGraph(&graph);
AUNode ioNode;
AUNode rNode;
AUGraphAddNode(graph, &desc, &ioNode);
AUGraphAddNode(graph, &descRev, &rNode);
AUGraphOpen(graph);
AUGraphConnectNodeInput(graph, ioNode, 1, rNode, 0);
AUGraphConnectNodeInput(graph, rNode, 0, ioNode, 0);

フォーマットの説明と設定

   // Describe format
audioFormat.mSampleRate         = rate;//44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 2;
audioFormat.mBytesPerFrame      = 2;

    OSStatus err = AudioUnitSetProperty(unit,
                                  kAudioUnitProperty_StreamFormat,
                                  kAudioUnitScope_Output,
                                  kInputBus,
                                  &audioFormat,
                                  sizeof(audioFormat));
    if (noErr != err) {
        [self showStatus:err];
    }

    err = AudioUnitSetProperty(unitRev,
                           kAudioUnitProperty_StreamFormat,
                           kAudioUnitScope_Input,
                           0,
                           &audioFormat,
                           sizeof(audioFormat));
    if (noErr != err) {
        [self showStatus:err];
    }
4

1 に答える 1

5

使用できるフォーマットに制限はありますか?

はい、通常は非常に厳格です。

どのフォーマット パラメータを使用すればよいですか?

ユニットのデフォルトの ASBD を使用するか、事前に作成されたフラグのセット (kAudioFormatFlagsAudioUnitCanonicalおよびkAudioFormatFlagsCanonical) に基づいたものを使用すると、最もうまくいくでしょう。のように、次のように独自のフォーマットを作成する代わりに:

audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;

次のようにします。

audioFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;

一般的に言えば、2つのユニットを互いに接続するだけで、それらは自分でそれを整理することができます. 独自のオーディオを提供する必要がある場合は、入力形式を指定する必要があります (またkAudioFormatFlagsAudioUnitCanonical、各サンプルが固定の 8.24 数値として表されるインターリーブされていないリニア PCM であるに基づいている必要がある可能性があります)。SInt32容器)。

より多くの入力フォーマット (適切な浮動小数点サンプルなど) を処理できるため、より柔軟性が必要な場合はAUConverter、リバーブ ユニットの前にオーディオ ユニットを配置できます。AUConverterAUConverter はリアルタイムでオーディオ形式を変換する必要があるため、これには処理量の増加という警告が伴うことに注意してください。

完全な ASBD の例は、Core Audio EssentialsページのCanonical Audio Data Formatsという見出しの下にあります。

RemoteIO 出力要素の任意のスコープでフォーマットを設定する必要がありますか?

リバーブ ユニットが RemoteIO 出力に直接接続されている場合、ユニットは自分でそれを整理できるはずです。

于 2012-12-05T15:59:06.370 に答える