简介

大体来说,MP3解码播放可以分为3步:读取MP3文件、解码为PCM采样 和 发送至DAC播放。三者通常为异步进行,第三步为DMA完成为此软件可以不需要额外的线程进行控制,但是一二步如果能够分入两个独立的线程将会提高整体的效率。为此这里使用了FreeRTOS系统,分为不同的线程来进行。

读取

项目使用了经典的FATFS来实现文件系统,从SD卡读取文件。由于需要管理文件系统、需要进行多次传输的原因,SD卡读取并不像音频输出一样可以直接使用固定间隔固定周期的DMA进行传输,为此才需要使用多线程来实现和解码的交错。

这部分的代码非常简单,分配一个长度为1的队列用来跨线程通信,读取线程只需要不断往队列里写入数据就行。

简化后的代码大致如下:

    while (ctx->offset < ctx->file_size) {
        os_fs_read(ctx->file, buf, QUEUE_OBJECT);
        xQueueSendToBack(ctx->input_queue, buf, portMAX_DELAY);
        ctx->offset = os_fs_tell(ctx->file);
    }

解码

播放