1

私はこのAUGraph構成を持っています

AudioUnitGraph 0x2505000:
  Member Nodes:
    node 1: 'aufx' 'ipeq' 'appl', instance 0x15599530 O  
    node 2: 'aufx' 'rvb2' 'appl', instance 0x1566ffd0 O  
    node 3: 'aufc' 'conv' 'appl', instance 0x15676900 O  
    node 4: 'aumx' 'mcmx' 'appl', instance 0x15676a30 O  
    node 5: 'aumx' 'mcmx' 'appl', instance 0x15677ac0 O  
    node 6: 'aumx' 'mcmx' 'appl', instance 0x15678a40 O  
    node 7: 'auou' 'rioc' 'appl', instance 0x15679a20 O  
    node 8: 'augn' 'afpl' 'appl', instance 0x1558b710 O  
  Connections:
    node   7 bus   1 => node   5 bus   0  [ 1 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   5 bus   0 => node   3 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   3 bus   0 => node   2 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
    node   2 bus   0 => node   6 bus   0  [ 1 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   8 bus   0 => node   4 bus   0  [ 1 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   4 bus   0 => node   6 bus   1  [ 2 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   6 bus   0 => node   1 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
    node   1 bus   0 => node   7 bus   0  [ 2 ch,      0 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
  CurrentState:
    mLastUpdateError=0, eventsToProcess=F, isInitialized=F, isRunning=F

そしてエラー

AUGraphInitialize err = -10868

コンバーター ユニットを作成したにもかかわらず、2 つのミキサー ユニットの間にリバーブ ユニットを接続したため、次のようになります。

OSStatus err  = noErr;

    UInt32 micBus               = 0;
    UInt32 filePlayerBus        = 1;

    //// ionode:1 ----> vfxNode:0 bus 0
    err =   AUGraphConnectNodeInput(processingGraph, ioNode, 1, vfxNode, 0);
    if (err) { NSLog(@"ioNode:1 ---> vfxNode:0 err = %ld", err); }

    //// vfxNode:0 ---> convertNode:0
    err = AUGraphConnectNodeInput(processingGraph, vfxNode, 0, convertNode, 0);

    //// convertNode:0 ---> vfxRevNode:0
    err = AUGraphConnectNodeInput(processingGraph, convertNode, 0, vfxRevNode, 0);

    //// vfxRevNode:0 ---> mixerNode:0
    err =   AUGraphConnectNodeInput(processingGraph, vfxRevNode, 0, mixerNode,  micBus );
    //if (err) { NSLog(@"vfxRevNode:0 ---> mixerNode:0 err = %ld", err); }

    //// vfxNode:0 ----> mixerNode:0
    //err = AUGraphConnectNodeInput(processingGraph, vfxNode, 0, mixerNode, micBus );
    if (err) { NSLog(@"vfxNode:0 ---> mixerNode:0 err = %ld", err); }

    //// audioPlayerNode:0 ----> fxNode:0
    err = AUGraphConnectNodeInput(processingGraph, audioPlayerNode, 0, fxNode, 0);
    if (err) { NSLog(@"audioPlayerNode:0 --->  fxNode:0 err = %ld", err); }

    //// fxNode:0 ----> mixerNode:1
    err = AUGraphConnectNodeInput(processingGraph, fxNode, 0, mixerNode, filePlayerBus);
    if (err) { NSLog(@"fxNode:0 ---> mixerNode:1 err = %ld", err); }

    ///// mixerNode:0 ----> eqNode:0
    err = AUGraphConnectNodeInput(processingGraph, mixerNode, 0, eqNode, 0);
    if (err) { NSLog(@"mixerNode:0 --->  eqNode:0 err = %ld", err); }

    //// eqNode:0 ----> ioNode:0
    err = AUGraphConnectNodeInput(processingGraph, eqNode, 0, ioNode, 0);
    if (err) { NSLog(@"eqNode:0 ---> ioNode:0 err = %ld", err); }

ノードは次のとおりです。

    ////
//// EQ NODE
////
err = AUGraphAddNode(processingGraph, &EQUnitDescription, &eqNode);
if (err) { NSLog(@"eqNode err = %ld", err); }

////
//// REV NODE
////
err = AUGraphAddNode(processingGraph, &ReverbUnitDescription, &vfxRevNode);
if (err) { NSLog(@"vfxRevNode err = %ld", err); }

////
//// FORMAT CONVERTER NODE
////
err  = AUGraphAddNode (processingGraph, &convertUnitDescription, &convertNode);
if (err) { NSLog(@"convertNode err = %ld", err); }

////
//// FX NODE
////
err = AUGraphAddNode(processingGraph, &FXUnitDescription, &fxNode);
if (err) { NSLog(@"fxNode err = %ld", err); }

////
//// VFX NODE
////
err = AUGraphAddNode(processingGraph, &VFXUnitDescription, &vfxNode);
if (err) { NSLog(@"vfxNode err = %ld", err); }

///
/// MIXER NODE
///
err = AUGraphAddNode (processingGraph, &MixerUnitDescription, &mixerNode );
if (err) { NSLog(@"mixerNode err = %ld", err); }

///
/// OUTPUT NODE
///
err = AUGraphAddNode(processingGraph, &iOUnitDescription, &ioNode);
if (err) { NSLog(@"outputNode err = %ld", err); }

////
/// PLAYER NODE
///
err = AUGraphAddNode(processingGraph, &playerUnitDescription, &audioPlayerNode);
if (err) { NSLog(@"audioPlayerNode err = %ld", err); }

およびコンポーネントの説明:

OSStatus err  = noErr;

    err = NewAUGraph(&processingGraph);

    // OUTPUT unit
    AudioComponentDescription iOUnitDescription;
    iOUnitDescription.componentType = kAudioUnitType_Output;
    iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;//kAudioUnitSubType_VoiceProcessingIO;//kAudioUnitSubType_RemoteIO;
    iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
    iOUnitDescription.componentFlags = 0;
    iOUnitDescription.componentFlagsMask = 0;

    // MIXER unit
    AudioComponentDescription MixerUnitDescription;
    MixerUnitDescription.componentType          = kAudioUnitType_Mixer;
    MixerUnitDescription.componentSubType       = kAudioUnitSubType_MultiChannelMixer;
    MixerUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    MixerUnitDescription.componentFlags         = 0;
    MixerUnitDescription.componentFlagsMask     = 0;

    // PLAYER unit
    AudioComponentDescription playerUnitDescription;
    playerUnitDescription.componentType = kAudioUnitType_Generator;
    playerUnitDescription.componentSubType = kAudioUnitSubType_AudioFilePlayer;
    playerUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;

    // EQ unit
    AudioComponentDescription EQUnitDescription;
    EQUnitDescription.componentType          = kAudioUnitType_Effect;
    EQUnitDescription.componentSubType       = kAudioUnitSubType_AUiPodEQ;
    EQUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    EQUnitDescription.componentFlags         = 0;
    EQUnitDescription.componentFlagsMask     = 0;

    // Reverb unit
    AudioComponentDescription ReverbUnitDescription;
    ReverbUnitDescription.componentType          = kAudioUnitType_Effect;
    ReverbUnitDescription.componentSubType       = kAudioUnitSubType_Reverb2;
    ReverbUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    ReverbUnitDescription.componentFlags         = 0;
    ReverbUnitDescription.componentFlagsMask     = 0;

    // Format Converter between VFX and Reverb units
    AudioComponentDescription convertUnitDescription;
    convertUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    convertUnitDescription.componentType          = kAudioUnitType_FormatConverter;
    convertUnitDescription.componentSubType       = kAudioUnitSubType_AUConverter;
    convertUnitDescription.componentFlags         = 0;
    convertUnitDescription.componentFlagsMask     = 0;

    // FX unit
    AudioComponentDescription FXUnitDescription;
    FXUnitDescription.componentType          = kAudioUnitType_Mixer;
    FXUnitDescription.componentSubType       = kAudioUnitSubType_MultiChannelMixer;
    FXUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    FXUnitDescription.componentFlags         = 0;
    FXUnitDescription.componentFlagsMask     = 0;

    // VFX unit
    AudioComponentDescription VFXUnitDescription;
    VFXUnitDescription.componentType          = kAudioUnitType_Mixer;
    VFXUnitDescription.componentSubType       = kAudioUnitSubType_MultiChannelMixer;
    VFXUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
    VFXUnitDescription.componentFlags         = 0;
    VFXUnitDescription.componentFlagsMask     = 0;

入力ノード ストリーム形式 (ミキサー ユニット) と出力ノード ストリーム形式 (リバーブ) を入力として持つコンバーター ノードのセットアップを作成しました。

    OSStatus err = noErr;
err = AUGraphNodeInfo(processingGraph, convertNode, NULL, &convertUnit);
if (err) { NSLog(@"setupConverterUnit error = %ld", err); }

// set converter input format to vfxunit format

AudioStreamBasicDescription asbd = {0};
size_t bytesPerSample;
bytesPerSample = sizeof(SInt16);
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBitsPerChannel = 8 * bytesPerSample;
asbd.mFramesPerPacket = 1;
asbd.mChannelsPerFrame = 1;
asbd.mBytesPerPacket = bytesPerSample * asbd.mFramesPerPacket;
asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;
asbd.mSampleRate = sampleRate;

err = AudioUnitSetProperty(convertUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &asbd, sizeof(asbd));
if (err) { NSLog(@"setupConverterUnit kAudioUnitProperty_StreamFormat error = %ld", err); }


// set converter output format to reverb format
UInt32 streamFormatSize = sizeof(monoStreamFormat);
err = AudioUnitSetProperty(convertUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &monoStreamFormat, streamFormatSize);
if (err) { NSLog(@"setupConverterUnit kAudioUnitProperty_StreamFormat error = %ld", err); }

リバーブユニットは次のように構成されています。

    OSStatus err  = noErr;

err = AUGraphNodeInfo(processingGraph, vfxRevNode, NULL, &vfxRevUnit);
if (err) { NSLog(@"setupReverbUnit err = %ld", err); }

UInt32 size = sizeof(mReverbPresetArray);
err = AudioUnitGetProperty(vfxRevUnit, kAudioUnitProperty_FactoryPresets, kAudioUnitScope_Global, 0, &mReverbPresetArray, &size);

if (err) { NSLog(@"kAudioUnitProperty_FactoryPresets err = %ld", err); }

    printf("setupReverbUnit Preset List:\n");
    UInt8 count = CFArrayGetCount(mReverbPresetArray);
    for (int i = 0; i < count; ++i) {
        AUPreset *aPreset = (AUPreset*)CFArrayGetValueAtIndex(mReverbPresetArray, i);
        CFShow(aPreset->presetName);
    }

入力ミキサーユニットは

    OSStatus err;
err = AUGraphNodeInfo(processingGraph, vfxNode, NULL, &vfxUnit);
if (err) { NSLog(@"setVFxUnit err = %ld", err); }

UInt32 busCount = 1;
err = AudioUnitSetProperty (
                            vfxUnit,
                            kAudioUnitProperty_ElementCount,
                            kAudioUnitScope_Input,
                            0,
                            &busCount,
                            sizeof (busCount)
                            );

AudioStreamBasicDescription asbd = {0};
size_t bytesPerSample;
bytesPerSample = sizeof(SInt16);
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBitsPerChannel = 8 * bytesPerSample;
asbd.mFramesPerPacket = 1;
asbd.mChannelsPerFrame = 1;
asbd.mBytesPerPacket = bytesPerSample * asbd.mFramesPerPacket;
asbd.mBytesPerFrame = bytesPerSample * asbd.mChannelsPerFrame;
asbd.mSampleRate = sampleRate;

err = AudioUnitSetProperty (
                            vfxUnit,
                            kAudioUnitProperty_StreamFormat,
                            kAudioUnitScope_Input,
                            0,
                            &asbd,
                            sizeof (asbd)
                            );

これまでのところ、それを機能させる方法はありません。次のミキサーユニットに入る前にのみマイク入力にリバーブユニットが必要なので、そこにリバーブユニットが必要です。

コンバーターの AudioStreamBasicDescription のどこが間違っていますか?

編集 何が起こるかというと、音が出ません。オーディオ グラフが初期化されておらず、エラーが発生します。

AUGraphInitialize err = -10868

ここで説明するグラフは、このように表すことができます

レンダー コールバックを取得するために vfxNode に接続されたマイク入力。これは、バス 0 のミキサーに接続されていました。再生中のオーディオを処理する 2 番目のレンダー コールバックがある別のミキサーに接続されたソング プレーヤー ノード。これは、チェーンの最後のミキサーのバス 1 に接続されています。eq ノードはミキサーを出力 ioNode に接続します。

fx ミキサー (vfxNode) とリバーブの間にコンバーター ノードを使用すると、音が出なくなります。

//// vfxNode:0 ---> convertNode:0
err = AUGraphConnectNodeInput(processingGraph, vfxNode, 0, convertNode, 0);

//// convertNode:0 ---> vfxRevNode:0
err = AUGraphConnectNodeInput(processingGraph, convertNode, 0, vfxRevNode, 0);

//// vfxRevNode:0 ---> mixerNode:0
err =   AUGraphConnectNodeInput(processingGraph, vfxRevNode, 0, mixerNode,  micBus );
//if (err) { NSLog(@"vfxRevNode:0 ---> mixerNode:0 err = %ld", err); }

リバーブ ノードがないため、コンバータ ノードがないため、すべてが適切に機能します。

//// ionode:1 ----> vfxNode:0 bus 0
err =   AUGraphConnectNodeInput(processingGraph, ioNode, 1, vfxNode, 0);
if (err) { NSLog(@"ioNode:1 ---> vfxNode:0 err = %ld", err); }

//// vfxNode:0 ----> mixerNode:0
err =   AUGraphConnectNodeInput(processingGraph, vfxNode, 0, mixerNode, micBus );
if (err) { NSLog(@"vfxNode:0 ---> mixerNode:0 err = %ld", err); }
4

1 に答える 1

2

何が問題なのか (エラー、音が出ないなど) は言われていませんが、私は喜んで推測します。これらのエフェクト ユニットは浮動小数点 PCM を好み、一般に浮動小数点以外への接続を拒否します (非エフェクト ユニットは一般に int または固定小数点にデフォルト設定されます)。グラフを開始しようとすると、-50 (paramErr) が表示されますか?

エフェクトユニットを使用するために私がしなければならないことがわかったのは、エフェクトユニットのデフォルトのASBDを(入力スコープまたは出力スコープのいずれかで)読み取り、それをグラフ全体に設定することです(他のユニットは一般に浮動小数点を受け入れます) ASBD)。これは、各ノードからユニットを取得し、エフェクトの入力または出力スコープから ASBD を取得し (どちらが重要であるとは思わないでください)、受け取った形式またはグラフ内の任意のユニットによって生成されます。幸運を。

于 2013-11-09T02:22:51.577 に答える