7. 双DMA播放SD卡中音乐到I2S

本文讨论SD卡作为存储器,I2S播放音频的解决方案

SD卡数据的读取虽然很快,即使在最理想的状态下,播放一秒钟的数据,需要大约%4的时间消耗

8(bit)x2(ch)x2(byte)x48000(hz)/36(MHz)=0.042s

使用单流程模式,这部分损耗是无法忽略的,只能考虑使用DMA模式读取SD卡数据

如果考虑主程序需要承担诸如音量控制,数据监察的功能,I2S也使用DMA模式播放音频

音乐数据的制作

为了简化流程,音乐数据选择完全无编码PCM音频数据格式,将数据直接送往I2S即可播放

I2S设置为16位双声道,每个采样为4字节

可以使用ffmpeg转换mp3或wav及其它音频格式生成纯PCM格式

ffmpeg -i input.mp3 -acodec pcm_s16le -ar 48000 -ac 2 -f s16le output.pcm

在Linux环境中可以使用cat或dd命令写入SD读卡器

文件可以顺序灌入,最后写入'MUSICEND'标识使主程序可实现循环播放控制

结束标识要写入两次为防止跨页

#!/bin/sh

files=""

muend="MUSICEND"

echo -ne "$muend$muend" > music_end

for fff in pcm/*pcm; do

        files="$files $fff"

done

cat $files music_end | dd of=/dev/sde