flac可正常播放,存在内存泄漏问题

This commit is contained in:
wangyz1997 2024-04-09 01:14:27 +08:00
parent 6f0b87e6bb
commit ceb750efe4
2 changed files with 19 additions and 13 deletions

View File

@ -6,7 +6,10 @@
#include "elog.h" #include "elog.h"
#include "heap.h" #include "heap.h"
#define DR_FLAC_NO_STDIO
#define DR_FLAC_NO_OGG
#define DR_FLAC_IMPLEMENTATION #define DR_FLAC_IMPLEMENTATION
#define DR_FLAC_BUFFER_SIZE 16384
#include "dr_flac.h" #include "dr_flac.h"
const static char *TAG = "audio_flac"; const static char *TAG = "audio_flac";
@ -18,7 +21,7 @@ static size_t flac_read(void* pUserData, void* pBufferOut, size_t bytesToRead)
UINT br; UINT br;
FRESULT f_result = f_read(pUserData, pBufferOut, bytesToRead, &br); //从文件中读取新的内容 FRESULT f_result = f_read(pUserData, pBufferOut, bytesToRead, &br); //从文件中读取新的内容
elog_verbose(TAG, "flac_read: reading %d bytes, %d bytes read", bytesToRead, br); // elog_verbose(TAG, "flac_read: reading %d bytes, %d bytes read", bytesToRead, br);
if (f_result != FR_OK) { if (f_result != FR_OK) {
elog_error(TAG, "file read error"); elog_error(TAG, "file read error");
@ -118,23 +121,25 @@ void music_flac_play(const char *file_name)
} }
/* 初始化SAI */ /* 初始化SAI */
uint32_t frame_pcm_size = pFlac->maxBlockSizeInPCMFrames * pFlac->channels; uint32_t pcm_sample_count = pFlac->maxBlockSizeInPCMFrames * pFlac->channels; //每一个PCM块的采样数量
audio_hal_start(frame_pcm_size, pFlac->bitsPerSample / 8); audio_hal_start(pcm_sample_count, pFlac->bitsPerSample / 8);
elog_info(TAG, "start playing"); elog_info(TAG, "music_flac_play: maxBlockSizeInPCMFrames=%d, channels=%d, bitsPerSample=%d",
pFlac->maxBlockSizeInPCMFrames, pFlac->channels, pFlac->bitsPerSample);
while(1) { while(1) {
/* 解码新一帧FLAC数据 */ drflac_int16 *sample = malloc(pcm_sample_count * (pFlac->bitsPerSample / 8));
drflac_int16 *sample = malloc(frame_pcm_size * (pFlac->bitsPerSample / 8));
if (sample == NULL) { if (sample == NULL) {
elog_error(TAG, "memory allocation failed"); elog_error(TAG, "%d bytes memory allocation failed", pcm_sample_count * (pFlac->bitsPerSample / 8));
goto exit; break;
} }
uint32_t frame_count = drflac_read_pcm_frames_s16(pFlac, frame_pcm_size, sample); /* 解码新一帧FLAC数据 */
uint32_t frame_count = drflac_read_pcm_frames_s16(pFlac, pFlac->maxBlockSizeInPCMFrames, sample);
/* 将解码后的PCM数据写入SAI */ /* 将解码后的PCM数据写入SAI */
if (frame_count != 0) { if (frame_count != 0) {
// elog_verbose(TAG, "writing %d bytes of pcm data", frame_count * sizeof(drflac_int16)); elog_verbose(TAG, "writing %d bytes of pcm data", frame_count * sizeof(drflac_int16));
audio_hal_write(sample, frame_count * pFlac->channels); audio_hal_write(sample, pcm_sample_count * pFlac->channels);
} else { //文件已经读取完毕 } else { //文件已经读取完毕
free(sample); free(sample);
elog_info(TAG, "play done"); elog_info(TAG, "play done");
@ -142,13 +147,13 @@ void music_flac_play(const char *file_name)
} }
} }
audio_hal_stop();
/* 关闭文件 */ /* 关闭文件 */
f_close(file); f_close(file);
free(file); free(file);
exit: exit:
audio_hal_stop();
if (pFlac) { if (pFlac) {
drflac_close(pFlac); drflac_close(pFlac);
} }

View File

@ -153,6 +153,7 @@ void task_main_entry(void *param)
while (1) { while (1) {
music_flac_play("四季音色 - 斑光.flac"); music_flac_play("四季音色 - 斑光.flac");
music_flac_play("唐九夏 - 一克拉月光.flac");
music_mp3_play("夏川椎菜 - No.1.mp3"); music_mp3_play("夏川椎菜 - No.1.mp3");
music_mp3_play("HoneyWorks,早見沙織 - 可愛くてごめん.mp3"); music_mp3_play("HoneyWorks,早見沙織 - 可愛くてごめん.mp3");
music_mp3_play("堀江由衣 - silky heart.mp3"); music_mp3_play("堀江由衣 - silky heart.mp3");