3

直後にオーディオユニットの入力に AURenderCallbackStruct をアタッチすることで、kAudioUnitType_Generator オーディオユニットによって生成されたサンプルを操作しようとしましたが、うまくいきませんでした。次の単純なグラフを使用して、OS Xでこれを機能させることができました。

(input callback) -> multichannel mixer -> (intput callback) -> default output

しかし、ジェネレーターユニットで始まる次の (さらに単純な) グラフでは失敗しました。

speech synthesis -> (intput callback) -> default output           | fails in render callback with kAudioUnitErr_Uninitialized
audiofile player -> (intput callback) -> default output           | fails when scheduling file region with kAudioUnitErr_Uninitialized

ASBD フォーマットの設定からサンプル レートまで、考えられることはすべて試しましたが、常にこれらのエラーが発生します。これらの素敵なジェネレーターユニットからのサンプルを操作できるグラフをセットアップする方法を知っている人はいますか?

以下は、音声合成を使用しようとして失敗したレンダリング コールバック関数とグラフ インスタンス化メソッドです。もちろん、ファイル再生の設定を除いて、オーディオファイルプレーヤーはこれとほとんど同じです。コールバックを削除し、その場所に AUGraphConnectNodeInput を追加すると、これらの設定は両方とも機能します...

static OSStatus RenderCallback(void *inRefCon,
                                    AudioUnitRenderActionFlags *ioActionFlags,
                                    const AudioTimeStamp *inTimeStamp,
                                    UInt32 inBusNumber,
                                    UInt32 inNumberFrames,
                                    AudioBufferList *ioData) {

    AppDelegate *app = (AppDelegate *)inRefCon;
    AudioUnit inputUnit = app->_speechUnit;
    OSStatus status = noErr;

    status = AudioUnitRender(inputUnit, ioActionFlags, inTimeStamp, 0, inNumberFrames, ioData);
    // *** ERROR *** kAudioUnitErr_Uninitialized, code: -10867

    // ... insert processing code here...

    return status;
}

- (int)createSynthGraph {
    AUGRAPH_CHECK( NewAUGraph( &_graph ) );

    AUNode speechNode, outputNode;

    // speech synthesizer
    AudioComponentDescription speechCD = {0};
    speechCD.componentType = kAudioUnitType_Generator;
    speechCD.componentSubType = kAudioUnitSubType_SpeechSynthesis;
    speechCD.componentManufacturer = kAudioUnitManufacturer_Apple;

    // output device (speakers)
    AudioComponentDescription outputCD = {0};
    outputCD.componentType = kAudioUnitType_Output;
    outputCD.componentSubType = kAudioUnitSubType_DefaultOutput;
    outputCD.componentManufacturer = kAudioUnitManufacturer_Apple;

    AUGRAPH_CHECK( AUGraphAddNode( _graph, &outputCD, &outputNode ) );
    AUGRAPH_CHECK( AUGraphAddNode( _graph, &speechCD, &speechNode ) );

    AUGRAPH_CHECK( AUGraphOpen( _graph ) );
    AUGRAPH_CHECK( AUGraphNodeInfo( _graph, outputNode, NULL, &_outputUnit ) );
    AUGRAPH_CHECK( AUGraphNodeInfo( _graph, speechNode, NULL, &_speechUnit ) );

    // setup stream formats:
    AudioStreamBasicDescription streamFormat = [self streamFormat];
    AU_CHECK( AudioUnitSetProperty( _speechUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &streamFormat, sizeof(streamFormat) ) );

    // setup callback:
    AURenderCallbackStruct callback;
    callback.inputProc = RenderCallback;
    callback.inputProcRefCon = self;
    AUGRAPH_CHECK( AUGraphSetNodeInputCallback ( _graph, outputNode, 0, &callback ) );

    // init and start
    AUGRAPH_CHECK( AUGraphInitialize( _graph ) );
    AUGRAPH_CHECK( AUGraphStart( _graph ) );
    return 0;
}
4

2 に答える 2

1

これらのノードを一緒に接続する必要がありAUGraphConnectNodeInputます。は、接続されていない限り、そのAUGraph中の AudioUnits を初期化しません。他のユニットに接続されていないグラフ内のユニットは初期化されません。

グラフを開始する前に手動で初期化することもできます。

于 2013-02-27T20:32:52.420 に答える
1

オーディオユニットが初期化されていない場合、kAudioUnitErr_Uninitialized エラーが表示されます。問題のプロパティを設定する前に、グラフを初期化するだけです。これにより、グラフで開いているすべてのオーディオ ユニットが初期化されます。AUGraph.h の AUGraphInitialize ディスカッションから:

AudioUnitInitialize() は、インタラクションに関与する、開いている各ノード/AudioUnit (レンダリングの準備) と SubGraph で呼び出されます。

于 2015-01-29T10:30:24.370 に答える