6.1.5. 常见问题

  1. 播放音频文件时会先播放一段0数据。

../../../_images/zero-data.png

如上图所示,在播放音频时,会先播放一段0数据。这个问题是由RT-Thread的audio框架导致的。在读取音频文件时,如果读取的音频数据长度小于音频框架中内存池一个block的大小,则在将音频数据写入内存池后,并不会立即将该block加入到数据队列,而是会等到一个block写满才加入数据队列。尽管未加入数据队列,但audio框架也会立即开始传输。此时数据队列中没有任何数据,会先填充一个period_len长度的0数据,所以播放会有0数据出现。

若不想播放起始时的0数据,则需要在应用层增大读取音频文件的buffer长度,与内存池的block大小相同即可,这样在第一次写内存池时,就可以将block加入到数据队列。如下图

../../../_images/no-zero-data.png
  1. 播放时应用层可设置的buffer大小范围是多少

在执行 _audio_dev_write 时,如果内存池中没有可用的block,则会一直堵塞在 rt_mp_alloc 处,所以应用层一次读取音频文件,可设置的最大buffer大小是 RT_AUDIO_REPLAY_MP_BLOCK_SIZE * RT_AUDIO_REPLAY_MP_BLOCK_COUNT,driver层默认RT_AUDIO_REPLAY_MP_BLOCK_SIZE的值为20480,RT_AUDIO_REPLAY_MP_BLOCK_COUNT的值为2,所以可设置的最大值为40960。