// ============================================================================
// 3. ЛОКАЛЬНЫЙ УМНЫЙ SPEEX_FREE
// ============================================================================
static void custom_speex_free_smart(void *ptr)
{
if (ptr == NULL) {
return;
}
// Проверяем, лежит ли указатель внутри нашего пула DTCM
if ((uint8_t *)ptr >= speex_dtcm_pool &&
(uint8_t *)ptr < (speex_dtcm_pool + SPEEX_DTCM_POOL_SIZE))
{
// Это память из DTCM-арены. Индивидуально её освобождать не нужно.
return;
}
// Проверяем, лежит ли указатель внутри нашего пула OCRAM
if ((uint8_t *)ptr >= speex_ocram_pool &&
(uint8_t *)ptr < (speex_ocram_pool + SPEEX_OCRAM_POOL_SIZE))
{
// Это память из OCRAM-арены. Тоже пропускаем.
return;
}
// Если указатель не принадлежит пулам, значит это был системный malloc (например, play_buf).
// Возвращаем память операционной системе.
free(ptr);
}
// Переопределяем макрос освобождения памяти для текущего файла mdf.c
#undef speex_free
#define speex_free(ptr) custom_speex_free_smart(ptr)