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