2024-08-02 01:56 AM - edited 2024-08-02 01:59 AM
I would like to read the level of audio input signal to use like a vu-meter instead of use analog input.
This is my code but I read always 0dB on both channels.
void AUDIO_PLAYER_Init2()
{
/* Allocat mem for Smr */
pSmrPersistentMem = malloc(smr_persistent_mem_size); /* smr_persistent_mem_size 0x188 */
pSmrScratchMem = malloc(smr_scratch_mem_size); /* smr_scratch_mem_size 0xF04 */
if (BSP_AUDIO_IN_Init(INPUT_DEVICE_INPUT_LINE_1, 80, AUDIO_FREQUENCY_48K) != 0)
LCD_LOG_SetHeader((uint8_t *)"Audio SMR Application KO");
else
LCD_LOG_SetHeader((uint8_t *)"Audio SMR Application OK");
}
void Audio_Process2()
{
int32_t error = SMR_ERROR_NONE;
__HAL_RCC_CRC_CLK_ENABLE();
CRC->CR = CRC_CR_RESET;
error = smr_reset(pSmrPersistentMem, pSmrScratchMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err0--", LEFT_MODE);
return (AUDIO_ERROR_SMR);
}
smr_static_param.sampling_rate = 48000; /* only sampling rate supported */
error = smr_setParam(&smr_static_param, pSmrPersistentMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err1--", LEFT_MODE);
return (AUDIO_ERROR_SMR);
}
smr_dynamic_param.enable = 1; /* SMR module enabler */
smr_dynamic_param.averaging_time = AUDIO_CFG_SMR_AVGTIME_DEFAULT;
smr_dynamic_param.filter_type = SMR_PREFILTER_AWEIGHTING;
error = smr_setConfig(&smr_dynamic_param, pSmrPersistentMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err2--", LEFT_MODE);
return (AUDIO_ERROR_SMR);
}
error = smr_getConfig(&smr_dynamic_param, pSmrPersistentMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err4--", LEFT_MODE);
return AUDIO_ERROR_SMR;
}
BufferHandler.nb_bytes_per_Sample = 2; /* 16-bit */
BufferHandler.nb_channels = 2; /* stereo */
BufferHandler.data_ptr = PCM_Data_SMR;
BufferHandler.buffer_size = 32/2; /* just half buffer is process (size per channel) */
BufferHandler.mode = INTERLEAVED;
BufferHandler.data_ptr = &BufferCtl.buff[AUDIO_OUT_BUFFER_SIZE /2];
error = smr_process(pBufferHandler, pBufferHandler, pSmrPersistentMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err5--", LEFT_MODE);
return (AUDIO_ERROR_SMR);
}
error = smr_getConfig(&smr_dynamic_param, pSmrPersistentMem);
if (error != SMR_ERROR_NONE)
{
BSP_LCD_DisplayStringAt(10, 20, (uint8_t *)"--err6--", LEFT_MODE);
return AUDIO_ERROR_SMR;
}
sprintf((char *)str_pwr, "Left mean power: %ld dB",(int32_t)((float)smr_dynamic_param.mean_level_left*0.25));
BSP_LCD_DisplayStringAt(CHAR(0), LINE(10), (uint8_t *)str_pwr, LEFT_MODE);
sprintf((char *)str_pwr, "Right mean power: %ld dB",(int32_t)((float)smr_dynamic_param.mean_level_right*0.25));
BSP_LCD_DisplayStringAt(CHAR(0), LINE(11), (uint8_t *)str_pwr, LEFT_MODE);
}
2024-08-02 03:10 AM
BSP_AUDIO_IN_Init(INPUT_DEVICE_INPUT_LINE_1, 80, AUDIO_FREQUENCY_48K)
doesn't match the implentation in
hth
KnarfB
2024-08-02 03:33 AM
@aciuf wrote:I would like to read the level of audio input signal
What "audio input signal"? On what board?
@aciuf wrote:but I read always 0dB on both channels.
Have you checked that there is actually any signal present at all?
Is the signal sufficient to read above 0 dB ?
@aciuf wrote:This is my code
So what testing / investigation / debugging have you done on your code to find what's wrong with it?