From b482b46e0ba70b78b46c981fe6eab69cf705728e Mon Sep 17 00:00:00 2001 From: wangyz1997 Date: Mon, 8 Apr 2024 23:51:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dflac=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/audio/audio_flac.c | 23 +++++++++++++---------- User/audio/audio_hal.c | 28 ++++++++++++++-------------- User/tasks/task_main.c | 1 + User/utils/heap_freertos.c | 4 ++-- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/User/audio/audio_flac.c b/User/audio/audio_flac.c index 0248f07..c2371c0 100644 --- a/User/audio/audio_flac.c +++ b/User/audio/audio_flac.c @@ -6,6 +6,8 @@ #include "elog.h" #include "heap.h" +#define DR_FLAC_NO_STDIO +#define DR_FLAC_NO_OGG #define DR_FLAC_IMPLEMENTATION #include "dr_flac.h" @@ -18,7 +20,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"); @@ -122,19 +124,19 @@ void music_flac_play(const char *file_name) audio_hal_start(frame_pcm_size, pFlac->bitsPerSample / 8); elog_info(TAG, "start playing"); + drflac_int16 *sample = malloc(frame_pcm_size * (pFlac->bitsPerSample / 8)); + // if (sample == NULL) { + // elog_error(TAG, "%d bytes memory allocation failed", frame_pcm_size * (pFlac->bitsPerSample / 8)); + // break; + // } while(1) { /* 解码新一帧FLAC数据 */ - drflac_int16 *sample = malloc(frame_pcm_size * (pFlac->bitsPerSample / 8)); - if (sample == NULL) { - elog_error(TAG, "memory allocation failed"); - goto exit; - } - uint32_t frame_count = drflac_read_pcm_frames_s16(pFlac, frame_pcm_size, sample); + 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); + audio_hal_write(sample, frame_pcm_size * pFlac->channels); } else { //文件已经读取完毕 free(sample); elog_info(TAG, "play done"); @@ -142,13 +144,14 @@ void music_flac_play(const char *file_name) } } - audio_hal_stop(); - /* 关闭文件 */ f_close(file); free(file); exit: + audio_hal_stop(); + drflac_close(pFlac); + if (pFlac) { drflac_close(pFlac); } diff --git a/User/audio/audio_hal.c b/User/audio/audio_hal.c index 07e92d9..d7ad74b 100644 --- a/User/audio/audio_hal.c +++ b/User/audio/audio_hal.c @@ -20,11 +20,11 @@ static uint32_t audio_buffer_length = 0; void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai) { BaseType_t need_yield = pdFALSE; - audio_sample_t sample; + // audio_sample_t sample; - if (xQueueReceiveFromISR(audio_queue, &sample, &need_yield) == pdTRUE) { - memcpy(&audio_buffer[0], sample.buffer_ptr, sample.buffer_size); //复制到第一个缓冲区 - free(sample.buffer_ptr); //释放使用完的缓冲区 + if (xQueueReceiveFromISR(audio_queue, &audio_buffer[0], &need_yield) == pdTRUE) { + // memcpy(&audio_buffer[0], sample.buffer_ptr, sample.buffer_size); //复制到第一个缓冲区 + // free(sample.buffer_ptr); //释放使用完的缓冲区 } HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET); @@ -34,11 +34,11 @@ void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai) void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai) { BaseType_t need_yield = pdFALSE; - audio_sample_t sample; + // audio_sample_t sample; - if (xQueueReceiveFromISR(audio_queue, &sample, &need_yield) == pdTRUE) { - memcpy(&audio_buffer[audio_buffer_length / 2], sample.buffer_ptr, sample.buffer_size); //复制到第二个缓冲区 - free(sample.buffer_ptr); //释放使用完的缓冲区 + if (xQueueReceiveFromISR(audio_queue, &audio_buffer[audio_buffer_length / 2], &need_yield) == pdTRUE) { + // memcpy(&audio_buffer[audio_buffer_length / 2], sample.buffer_ptr, sample.buffer_size); //复制到第二个缓冲区 + // free(sample.buffer_ptr); //释放使用完的缓冲区 } HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET); @@ -62,7 +62,7 @@ void audio_hal_start(uint32_t sample_count, uint8_t sample_size) elog_warn(TAG, "audio_hal_start: audio_queue is not deleted"); vQueueDelete(audio_queue); } - audio_queue = xQueueCreate(AUDIO_HAL_SAMPLE_QUEUE_SIZE, sizeof(audio_sample_t)); + audio_queue = xQueueCreate(AUDIO_HAL_SAMPLE_QUEUE_SIZE, audio_buffer_length/2); HAL_SAI_Transmit_DMA(&hsai_BlockB1, audio_buffer, sample_count * 2); //开始DMA循环发送 } @@ -84,14 +84,14 @@ void audio_hal_write(void *buffer_ptr, uint32_t buffer_size) return; } - audio_sample_t sample = { - .buffer_ptr = buffer_ptr, - .buffer_size = buffer_size - }; + // audio_sample_t sample = { + // .buffer_ptr = buffer_ptr, + // .buffer_size = buffer_size + // }; if (uxQueueSpacesAvailable(audio_queue) == AUDIO_HAL_SAMPLE_QUEUE_SIZE) { elog_warn(TAG, "audio_hal_write: queue is empty before xQueueSend"); } - xQueueSend(audio_queue, &sample, portMAX_DELAY); //发送缓冲区到队列中 + xQueueSend(audio_queue, buffer_ptr, portMAX_DELAY); //发送缓冲区到队列中 } diff --git a/User/tasks/task_main.c b/User/tasks/task_main.c index 3289ccd..89a7f51 100644 --- a/User/tasks/task_main.c +++ b/User/tasks/task_main.c @@ -152,6 +152,7 @@ void task_main_entry(void *param) util_i2c_scan(&hi2c1); while (1) { + music_flac_play("唐九夏 - 一克拉月光.flac"); music_flac_play("四季音色 - 斑光.flac"); music_mp3_play("夏川椎菜 - No.1.mp3"); music_mp3_play("HoneyWorks,早見沙織 - 可愛くてごめん.mp3"); diff --git a/User/utils/heap_freertos.c b/User/utils/heap_freertos.c index 388f4bb..5f34e19 100644 --- a/User/utils/heap_freertos.c +++ b/User/utils/heap_freertos.c @@ -12,7 +12,7 @@ void *pvPortMalloc( size_t xWantedSize ) { void *pvReturn; - pvReturn = malloc_dtcm( xWantedSize ); + pvReturn = malloc( xWantedSize ); traceMALLOC( pvReturn, xWantedSize ); #if( configUSE_MALLOC_FAILED_HOOK == 1 ) @@ -30,7 +30,7 @@ void vPortFree( void *pv ) { if( pv ) { - free_dtcm( pv ); + free( pv ); traceFREE( pv, 0 ); } }