core audio: como pode um pacote = um byte quando claramente um pacote = 4 bytes

Eu estava passando por serviços de conversão de áudio principais noAprendendo Core Audio e fiquei impressionado com este exemplo em suaCódigo de amostra:

while(1)
{
    // wrap the destination buffer in an AudioBufferList
    AudioBufferList convertedData;
    convertedData.mNumberBuffers = 1;
    convertedData.mBuffers[0].mNumberChannels = mySettings->outputFormat.mChannelsPerFrame;
    convertedData.mBuffers[0].mDataByteSize = outputBufferSize;
    convertedData.mBuffers[0].mData = outputBuffer;

    UInt32 frameCount = packetsPerBuffer;

    // read from the extaudiofile
    CheckResult(ExtAudioFileRead(mySettings->inputFile,
                                 &frameCount,
                                 &convertedData),
                "Couldn't read from input file");

    if (frameCount == 0) {
        printf ("done reading from file");
        return;
    }

    // write the converted data to the output file
    CheckResult (AudioFileWritePackets(mySettings->outputFile,
                                       FALSE,
                                       frameCount,
                                       NULL,
                                       outputFilePacketPosition / mySettings->outputFormat.mBytesPerPacket, 
                                       &frameCount,
                                       convertedData.mBuffers[0].mData),
                 "Couldn't write packets to file");

    // advance the output file write location
    outputFilePacketPosition += (frameCount * mySettings->outputFormat.mBytesPerPacket);
}

Note comoframeCount é definido comopacketsPerBuffer..packetsPerBuffer é definido aqui:

UInt32 outputBufferSize = 32 * 1024; // 32 KB is a good starting point
UInt32 sizePerPacket = mySettings->outputFormat.mBytesPerPacket;    
UInt32 packetsPerBuffer = outputBufferSize / sizePerPacket;

a parte que me impressionou éAudioFileWritePackets é chamado .. nodocumentação AudioFileWritePackets terceiro e quinto parâmetros são definidos como:

inNumBytes O número de bytes de dados de áudio sendo gravados.

ioNumPackets Na entrada, um ponteiro para o número de pacotes a serem gravados. Na saída, um ponteiro para o número de pacotes realmente escritos ..

ainda no código ambos os parâmetros são dados frameCount .. como isso é possível? Eu sei com dados PCM 1 frame = 1 pacote:

// define the ouput format. AudioConverter requires that one of the data formats be LPCM
audioConverterSettings.outputFormat.mSampleRate = 44100.0;
audioConverterSettings.outputFormat.mFormatID = kAudioFormatLinearPCM;
audioConverterSettings.outputFormat.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioConverterSettings.outputFormat.mBytesPerPacket = 4;
audioConverterSettings.outputFormat.mFramesPerPacket = 1;
audioConverterSettings.outputFormat.mBytesPerFrame = 4;
audioConverterSettings.outputFormat.mChannelsPerFrame = 2;
audioConverterSettings.outputFormat.mBitsPerChannel = 16;

mas a mesma formatação lPCM também afirma claramente que existem 4 bytes por pacote (= 4 bytes por quadro).

Então, como isso funciona? (o mesmo se aplica ao outro exemplo no mesmo capítulo que usaAudioConverterFillComplexBuffer ao invés deExtAudioFileReade usa pacotes em vez de quadros ... mas é a mesma coisa)

questionAnswers(1)

yourAnswerToTheQuestion