Я пытаюсь реализовать воспроизведение звука PCM, полученного от удаленного сервера через сокет. Вот мой предыдущий вопрос ссылка . Это прекрасно работает, так как я использую круговой буфер для постоянной подачи во входящий буфер.
Однако у меня проблема в том, что из-за громкого шума издается выходной буфер. Это происходит, когда я начинаю использовать AudioOutputUnitStart (_audioUnit) и когда нет буфера для воспроизведения.
Я подозреваю, что мне нужно исправить это в моей функции OutputRenderCallback ниже, или, может быть, есть что-то еще, что мне нужно сделать:
static OSStatus OutputRenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData){
Test *output = (__bridge Test*)inRefCon;
TPCircularBuffer *circularBuffer = [output outputShouldUseCircularBuffer];
if( !circularBuffer ){
SInt32 *left = (SInt32*)ioData->mBuffers[0].mData;
for(int i = 0; i < inNumberFrames; i++ ){
left[ i ] = 0.0f;
}
return noErr;
};
int32_t bytesToCopy = ioData->mBuffers[0].mDataByteSize;
SInt16* outputBuffer = ioData->mBuffers[0].mData;
uint32_t availableBytes;
SInt16 *sourceBuffer = TPCircularBufferTail(circularBuffer, &availableBytes);
int32_t amount = MIN(bytesToCopy,availableBytes);
memcpy(outputBuffer, sourceBuffer, amount);
TPCircularBufferConsume(circularBuffer,amount);
return noErr;
}
Я очень ценю вашу помощь. Спасибо.