修复MP3的内存溢出问题

This commit is contained in:
wangyz1997 2024-04-09 23:56:39 +08:00
parent c75f5872ed
commit e0178ed5ad
2 changed files with 59 additions and 4 deletions

View File

@ -100,7 +100,7 @@ static void flac_free(void* p, void* pUserData)
free(p);
}
static const drflac_allocation_callbacks callbacks = {
static const drflac_allocation_callbacks flac_allocation_cbs = {
.onMalloc = flac_malloc,
.onFree = flac_free,
.onRealloc = flac_realloc,
@ -124,7 +124,7 @@ void music_flac_play(const char *file_name)
return;
}
drflac* pFlac = drflac_open(flac_read, flac_seek, file, &callbacks); //创建flac解码器
drflac* pFlac = drflac_open(flac_read, flac_seek, file, &flac_allocation_cbs); //创建flac解码器
if (pFlac == NULL) {
elog_error(TAG, "error while opening flac file");
goto exit;
@ -146,7 +146,7 @@ void music_flac_play(const char *file_name)
/* 如果当前是最后一个frame 则frame_count可能小于maxBlockSizeInPCMFrames 因此需要将pcm_sample初始化为全0 将空白区域静音 */
drflac_int16 *pcm_sample = malloc(pcm_sample_count * pcm_sample_size); //申请内存 存储1个PCM块
if (pcm_sample == NULL) {
elog_error(TAG, "memory allocation failed, size=%d bytes", pcm_sample_count * pcm_sample_size);
elog_error(TAG, "music_flac_play: sample buffer allocation failed, size=%d bytes", pcm_sample_count * pcm_sample_size);
break;
}
memset(pcm_sample, 0, pcm_sample_count * pcm_sample_size);

View File

@ -57,6 +57,56 @@ static drmp3_bool32 mp3_seek(void* pUserData, int offset, drmp3_seek_origin orig
}
}
static void* mp3_malloc(size_t sz, void* pUserData)
{
UNUSED(pUserData);
void *ptr = malloc(sz);
// tlsf_pool_statistics *axi_heap_statistics = get_axi_heap_statistics();
// tlsf_pool_statistics *ahb_heap_statistics = get_ahb_heap_statistics();
// elog_debug(TAG, "mp3_malloc: allocated %d bytes memory @%p, free memory: AXI %d bytes, AHB %d bytes",
// sz, ptr, axi_heap_statistics->free_size, ahb_heap_statistics->free_size);
if (ptr == NULL) {
elog_error(TAG, "mp3_malloc: error while allocating %d bytes of memory", sz);
}
return ptr;
}
static void* mp3_realloc(void* p, size_t sz, void* pUserData)
{
UNUSED(pUserData);
void *ptr = realloc(p, sz);
if (ptr == NULL) {
elog_error(TAG, "mp3_realloc: error while allocating %d bytes of new memory", sz);
}
return ptr;
}
static void mp3_free(void* p, void* pUserData)
{
UNUSED(pUserData);
// tlsf_pool_statistics *axi_heap_statistics = get_axi_heap_statistics();
// tlsf_pool_statistics *ahb_heap_statistics = get_ahb_heap_statistics();
// elog_debug(TAG, "mp3_free: memory freed @%p, free memory: AXI %d bytes, AHB %d bytes",
// p, axi_heap_statistics->free_size, ahb_heap_statistics->free_size);
free(p);
}
static const drmp3_allocation_callbacks mp3_allocation_cbs = {
.onMalloc = mp3_malloc,
.onFree = mp3_free,
.onRealloc = mp3_realloc,
.pUserData = NULL
};
/**
* @brief MP3文件
*
@ -87,7 +137,7 @@ void music_mp3_play(const char *file_name)
elog_error(TAG, "error while creating mp3 decoder structure");
goto exit;
}
drmp3_init(mp3, mp3_read, mp3_seek, file, NULL); //初始化MP3解码器 当不使用stdio API时pAllocationCallbacks无实际作用
drmp3_init(mp3, mp3_read, mp3_seek, file, &mp3_allocation_cbs); //初始化MP3解码器
elog_info(TAG, "music_mp3_play: channels=%d, sampleRate=%d", mp3->channels, mp3->sampleRate);
@ -99,6 +149,10 @@ void music_mp3_play(const char *file_name)
while(1) {
drmp3_int16 *pcm_sample = malloc(DRMP3_MAX_SAMPLES_PER_FRAME * sizeof(drmp3_int16));
if (pcm_sample == NULL) {
elog_error(TAG, "music_mp3_play: sample buffer allocation failed, size=%d bytes", DRMP3_MAX_SAMPLES_PER_FRAME * sizeof(drmp3_int16));
break;
}
/* 此处的framesToRead指的是PCM块中采样的数量(可以理解为时间层面的采样数) 不考虑声道数量与每个采样的字节数 */
uint32_t sample_count = drmp3_read_pcm_frames_s16(mp3, DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME, pcm_sample); //解码新一帧MP3数据
@ -129,6 +183,7 @@ exit:
}
if (mp3 != NULL) { //释放为解码器分配的内存
drmp3_uninit(mp3);
free_dtcm(mp3);
}
}