main.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "audiotest"
  3. VERSION = "2.0.1"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. _G.sysplus = require("sysplus")
  7. log.style(1)
  8. local taskName = "task_audio"
  9. local MSG_MD = "moreData" -- 播放缓存有空余
  10. local MSG_PD = "playDone" -- 播放完成所有数据
  11. audio.on(0, function(id, event)
  12. --使用play来播放文件时只有播放完成回调
  13. local succ,stop,file_cnt = audio.getError(0)
  14. if not succ then
  15. if stop then
  16. log.info("用户停止播放")
  17. else
  18. log.info("第", file_cnt, "个文件解码失败")
  19. end
  20. end
  21. -- log.info("播放完成一个音频")
  22. sysplus.sendMsg(taskName, MSG_PD)
  23. end)
  24. function audio_setup()
  25. local bsp = rtos.bsp()
  26. if bsp == "EC618" then
  27. --Air780E开发板配套+音频扩展板. ES8211
  28. --由于音频扩展板的PA是长供电的,有塔塔声音是正常的,做产品的话有额外的参考设计
  29. i2s.setup(0, 0, 0, 0, 0, i2s.MODE_MSB)
  30. --如果用软件DAC,打开下面的注释
  31. -- if audio.setBus then
  32. -- audio.setBus(0, audio.BUS_SOFT_DAC)
  33. -- end
  34. audio.config(0, 25, 1, 3, 100)
  35. -- gpio.setup(24, 0)
  36. -- gpio.setup(23, 0)
  37. -- gpio.setup(27, 0)
  38. -- gpio.setup(2, 0)
  39. elseif bsp == "AIR105" then
  40. -- Air105开发板支持DAC直接输出
  41. audio.config(0, 25, 1, 3, 100)
  42. else
  43. -- 其他板子未支持
  44. while 1 do
  45. log.info("audio", "尚未支持的BSP")
  46. sys.wait(1000)
  47. end
  48. end
  49. sys.publish("AUDIO_READY")
  50. end
  51. -- 配置好audio外设
  52. sys.taskInit(audio_setup)
  53. local function audio_task()
  54. sys.waitUntil("AUDIO_READY")
  55. local result
  56. -- amr 可播放采样率 8k/16k
  57. local amrs = {"/luadb/alipay.amr", "/luadb/2.amr", "/luadb/10.amr", "/luadb/yuan.amr"}
  58. -- 如需在同一个table内混播, 需要使用相同的采样率
  59. -- 此mp3为自由文件,无版权问题,合宙自录音频,若测试音质请使用其他高清mp3
  60. -- local mp3s = {"/luadb/test_32k.mp3"}
  61. -- ec618的固件需要用非full版本才能放下44k的MP3
  62. local mp3s = {"/luadb/test_44k.mp3"}
  63. local counter = 0
  64. while true do
  65. log.info("开始播放")
  66. -- 两个列表前后播放
  67. result = audio.play(0, counter % 2 == 1 and amrs or mp3s)
  68. counter = counter + 1
  69. if result then
  70. --等待音频通道的回调消息,或者切换歌曲的消息
  71. while true do
  72. msg = sysplus.waitMsg(taskName, nil)
  73. if type(msg) == 'table' then
  74. if msg[1] == MSG_PD then
  75. log.info("播放结束")
  76. break
  77. end
  78. else
  79. log.error(type(msg), msg)
  80. end
  81. end
  82. else
  83. log.debug("解码失败!")
  84. sys.wait(1000)
  85. end
  86. if not audio.isEnd(0) then
  87. log.info("手动关闭")
  88. audio.playStop(0)
  89. end
  90. -- log.info(rtos.meminfo("sys"))
  91. -- log.info(rtos.meminfo("lua"))
  92. sys.wait(1000)
  93. end
  94. sysplus.taskDel(taskName)
  95. end
  96. sysplus.taskInitEx(audio_task, taskName, task_cb)
  97. -- 用户代码已结束---------------------------------------------
  98. -- 结尾总是这一句
  99. sys.run()
  100. -- sys.run()之后后面不要加任何语句!!!!!