10

私のアプリでは、これら2つの異なるAudioUnitを切り替える必要があります。VPIOからRemoteIOに切り替えるたびに、録音音量が低下します。かなり大幅な低下。再生音量に変化はありませんが、これを経験した人はいますか?

これが、ルーティングの変更によってトリガーされる切り替えを行うコードです。(変更が正しく行われたかどうかはわかりませんので、ここでも質問しています。)

録音音量低下の問題を解決するにはどうすればよいですか?

ありがとう、私が得ることができるどんな助けにも感謝します。

橋脚。

- (void)switchInputBoxTo : (OSType) inputBoxSubType
{
OSStatus result;

if (!remoteIONode) return; // NULL check

// Get info about current output node
AudioComponentDescription outputACD;
AudioUnit currentOutputUnit;

AUGraphNodeInfo(theGraph, remoteIONode, &outputACD, &currentOutputUnit);

if (outputACD.componentSubType != inputBoxSubType)
{
    AUGraphStop(theGraph);
    AUGraphUninitialize(theGraph); 
    result = AUGraphDisconnectNodeInput(theGraph, remoteIONode, 0);
    NSCAssert (result == noErr, @"Unable to disconnect the nodes in the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);
    AUGraphRemoveNode(theGraph, remoteIONode);
    // Re-init as other type

    outputACD.componentSubType = inputBoxSubType;
    // Add the RemoteIO unit node to the graph
    result = AUGraphAddNode (theGraph, &outputACD, &remoteIONode);
    NSCAssert (result == noErr, @"Unable to add the replacement IO unit to the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);

    result = AUGraphConnectNodeInput(theGraph, mixerNode, 0, remoteIONode, 0);
    // Obtain a reference to the I/O unit from its node
    result = AUGraphNodeInfo (theGraph, remoteIONode, 0, &_remoteIOUnit);
    NSCAssert (result == noErr, @"Unable to obtain a reference to the I/O unit. Error code: %d '%.4s'", (int) result, (const char *)&result);

    //result = AudioUnitUninitialize(_remoteIOUnit);

    [self setupRemoteIOTest]; // reinit all that remoteIO/voiceProcessing stuff
    [self configureAndStartAudioProcessingGraph:theGraph];
}  
}
4

4 に答える 4

7

私はこれにアップルデベロッパサポートを使用しました。サポートが言ったことは次のとおりです。

音声I/Oが存在すると、入力/出力の処理が大きく異なります。これらのユニットが同じゲインレベルになることはまったく期待できませんが、あなたが示しているように、レベルが大幅に低下することはありません。

とは言うものの、コアオーディオエンジニアリングは、音声ブロックが作成されたときに結果が関連している可能性があり、それがRIOインスタンスにも影響していることを示しました。コアオーディオエンジニアリングについてさらに話し合うと、レベル差は非常に劇的であると言うので、音声I/Oと音声I/Oの間で聞こえるレベル差を強調するためにいくつかの録音でバグを報告できれば良いと感じました。リモートI/Oとテストコードを使用して、社内で再現を試み、これが実際にバグであるかどうかを確認できます。上記で概説した単一のIO単体テストの結果と、さらに比較結果を含めることをお勧めします。

このゲインレベルを制御するAPIはありません。すべては、オーディオセッションカテゴリ(たとえば、VPIOは常にPlayAndRecordで使用されることが期待されます)およびどのIOユニットが設定されているかに応じてOSによって内部的に設定されます。通常、両方が同時にインスタンス化されることは期待されていません。

結論?バグだと思います。:/

于 2013-01-15T10:43:08.333 に答える
2

オーディオユニットを正しく廃棄しないと、音量が小さい問題についての話があります。基本的に、最初のオーディオコンポーネントはメモリに残り、それ以降の再生は自分または他のアプリの下に隠れて、音量が低下します。

解決策: オーディオユニットはAudioComponentInstanceのものであり、AudioComponentInstanceDispose()を使用して解放する必要があります。

于 2012-12-20T19:04:57.143 に答える
2

音声処理io(PlayAndRecord)からリモートIO(SoloAmbient)に移行するときに、オーディオセッションのカテゴリを変更すると成功しました。これを変更する前に、必ずオーディオセッションを一時停止してください。また、オーディオグラフの初期化を解除する必要があります。

于 2013-08-06T14:43:52.700 に答える
0

AppleAVAudioSessionエンジニアとの話から。

VPIO-オーディオサンプルにオーディオ処理を追加しています。これにより、エコーキャンセルも作成されます。これにより、オーディオレベルが低下します。

RemoteIO-音量レベルが高いままになるように、オーディオ処理を行いません。

RemoteIOオプションの使用中にエコーキャンセルを探している場合は、レンダリングコールバックで独自のオーディオ処理を作成する必要があります

于 2021-07-07T08:24:22.257 に答える