Question

I am trying to record the audio in segment of 40ms. Audio Queue Interface can deal with 40ms Audio Frame? If 'Yes' then how can we achieve it?

Thanks.

Was it helpful?

Solution

yes, its possible , you need to set configure AudioQueue Accordingly,

Basically the AudioQueue Buffer size, has to be set for 40ms, so it would be around,

int AQRecorder::ComputeRecordBufferSize(const AudioStreamBasicDescription *format, float seconds)
{
    int packets, frames, bytes = 0;
    try {
        frames = (int)ceil(seconds * format->mSampleRate);

        if (format->mBytesPerFrame > 0)
            bytes = frames * format->mBytesPerFrame;
        else {
            UInt32 maxPacketSize;
            if (format->mBytesPerPacket > 0)
                maxPacketSize = format->mBytesPerPacket;    // constant packet size
            else {
                UInt32 propertySize = sizeof(maxPacketSize);
                XThrowIfError(AudioQueueGetProperty(mQueue, kAudioQueueProperty_MaximumOutputPacketSize, &maxPacketSize,
                                                    &propertySize), "couldn't get queue's maximum output packet size");
            }
            if (format->mFramesPerPacket > 0)
                packets = frames / format->mFramesPerPacket;
            else
                packets = frames;   // worst-case scenario: 1 frame in a packet
            if (packets == 0)       // sanity check
                packets = 1;
            bytes = packets * maxPacketSize;
        }
    } catch (CAXException e) {
        char buf[256];
        return 0;
    }   
    return bytes;
}

and to set the format,

void AQRecorder::SetupAudioFormat(UInt32 inFormatID)
{
    AudioStreamBasicDescription sRecordFormat;
    FillOutASBDForLPCM (sRecordFormat,
                        SAMPLING_RATE,
                        1,
                        8*BYTES_PER_PACKET,
                        8*BYTES_PER_PACKET,
                        false,
                        false
                        );
    memset(&mRecordFormat, 0, sizeof(mRecordFormat));

    mRecordFormat.SetFrom(sRecordFormat);
}

for my case, values of these Macros are,

#define SAMPLING_RATE 16000
#define kNumberRecordBuffers    3
#define BYTES_PER_PACKET 2
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top