FreeCalypso > hg > fc-tourmaline
comparison src/cs/services/audio/audio_mode_load.c @ 275:79cfefc1e2b4
audio mode load: gracefully handle mode files of wrong AEC version
Unfortunately our change of enabling L1_NEW_AEC (which is necessary
in order to bring our Calypso ARM fw into match with the underlying
DSP reality) brings along a change in the audio mode file binary
format and file size - all those new tunable AEC parameters do need
to be stored somewhere, after all. But we already have existing
mode files in the old format, and setting AEC config to garbage when
loading old audio modes (which is what would happen without the
present change) is not an appealing proposition.
The solution implemented in the present change is as follows: the
audio mode loading code checks the file size, and if it differs
from the active version of T_AUDIO_MODE, the T_AUDIO_AEC_CFG structure
is cleared - set to the default (disabled AEC) for the compiled type
of AEC. We got lucky in that this varying T_AUDIO_AEC_CFG structure
sits at the end of T_AUDIO_MODE!
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 30 Jul 2021 02:55:48 +0000 |
parents | 4e78acac3d88 |
children |
comparison
equal
deleted
inserted
replaced
274:fa22012c4a39 | 275:79cfefc1e2b4 |
---|---|
96 #define CHECK_STATUS(function, param) if ( (function(&(param))) == AUDIO_ERROR ) \ | 96 #define CHECK_STATUS(function, param) if ( (function(&(param))) == AUDIO_ERROR ) \ |
97 { \ | 97 { \ |
98 return(AUDIO_ERROR); \ | 98 return(AUDIO_ERROR); \ |
99 } \ | 99 } \ |
100 | 100 |
101 /* FreeCalypso added definition for old vs new mode file handling */ | |
102 #define MODE_FILE_SIZE_NEWAEC 176 | |
103 | |
101 /********************************************************************************/ | 104 /********************************************************************************/ |
102 /* */ | 105 /* */ |
103 /* Function Name: audio_mode_load_send_status */ | 106 /* Function Name: audio_mode_load_send_status */ |
104 /* */ | 107 /* */ |
105 /* Purpose: This function sends the audio mdoe load status to the entity. */ | 108 /* Purpose: This function sends the audio mdoe load status to the entity. */ |
306 CHECK_STATUS(audio_mode_speaker_volume_write, *p_audio_volume) | 309 CHECK_STATUS(audio_mode_speaker_volume_write, *p_audio_volume) |
307 | 310 |
308 return(AUDIO_OK); | 311 return(AUDIO_OK); |
309 } | 312 } |
310 | 313 |
314 /* FreeCalypso added function */ | |
315 static void set_default_aec(T_AUDIO_AEC_CFG *aec) | |
316 { | |
317 aec->aec_enable = 0; | |
318 #if (L1_NEW_AEC) | |
319 aec->continuous_filtering = 0; | |
320 aec->granularity_attenuation = 1; | |
321 aec->smoothing_coefficient = 0x7FFF; | |
322 aec->max_echo_suppression_level = AUDIO_MAX_ECHO_12dB; | |
323 aec->vad_factor = 0x4000; | |
324 aec->absolute_threshold = 0x32; | |
325 aec->factor_asd_filtering = 0x1000; | |
326 aec->factor_asd_muting = 0x1000; | |
327 aec->aec_visibility = 0; | |
328 #else | |
329 aec->aec_mode = 0; | |
330 aec->echo_suppression_level = 0; | |
331 #endif | |
332 aec->noise_suppression_enable = 0; | |
333 aec->noise_suppression_level = 0; | |
334 } | |
335 | |
311 /********************************************************************************/ | 336 /********************************************************************************/ |
312 /* */ | 337 /* */ |
313 /* Function Name: audio_mode_load_manager */ | 338 /* Function Name: audio_mode_load_manager */ |
314 /* */ | 339 /* */ |
315 /* Purpose: This function manages the audio mode load services. */ | 340 /* Purpose: This function manages the audio mode load services. */ |
330 void audio_mode_load_manager (T_RV_HDR *p_message) | 355 void audio_mode_load_manager (T_RV_HDR *p_message) |
331 { | 356 { |
332 T_AUDIO_SPEAKER_LEVEL audio_volume; | 357 T_AUDIO_SPEAKER_LEVEL audio_volume; |
333 T_RVF_MB_STATUS mb_status; | 358 T_RVF_MB_STATUS mb_status; |
334 UINT8 message_to_confirm; | 359 UINT8 message_to_confirm; |
360 T_FFS_SIZE rdsize; | |
335 #ifdef _WINDOWS | 361 #ifdef _WINDOWS |
336 INT8 *p_read, *p_write; | 362 INT8 *p_read, *p_write; |
337 UINT8 i; | 363 UINT8 i; |
338 #endif | 364 #endif |
339 | 365 |
341 { | 367 { |
342 case AUDIO_MODE_LOAD_IDLE: | 368 case AUDIO_MODE_LOAD_IDLE: |
343 { | 369 { |
344 /* allocate the buffer for the current Audio mode */ | 370 /* allocate the buffer for the current Audio mode */ |
345 mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, | 371 mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, |
346 sizeof (T_AUDIO_MODE), | 372 MODE_FILE_SIZE_NEWAEC, |
347 (T_RVF_BUFFER **) (&(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode))); | 373 (T_RVF_BUFFER **) (&(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode))); |
348 /* If insufficient resources, then report a memory error and abort. */ | 374 /* If insufficient resources, then report a memory error and abort. */ |
349 if (mb_status == RVF_RED) | 375 if (mb_status == RVF_RED) |
350 { | 376 { |
351 AUDIO_SEND_TRACE("AUDIO MODE LOAD: not enough memory to allocate the audio mode buffer", RV_TRACE_LEVEL_ERROR); | 377 AUDIO_SEND_TRACE("AUDIO MODE LOAD: not enough memory to allocate the audio mode buffer", RV_TRACE_LEVEL_ERROR); |
364 } | 390 } |
365 #endif | 391 #endif |
366 #else | 392 #else |
367 /* Load the audio mode structure from the FFS */ | 393 /* Load the audio mode structure from the FFS */ |
368 | 394 |
369 if ( ffs_read (((T_AUDIO_MODE_LOAD_REQ *)p_message)->audio_ffs_fd, | 395 rdsize = ffs_read (((T_AUDIO_MODE_LOAD_REQ *)p_message)->audio_ffs_fd, |
370 (void *)(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode), | 396 (void *)(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode), |
371 sizeof(T_AUDIO_MODE)) < EFFS_OK ) | 397 MODE_FILE_SIZE_NEWAEC); |
398 if ( rdsize < EFFS_OK ) | |
372 { | 399 { |
373 AUDIO_SEND_TRACE("AUDIO MODE LOAD: impossible to load the current audio mode", RV_TRACE_LEVEL_ERROR); | 400 AUDIO_SEND_TRACE("AUDIO MODE LOAD: impossible to load the current audio mode", RV_TRACE_LEVEL_ERROR); |
374 | 401 |
375 /* Close the files */ | 402 /* Close the files */ |
376 ffs_close(((T_AUDIO_MODE_LOAD_REQ *)p_message)->audio_ffs_fd); | 403 ffs_close(((T_AUDIO_MODE_LOAD_REQ *)p_message)->audio_ffs_fd); |
380 rvf_free_buf((T_RVF_BUFFER *)(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode)); | 407 rvf_free_buf((T_RVF_BUFFER *)(p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode)); |
381 | 408 |
382 /* send the status message */ | 409 /* send the status message */ |
383 audio_mode_load_send_status (AUDIO_ERROR, ((T_AUDIO_MODE_LOAD_REQ *)p_message)->return_path); | 410 audio_mode_load_send_status (AUDIO_ERROR, ((T_AUDIO_MODE_LOAD_REQ *)p_message)->return_path); |
384 return; | 411 return; |
412 } | |
413 if ( rdsize != sizeof(T_AUDIO_MODE) ) | |
414 { | |
415 /* wrong version - clear the AEC part */ | |
416 set_default_aec(&p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode->audio_microphone_speaker_loop_setting.aec); | |
385 } | 417 } |
386 #endif | 418 #endif |
387 | 419 |
388 /* Set the audio mode structure */ | 420 /* Set the audio mode structure */ |
389 if ( (audio_mode_set((p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode), | 421 if ( (audio_mode_set((p_audio_gbl_var->audio_mode_var.audio_mode_load_var.p_audio_mode), |