int audioCapturerGetFrame()

in source/T31/T31AudioCapturer.c [241:301]


int audioCapturerGetFrame(AudioCapturerHandle handle, void* pFrameDataBuffer, const size_t frameDataBufferSize, uint64_t* pTimestamp,
                          size_t* pFrameSize)
{
    T31_HANDLE_NULL_CHECK(handle);
    T31_HANDLE_GET(handle);

    T31_HANDLE_STATUS_CHECK(t31Handle, AUD_CAP_STATUS_STREAM_ON);

    if (!pFrameDataBuffer || !pTimestamp || !pFrameSize) {
        return -EINVAL;
    }

    int ret = 0;
    IMPAudioFrame rawFrame = {0};

    if (IMP_AI_PollingFrame(T31_MIC_DEV_ID, T31_MIC_CHN_ID, T31_POLLING_STREAM_TIMEOUT_MS)) {
        LOG("IMP_AI_PollingFrame failed");
        return -EAGAIN;
    }

    // Get raw PCM
    if (IMP_AI_GetFrame(T31_MIC_DEV_ID, T31_MIC_CHN_ID, &rawFrame, BLOCK)) {
        LOG("IMP_AI_GetFrame failed");
        return -EAGAIN;
    }

    // Encode frame
    if (t31Handle->format != AUD_FMT_PCM) {
        // Need to encode
        IMPAudioStream encodeStream = {0};

        if (IMP_AENC_SendFrame(T31_MIC_ENC_CHN_ID, &rawFrame)) {
            LOG("IMP_AENC_SendFrame failed");
            ret = -EAGAIN;
        } else if (IMP_AENC_PollingStream(T31_MIC_ENC_CHN_ID, T31_POLLING_STREAM_TIMEOUT_MS)) {
            LOG("IMP_AENC_PollingStream failed");
            ret = -EAGAIN;
        } else if (IMP_AENC_GetStream(T31_MIC_ENC_CHN_ID, &encodeStream, BLOCK)) {
            LOG("IMP_AENC_GetStream failed");
            ret - EAGAIN;
        } else if (frameDataBufferSize < encodeStream.len) {
            LOG("FrameDataBufferSize(%d) < frameSize(%d), frame dropped", frameDataBufferSize, encodeStream.len);
            *pFrameSize = 0;
            ret = -ENOMEM;
        } else {
            memcpy(pFrameDataBuffer, (void*) encodeStream.stream, encodeStream.len);
            *pFrameSize = encodeStream.len;
            *pTimestamp = IMP_System_GetTimeStamp();
        }

        IMP_AENC_ReleaseStream(T31_MIC_ENC_CHN_ID, &encodeStream);
    } else {
        memcpy(pFrameDataBuffer, (void*) rawFrame.virAddr, rawFrame.len);
        *pFrameSize = rawFrame.len;
        *pTimestamp = IMP_System_GetTimeStamp();
    }

    IMP_AI_ReleaseFrame(T31_MIC_DEV_ID, T31_MIC_CHN_ID, &rawFrame);

    return ret;
}