diff --git a/User/audio/audio_flac.c b/User/audio/audio_flac.c index 172ae87..18700c8 100644 --- a/User/audio/audio_flac.c +++ b/User/audio/audio_flac.c @@ -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); diff --git a/User/audio/audio_mp3.c b/User/audio/audio_mp3.c index 44ea9b4..5e1fecc 100644 --- a/User/audio/audio_mp3.c +++ b/User/audio/audio_mp3.c @@ -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); } }