【RT500 系列】RT595 开发之 DSP MP3 音乐播放(一)

关键字 :NXPRT500DSPMP3

一、概述

       RT500 集成Arm Cortex M33内核,最高 200MHz 主频,相比于 M4 在性能及功耗上有了提高。相信大家都已经很熟悉。那么这里着重介绍一下 Fusion DSP 。

       Fusion DSP 是 Cadence Tensilica 家族的 DSP,Fusion DSP 是针对低功耗 Sensor Fusion 等应用设计的。主要可支持本地音频文件的解码,同时也支持各类语音算法的处理,包括回音消除,噪声抑制,关键词识别等。

       切入主题,这里直接以 RT500 SDK 包的例程进行调试讲解 MP3 音乐的播放过程,以及需要修改的地方。

二、调试 DSP播放音乐

       1. 打开 MCUXpresso IDE,导入 evkmimxrt595_dsp_xaf_demo_cm33 例程,编译,直接烧录到开发板,通过串口助手,发送 shell 命令 “file list”读取可以播放的歌曲的歌名条目,但是返回的是:Please insert an SD card with audio files and retry this command;如图所示。


       所以这里需要做一下修改,由于开发板的硬件没有连接 SD 卡,但是有连接 EMMC , 因此最简单的方法就是将 SD 卡的代码替换为 EMMC 的代码,这一步非常简单,只需找 EMMC 的例程,然后把需要的驱动代码文件替换,包含路径,还有宏定义,最后修改一下初始化函数(这个也可以直接替换一下),由于不是很复杂,这里不做多叙述,有问题可以一起沟通交流。这里给出 EMMC 初始化的 Task 代码予以参考。

void APP_MMCCARD_Task(void *param)
{
app_handle_t *app = (app_handle_t *)param;
app->sdcardInserted = 1;
app->sdcardSem = xSemaphoreCreateBinary();
BOARD_MMC_Config(&g_mmc, BOARD_SDMMC_SD_HOST_IRQ_PRIORITY);
xSemaphoreGive( app->sdcardSem);
/* SD host init function */
if (MMC_HostInit(&g_mmc) == kStatus_Success)
{
while (true)
{
/* take card detect semaphore */
if (xSemaphoreTake( app->sdcardSem, portMAX_DELAY) == pdTRUE)
{
FRESULT error;
const TCHAR driverNumberBuffer[3U] = {MMCDISK + '0', ':', '/'};
//BYTE work[FF_MAX_SS];

if (f_mount(&app->fileSystem, driverNumberBuffer, 0U))
{
PRINTF("Mount volume failed.\r\n");
}

#if (FF_FS_RPATH >= 2U)
error = f_chdrive((char const *)&driverNumberBuffer[0U]);
if (error)
{
PRINTF("Change drive failed.\r\n");
}
#endif
#if FF_USE_MKFS
PRINTF("\r\nMake file system......The time may be long if the card capacity is big.\r\n");
if (f_mkfs(driverNumberBuffer, 0, work, sizeof work))
{
PRINTF("Make file system failed.\r\n");
}
#endif /* FF_USE_MKFS */
}
}
}
else
{
PRINTF("\r\nMMC host init fail\r\n");

}
vTaskSuspend(NULL);
}

 

  1. 准备播放的歌曲条目,这里是使用 EMMC card 模拟 U 盘的例程 :evkmimxrt595_dev_msc_disk_freertos ,直接将 MP3 音乐文件拖到 EMMC 当中,路径必须与 DSP 播放的路径一致,可以自行修改。这里需要注意一个宏定义:FF_USE_MKFS ,防止重新初始化 EMMC 格式化里面内容数据。

  2. 执行 shell 命令播放音乐,先发送 “file list”获取歌曲清单,看看刚才是否写入成功,然后输入 “file good.mp3”播放音乐,如图所示。



  3. 曼妙的音乐马上就可以听到了,首先硬件上需要做一下连接,插上耳机这个是肯定的,还有一个连接的地方需要连接:J7-1 连接到 J8-2,如图所示。

 

  1. 离曼妙音乐扑耳而来还有一个小距离,那就是我们输入播放命令后,还是没有声音,串口打印提示如下图。



       这里提示不支持格式,那你也许会问,下载的是 MP3 格式的音乐啊,怎么可能不支持格式??

       原因就是 MP3 音乐文件里面存放了作者的信息包括图片信息,而且我们看代码,首次读取 MP3 文件数据只有 16K,当第一次读不到音乐数据帧,那这些数据传输到 DSP 会被认为不是音乐文件的数据,导致提示不支持格式。

       解决方法,这里你可能已经有了解决的方法了,你首先想到,我读取的数据比 16K 大就行了;还有就是我直接把 MP3 音乐文件的图片给删除了,直接就读到音乐数据帧就可以了。

       这两种方法是我们第一想到的,下面教大家如何修改代码,实现这两种方法去播放数据。

       第一:修改宏定义 #define FILE_PLAYBACK_INITIAL_READ_SIZE (10 * 1024) 改为 100K 甚至更大,这样子确实可以解决一部分 MP3 音乐文件的播放问题,但是想想,如果音乐文件的图片300 -500K 呢,该怎么办??

       第二:去掉音乐文件的图片确实是对第一种方法的补充,这里我们采用的是将源音乐文件通过 QQ 音乐去转码,码率选择 320 或者可变码率也行,转出来的音乐文件就是去除 图片信息的 MP3音乐文件。这种方法可以成功播放任何一首 MP3 音乐,但是又得想想,每一首音乐都去转码去除图片信息,现实吗?麻烦吗?相信大家心里已经有答案。

       这里留个悬念,下一篇教大家实现播放任何一首 MP3 音乐以及控制逻辑。

       这里给出播放成功的 log 信息,如图所示。




三、参考

  1. i.MX RT600 DSP Core 开发环境搭建
  2. i.MX RT600 DSP Core 调试

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论