Using ExtAudioFileWriteAsync() in callback function. Can't get to run

前端 未结 2 1572
情书的邮戳
情书的邮戳 2021-01-21 10:33

Just can\'t seem to get very far in Core Audio. My goal is to write captured audio data from an instrument unit to a file. I have set up a call to a callback function on an inst

2条回答
  •  死守一世寂寞
    2021-01-21 11:08

    Here's the working callback for a 16-bit linear big-endian stereo AIF file:

    OSStatus MyRenderProc(void *inRefCon,
                      AudioUnitRenderActionFlags *ioActionFlags,
                      const AudioTimeStamp *inTimeStamp,
                      UInt32 inBusNumber,
                      UInt32 inNumberFrames,
                      AudioBufferList * ioData)
    {
        SInt16 samples[inNumberFrames + inNumberFrames];
        AudioBufferList bufferList;
        bufferList.mNumberBuffers = 1;
        bufferList.mBuffers[0].mData = samples;
        bufferList.mBuffers[0].mNumberChannels = 1;
        bufferList.mBuffers[0].mDataByteSize = (inNumberFrames + inNumberFrames) * sizeof(SInt16);
    
        Float32 *leftData = (Float32 *)ioData->mBuffers[0].mData;
        Float32 *rightData = (Float32 *)ioData->mBuffers[1].mData;
    
        if (*ioActionFlags & kAudioUnitRenderAction_PostRender){
            static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8);
            if (!(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)){
                for (UInt32 i = 0; i < inNumberFrames; i++) {
                    samples[i + i] = CFSwapInt16HostToBig((SInt16) SHRT_MAX * (leftData)[i]);
                    samples[i + i + 1] = CFSwapInt16HostToBig((SInt16) SHRT_MAX * (rightData)[i]);
                }
            CheckError(ExtAudioFileWriteAsync(testRecordFile, inNumberFrames, &bufferList), "ExtAudioFileWriteAsync failed");
            }
        }
        return noErr;
    }
    

提交回复
热议问题