修复MP3的内存溢出问题
This commit is contained in:
parent
c75f5872ed
commit
e0178ed5ad
@ -100,7 +100,7 @@ static void flac_free(void* p, void* pUserData)
|
|||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const drflac_allocation_callbacks callbacks = {
|
static const drflac_allocation_callbacks flac_allocation_cbs = {
|
||||||
.onMalloc = flac_malloc,
|
.onMalloc = flac_malloc,
|
||||||
.onFree = flac_free,
|
.onFree = flac_free,
|
||||||
.onRealloc = flac_realloc,
|
.onRealloc = flac_realloc,
|
||||||
@ -124,7 +124,7 @@ void music_flac_play(const char *file_name)
|
|||||||
return;
|
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) {
|
if (pFlac == NULL) {
|
||||||
elog_error(TAG, "error while opening flac file");
|
elog_error(TAG, "error while opening flac file");
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -146,7 +146,7 @@ void music_flac_play(const char *file_name)
|
|||||||
/* 如果当前是最后一个frame 则frame_count可能小于maxBlockSizeInPCMFrames 因此需要将pcm_sample初始化为全0 将空白区域静音 */
|
/* 如果当前是最后一个frame 则frame_count可能小于maxBlockSizeInPCMFrames 因此需要将pcm_sample初始化为全0 将空白区域静音 */
|
||||||
drflac_int16 *pcm_sample = malloc(pcm_sample_count * pcm_sample_size); //申请内存 存储1个PCM块
|
drflac_int16 *pcm_sample = malloc(pcm_sample_count * pcm_sample_size); //申请内存 存储1个PCM块
|
||||||
if (pcm_sample == NULL) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
memset(pcm_sample, 0, pcm_sample_count * pcm_sample_size);
|
memset(pcm_sample, 0, pcm_sample_count * pcm_sample_size);
|
||||||
|
|||||||
@ -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文件
|
* @brief 播放MP3文件
|
||||||
*
|
*
|
||||||
@ -87,7 +137,7 @@ void music_mp3_play(const char *file_name)
|
|||||||
elog_error(TAG, "error while creating mp3 decoder structure");
|
elog_error(TAG, "error while creating mp3 decoder structure");
|
||||||
goto exit;
|
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);
|
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) {
|
while(1) {
|
||||||
drmp3_int16 *pcm_sample = malloc(DRMP3_MAX_SAMPLES_PER_FRAME * sizeof(drmp3_int16));
|
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块中采样的数量(可以理解为时间层面的采样数) 不考虑声道数量与每个采样的字节数 */
|
/* 此处的framesToRead指的是PCM块中采样的数量(可以理解为时间层面的采样数) 不考虑声道数量与每个采样的字节数 */
|
||||||
uint32_t sample_count = drmp3_read_pcm_frames_s16(mp3, DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME, pcm_sample); //解码新一帧MP3数据
|
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) { //释放为解码器分配的内存
|
if (mp3 != NULL) { //释放为解码器分配的内存
|
||||||
|
drmp3_uninit(mp3);
|
||||||
free_dtcm(mp3);
|
free_dtcm(mp3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user