0

サンプル プロジェクトMixerHostのように、混合出力ストリームをスピーカーではなくファイルに書き込みたいので、kAudioUnitSubType_GenericOutput を使用して呼び出します。

CheckError(AudioUnitInitialize(mixerUnit), "AudioUnitInitialize mixerUnit");
CheckError(AudioUnitInitialize(ioUnit), "AudioUnitInitialize iOUnit");
CheckError(AudioOutputUnitStart(ioUnit), "AudioOutputUnitStart iOUnit");

AudioUnitRenderActionFlags ioActionFlags = 0;
AudioTimeStamp inTimeStamp;
memset(&inTimeStamp, 0, sizeof(AudioTimeStamp));
inTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
UInt32 inOutputBusNumber = 0;
UInt32 inNumberFrames = 100;
AudioBuffer buffer;
buffer.mNumberChannels = 2;
buffer.mDataByteSize = inNumberFrames*2;
buffer.mData = malloc(inNumberFrames*2);
AudioBufferList ioData;
ioData.mNumberBuffers = 1;
ioData.mBuffers[0] = buffer;
CheckError(AudioUnitRender(ioUnit,
                           &ioActionFlags,
                           &inTimeStamp,
                           inOutputBusNumber,
                           inNumberFrames,
                           &ioData),
           "AudioUnitRender");

エラー: AudioUnitRender (-50)、AudioUnitRender() の正しい呼び出し方法を教えてください

iluvcapraは正しいです、私は変更しました、そしてそれは動作します:

AudioUnitRenderActionFlags flags = 0;
AudioTimeStamp inTimeStamp;
memset(&inTimeStamp, 0, sizeof(AudioTimeStamp));
inTimeStamp.mFlags = kAudioTimeStampSampleTimeValid;
UInt32 busNumber = 0;
UInt32 numberFrames = 100;

int channelCount = 2;
AudioBufferList *bufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList)+sizeof(AudioBuffer)*(channelCount-1));
bufferList->mNumberBuffers = channelCount;
for (int i=0; i<channelCount; i++) {
    AudioBuffer buffer = {0};
    buffer.mNumberChannels = 1;
    buffer.mDataByteSize = numberFrames*sizeof(AudioUnitSampleType);
    buffer.mData = calloc(numberFrames, sizeof(AudioUnitSampleType));

    bufferList->mBuffers[i] = buffer;

}
CheckError(AudioUnitRender(ioUnit,
                           &flags,
                           &inTimeStamp,
                           busNumber,
                           numberFrames,
                           bufferList),
           "AudioUnitRender ioUnit");
4

1 に答える 1

0

2 つのことですが、これがすべて間違っているかどうかは、もっと見ないとわかりません。

  • サンプル時間が無効です。レンディションのループごとにこれをインクリメントする必要があります。

  • AudioBuffer と AudioBufferList が適切に設定されていません。通常、ミキサーの出力データ形式は、チャンネルAudioBufferをインターリーブではなく個別の に分割します。いずれにせよ、十分なスペースを割り当てていないか、必要なmallocときにcallocing を行っており、バイト サイズのオブジェクトではなく、サンプル サイズのオブジェクトを割り当てています。

AudioBufferList割り当ては次のようになります (MixerHost の後) :

AudioBufferList *ioData = (AudioBufferList *) malloc (
        sizeof (AudioBufferList) + sizeof (AudioBuffer) * (channelCount - 1)
    );


    ioData->mNumberBuffers = channelCount;

    int i;
    for (i = 0; i < channelCount; i++) {
        ioData->mBuffers[i] = {0};
        ioData->mBuffers[i].mNumberChannels  = 1;
        ioData->mBuffers[i].mDataByteSize = BUFFER_SIZE_IN_SAMPLES * 
             sizeof (AudioUnitSampleType);
        ioData->mBuffers[i].mData = calloc(BUFFER_SIZE_IN_SAMPLES, 
             sizeof(AudioUnitSampleType);
    }
于 2013-03-02T01:28:53.517 に答える