audio central: cómo puede un paquete = un byte cuando claramente un paquete = 4 bytes

Estaba revisando los servicios básicos de conversión de audio en elAprendiendo Core Audio y me impresionó este ejemplo en suCódigo de muestra:

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

Date cuenta cómoframeCount Se define comopacketsPerBuffer..packetsPerBuffer se define aquí:

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

la parte que me dejó perplejo esAudioFileWritePackets se llama .. en eldocumentación Los parámetros tercero y quinto de AudioFileWritePackets se definen como:

inNumBytes El número de bytes de datos de audio que se están escribiendo.

ioNumPackets En la entrada, un puntero a la cantidad de paquetes para escribir. En la salida, un puntero al número de paquetes realmente escritos ...

sin embargo, en el código se dan ambos parámetros frameCount ... ¿cómo es esto posible? Sé que con datos PCM 1 cuadro = 1 paquete:

// 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;

pero el mismo formato lPCM también indica claramente que hay 4 bytes por paquete (= 4 bytes por trama).

¿Entonces, cómo funciona esto? (Lo mismo se aplica al otro ejemplo en el mismo capítulo que usaAudioConverterFillComplexBuffer en lugar deExtAudioFileRead, y usa paquetes en lugar de marcos ... pero es lo mismo)

Respuestas a la pregunta(1)

Su respuesta a la pregunta