请选择 进入手机版 | 继续访问电脑版
搜索
查看: 598|回复: 28

[分享] 修改关于LPC54114 音频库的两个BUG

[复制链接]

该用户从未签到

1

主题

12

帖子

75

积分

注册会员

Rank: 2

积分
75
发表于 2017-10-12 16:32:04 | 显示全部楼层 |阅读模式
   在论坛潜水很久,今天帮大家解决两个音频库的问题吧。   1。采样率过快导致音乐失真
   2。播放2次音乐后报错,无法继续使用
   LPC54114的板子和音频库已经放出来很久了,相信大家对板子的使用已经很熟悉,音频库的移植和使用大家可以参考小马哥的帖子,这里不多说。NXP的音频库做的还是很好的,但是里面有两个小BUG,第一播放音乐时采样速率偏快导致失真。先看下shell信息: 1507795434(1).png
音频库支持的采样率时48k 和44.1k的采样率 ,wav文件的采样率是44.1k,音频库在修改采样率时中只对WM8904的寄存器进行了配置,并没有修改IIS输出的位时钟频率,IIS输出的位时钟频率程序里设置的是通过 PLL分频得到, 代码的如下:
  1. Chip_Clock_SetFLEXCOMMClockSource(I2S7_FLEXCOMM, SYSCON_FLEXCOMMCLKSELSRC_PLL);
  2.                 Chip_I2S_Config(I2S_PORT_TX, &audio_fmt_tx);
复制代码
  1. static I2S_AUDIO_FORMAT_T audio_fmt_tx = {
  2.         I2S_TX,                                        /*!< Data direction: tx or rx */
  3.         NORMAL_MASTER,                        /*!< Master / Slave configuration */
  4.         I2S_CLASSIC,                        /*!< I2S mode */
  5.         false,                                        /*!< right channel data in low portion of FIFO */
  6.         false,                                        /*!< left justify data in FIFO */
  7.         false,                                        /*!<  data source is the D-Mic subsystem */
  8.         false,                                        /*!<  SCK polarity */
  9.         false,                                        /*!<  WS polarity */
  10.         16*LPC54110_IIS_MUL,                                                /*!< Flexcomm function clock divider */
  11.         2,                                                /*!< Channel Number - 1 is mono, 2 is stereo */
  12.         16,                                                /*!< Word Width */
  13.         32,                                                /*!< Frame Width */
  14.         0,                                                /*!< Data position in the frame */
  15.         5,                                                /*!< FIFO depth (fifo config) */
  16. };
复制代码
16*LPC54110_IIS_MUL就是分频比,LPC54110_IIS_MUL是什么呢? 在board.h里面有定义
  1. #define LPC54110_MAIN_CLOCK 98304000 // 98304000 // 24576000 // 49152000 // 73728000 //98304000
  2. #define LPC54110_IIS_MUL    LPC54110_MAIN_CLOCK/22579200 //24576000
复制代码
音频库中默认是24576000,这个值时匹配48kHZ的,我把他改为 22579200,改完后就可以采样44.1Khz的音乐了。计算公式是
44100(采样率)*2(通道数)*16(数据位数)*16. 至于这个公式是怎么来的我也是一知半解,和WM8904的时钟设置 和 IIS的配置有关
总之这样改完,音乐就不会失真了。


第二个BUG,还是看一下shell信息 如下:
1507796512(1).png


如图所示,在播放第一遍音乐结束之后可以再次播放,第二次播放完以后报了一个错误:



