Search code examples
iosobjective-ccocoa-touchaudioqueueaudioqueueservices

Audio Queue Interface can deal with 40ms Audio Frame?


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.


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