2

AudioUnitwith subtypeを使用するアプリがありますkAudioUnitSubType_VoiceProcessingIO。入力はネットワーク ストリームから取得されます。それはうまくいきますが、今はファイルから簡単な音(プッシュ通知を受け取った後の警告音)を鳴らしたいと思っています。AudioUnitまだ開始されていないか、すでに破棄されている場合にのみ、動作中は機能しません。AudioUnitサウンド ファイルの再生中に を停止して最終的なサンプルを聞くこともできるので、再生は機能しているように見えますが、無音です。

実際のデバイスで試しAudioServicesPlaySystemSoundてみAVAudioPlayerましたが、成功しませんでした (シミュレーターで動作する可能性があります)。

この単純なタスクに対する単純な解決策はありますか、それともファイル ベースのオーディオ コンテンツを手動でミックスする必要がありますか?

前もって感謝します!

4

4 に答える 4

2

試す

OSStatus propertySetError = 0;
UInt32 allowMixing = true;

propertySetError = AudioSessionSetProperty (
                       kAudioSessionProperty_OverrideCategoryMixWithOthers,  // 1
                       sizeof (allowMixing),                                 // 2
                       &allowMixing                                          // 3
                   );

または、kAudioUnitType_Mixer タイプの AudioUnit を使用できます。

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

それら (mixer_unit、voice_processing_unit) を AUGraph に追加します。ミキサーユニットの入力バス数 2 を設定します。

UInt32 busCount   = 2;    // bus count for mixer unit input
status = AudioUnitSetProperty (mixer_unit,
                               kAudioUnitProperty_ElementCount,
                               kAudioUnitScope_Input,
                               0,
                               &busCount,
                               sizeof(busCount)
                               );

mixer_unit の各バスにレンダリング コールバックを追加します。

for (UInt16 busNumber = 0; busNumber < busCount; ++busNumber) {
        AURenderCallbackStruct inputCallbackStruct;
        inputCallbackStruct.inputProc        = &VoiceMixRenderCallback;
        inputCallbackStruct.inputProcRefCon  = self;

        status = AUGraphSetNodeInputCallback (_mixSaveGraph,
                                              mixerNode,
                                              busNumber,
                                              &inputCallbackStruct
                                              );
        if (status) { printf("AudioUnitSetProperty set callback"); return NO; }            

    }

mixer_unit の出力バスを io_unit の入力バスに接続します。

status = AUGraphConnectNodeInput (_mixSaveGraph,
                                      mixerNode,         // source node
                                      0,                 // source node output bus number
                                      saveNode,          // destination node
                                      0                  // desintation node input bus number
                                      );

グラフを開始すると、次のように異なるバス番号 (0 と 1) でリーダー コールバックが返されます。

static OSStatus VoiceMixRenderCallback(void *                       inRefCon,
                                  AudioUnitRenderActionFlags    *ioActionFlags,
                                  const AudioTimeStamp *        inTimeStamp,
                                  UInt32                        inBusNumber,
                                  UInt32                        inNumberFrames,
                                  AudioBufferList *             ioData )
{
    OSStatus status;
    AURecorder *recorder = (AURecorder*)inRefCon;
    if (inBusNumber == BUS_ONE && (recorder.isMusicPlaying)) {
        //Get data from music file. try ExtAudioFileRead 
    } else if (inBusNumber == BUS_TWO) {
        status = AudioUnitRender(recorder.io_unit, ioActionFlags, inTimeStamp, INPUT_BUS, inNumberFrames, ioData);
       //Get data from io unit's input bus.
        if (status)
        {
            printf("AudioUnitRender for record error");
            *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence;
        }
    } else {
        *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence;
    }

    return noErr;
}
于 2013-01-16T04:16:48.897 に答える
0

これは、システムの制限である可能性があります。PlayAndRecord カテゴリを使用しているときに AudioServicesPlaySystemSound を呼び出しても iOS デバイスが何もしなかった場合は、最初に AudioUnit を停止してから、この関数を呼び出してみてください。

于 2013-01-10T14:12:39.617 に答える