diff --git a/User/audio/audio_flac.c b/User/audio/audio_flac.c index 0248f07..b52a484 100644 --- a/User/audio/audio_flac.c +++ b/User/audio/audio_flac.c @@ -6,7 +6,10 @@ #include "elog.h" #include "heap.h" +#define DR_FLAC_NO_STDIO +#define DR_FLAC_NO_OGG #define DR_FLAC_IMPLEMENTATION +#define DR_FLAC_BUFFER_SIZE 16384 #include "dr_flac.h" const static char *TAG = "audio_flac"; @@ -18,7 +21,7 @@ static size_t flac_read(void* pUserData, void* pBufferOut, size_t bytesToRead) UINT 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) { elog_error(TAG, "file read error"); @@ -118,23 +121,25 @@ void music_flac_play(const char *file_name) } /* 初始化SAI */ - uint32_t frame_pcm_size = pFlac->maxBlockSizeInPCMFrames * pFlac->channels; - audio_hal_start(frame_pcm_size, pFlac->bitsPerSample / 8); + uint32_t pcm_sample_count = pFlac->maxBlockSizeInPCMFrames * pFlac->channels; //每一个PCM块的采样数量 + 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) { - /* 解码新一帧FLAC数据 */ - drflac_int16 *sample = malloc(frame_pcm_size * (pFlac->bitsPerSample / 8)); + drflac_int16 *sample = malloc(pcm_sample_count * (pFlac->bitsPerSample / 8)); if (sample == NULL) { - elog_error(TAG, "memory allocation failed"); - goto exit; + elog_error(TAG, "%d bytes memory allocation failed", pcm_sample_count * (pFlac->bitsPerSample / 8)); + 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 */ if (frame_count != 0) { - // elog_verbose(TAG, "writing %d bytes of pcm data", frame_count * sizeof(drflac_int16)); - audio_hal_write(sample, frame_count * pFlac->channels); + elog_verbose(TAG, "writing %d bytes of pcm data", frame_count * sizeof(drflac_int16)); + audio_hal_write(sample, pcm_sample_count * pFlac->channels); } else { //文件已经读取完毕 free(sample); elog_info(TAG, "play done"); @@ -142,13 +147,13 @@ void music_flac_play(const char *file_name) } } - audio_hal_stop(); - /* 关闭文件 */ f_close(file); free(file); exit: + audio_hal_stop(); + if (pFlac) { drflac_close(pFlac); } diff --git a/User/tasks/task_main.c b/User/tasks/task_main.c index 3289ccd..317567d 100644 --- a/User/tasks/task_main.c +++ b/User/tasks/task_main.c @@ -153,6 +153,7 @@ void task_main_entry(void *param) while (1) { music_flac_play("四季音色 - 斑光.flac"); + music_flac_play("唐九夏 - 一克拉月光.flac"); music_mp3_play("夏川椎菜 - No.1.mp3"); music_mp3_play("HoneyWorks,早見沙織 - 可愛くてごめん.mp3"); music_mp3_play("堀江由衣 - silky heart.mp3");