Линейный PCM от 16 бит до 8 бит

Я пытаюсь приспособить записывающую часть примера Apple под названием «SpeakHere» для своих целей. Кажется, все хорошо, но мне нужно добавить опцию, которая на самом деле предлагает 8-битную запись.
Это в соответствии со спецификацией, не допускаемой никакими настройками звука, поэтому мне нужно какое-то преобразование из 16 бит.
Я думаю, что мне нужно поместить его в функцию обратного вызова.

// ____________________________________________________________________________________
// 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));
}
}

но, если честно, не знаю как. Любая идея будет оценена.

0

Решение

почему бы вам не попробовать инициализировать вашу аудио-очередь чем-то подобным?

    aqData.mDataFormat.mFormatID = kAudioFormatLinearPCM;        // 2
aqData.mDataFormat.mSampleRate = 44100.0;                    // 3
aqData.mDataFormat.mChannelsPerFrame = 1;                    // 4
aqData.mDataFormat.mBitsPerChannel = 8;                     // 5
aqData.mDataFormat.mBytesPerPacket =                         // 6
aqData.mDataFormat.mBytesPerFrame =
aqData.mDataFormat.mChannelsPerFrame * sizeof (SInt8);
aqData.mDataFormat.mFramesPerPacket = 1;                     // 7

AudioFileTypeID fileType = kAudioFileAIFFType;               // 8
aqData.mDataFormat.mFormatFlags =                            // 9
kLinearPCMFormatFlagIsBigEndian
| kLinearPCMFormatFlagIsSignedInteger
| kLinearPCMFormatFlagIsPacked;
0

Другие решения

После тщательного изучения и проверки я обнаружил, что мне не нужно преобразование, а просто нужно установить разные флаги формата.

mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian;
mRecordFormat.mBitsPerChannel = 8;
0