(mem->used) assertion failed at function:rt_free, line number:539
之后就死机了,无法操作shell
导致这个的原因是,wav函数中为两个buf申请内存,释放后buf0和buf1的值没有置位NULL,导致第二次播放时,无法调用rt_malloc函数继续申请内存,
但是由于buf0和buf1维持原来的起始地址,还是可以继续播放音乐,播放完毕后调用释放内存rt_free函数出错。
  1. void wav(char* filename)
  2. {
  3.                 uint32_t temp;
  4.     int fd;
  5.     struct FMT_BLOCK_DEF   fmt_block;
  6. #if Magicoe
  7.     //检查mempool是否被初始化,否则进行初始化.
  8.     if (is_inited == RT_FALSE)
  9.     {
  10.         rt_mp_init(&_mp, "wav_buf", &mempool[0], sizeof(mempool), mempll_block_size);
  11.         is_inited = RT_TRUE;
  12.     }
  13. #endif
  14.                 if(wav_buf0 == NULL) {
  15.                         wav_buf0 = rt_malloc(9000);
  16.                         if(wav_buf0 == NULL) {
  17.                                 rt_kprintf("malloc wav_buf0 failed\n");
  18.                         }
  19.                 }
  20.                 if(wav_buf1 == NULL) {
  21.                         wav_buf1 = rt_malloc(9000);
  22.                         if(wav_buf1 == NULL) {
  23.                                 rt_kprintf("malloc wav_buf1 failed\n");
  24.                         }               
  25.                 }
  26.                 rt_kprintf("malloc wav_buf0&1 ok %x %x\n", wav_buf0, wav_buf1);
复制代码
代码如图所示,可以看到wav_buf0和wav_buf1申请内存之前先判断是否为NULL。
修改方法如下:在wav函数结尾添加  wav_buf0 = NULL;wav_buf1 = NULL;即可
  1. rt_free(wav_buf0);
  2.                                 rt_free(wav_buf1);
  3.                                
  4.                                 wav_buf0 = NULL;
  5.                                 wav_buf1 = NULL;
  6.                                
  7.                                 list_mem();
  8.                                
  9.         close(fd);
  10.     }
  11. }
复制代码
mp3播放函数同样存在这个问题,修改方法一样!同学们自行修改就好。

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2017-12-1 09:22
  • 签到天数: 204 天

    [LV.7]常住居民III

    70

    主题

    2553

    帖子

    6486

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    6486
    发表于 2017-10-12 16:44:38 | 显示全部楼层
    点赞,学习了
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    前天 10:20
  • 签到天数: 200 天

    [LV.7]常住居民III

    66

    主题

    2062

    帖子

    5226

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    5226
    发表于 2017-10-12 17:01:58 来自手机 | 显示全部楼层
    大神膜拜下,吊爆了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    帖子

    75

    积分

    注册会员

    Rank: 2

    积分
    75
     楼主| 发表于 2017-10-12 17:08:06 | 显示全部楼层

    共同学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    帖子

    75

    积分

    注册会员

    Rank: 2

    积分
    75
     楼主| 发表于 2017-10-12 17:08:28 | 显示全部楼层
    ALTIUM2 发表于 2017-10-12 17:01
    大神膜拜下,吊爆了

    不敢当
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-10-22 10:15
  • 签到天数: 59 天

    [LV.5]常住居民I

    8

    主题

    224

    帖子

    630

    积分

    高级会员

    Rank: 4

    积分
    630
    发表于 2017-10-12 18:17:39 | 显示全部楼层
    有机会试一下!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:37
  • 签到天数: 331 天

    [LV.8]以坛为家I

    140

    主题

    8020

    帖子

    1万

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    13485
    发表于 2017-10-12 18:41:09 | 显示全部楼层
    好牛,那个公式我也不懂,看了手册也没没明白
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:37
  • 签到天数: 331 天

    [LV.8]以坛为家I

    140

    主题

    8020

    帖子

    1万

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    13485
    发表于 2017-10-12 18:42:33 | 显示全部楼层
    本帖最后由 wambob 于 2017-10-12 19:21 编辑

    另外试了下mp3的,还是不行
    无标题.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-8 06:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    640

    帖子

    1874

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1874
    发表于 2017-10-12 20:19:50 | 显示全部楼层
    谢谢分享!
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 13:37
  • 签到天数: 331 天

    [LV.8]以坛为家I

    140

    主题

    8020

    帖子

    1万

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    13485
    发表于 2017-10-12 20:32:42 | 显示全部楼层
    第1个根本不是BUG
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|恩智浦技术社区    

    GMT+8, 2017-12-16 15:06 , Processed in 0.158536 second(s), 15 queries , Memcache On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表