Я пытаюсь принять часть записи примера Apple под названием «SpeakHere» в моих целях. Все кажется прекрасным, но мне нужно добавить опцию, которая на самом деле предлагает 8-битную запись. Это соответствует спецификации, не разрешенной никакими настройками звука, поэтому мне нужно какое-то преобразование с 16 бит. Думаю, мне нужно поместить его в функцию обратного вызова.Linear PCM 16 бит до 8 бит
// ____________________________________________________________________________________
// AudioQueue callback function, called when an input buffers has been filled.
void AQRecorder::MyInputBufferHandler( void * inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp * inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription* inPacketDesc)
{
AQRecorder *aqr = (AQRecorder *)inUserData;
try {
if (inNumPackets > 0) {
// write packets to file
XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize,
inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData),
"AudioFileWritePackets failed");
aqr->mRecordPacket += inNumPackets;
}
// if we're not stopping, re-enqueue the buffe so that it gets filled again
if (aqr->IsRunning())
XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
} catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
}
}
, но, честно говоря, не знаю как. Любая идея будет оценена по достоинству.
Я думаю, вам просто нужно разделить каждую выборку по 256. Я не знаком с абстракциями и структур данных, используемых в образце, но если вы можете получить исходные данные PCM, вы просто относиться к каждому два байты как 'подписанный короткий int' и делить каждый на 256 и записывать в буфер' signed char'. Конечно, вам все равно нужно создать правильные метаданные, чтобы указать, что ваши данные являются 8-битными для каждого образца аудиосигнала PCM. – yzt