main.lua 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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, 6, 200)
  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, 6, 200)
  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. -- mp3 可播放采样率 16k/32k
  59. -- 如需在同一个table内混播, 需要使用相同的采样率
  60. -- 此mp3无版权,合宙自录音频,若测试音质请使用其他高清mp3,并使用转码到32k采样率
  61. local mp3s = {"/luadb/test.mp3"}
  62. local counter = 0
  63. while true do
  64. log.info("开始播放")
  65. -- 两个列表前后播放
  66. result = audio.play(0, counter % 2 == 1 and amrs or mp3s)
  67. counter = counter + 1
  68. if result then
  69. --等待音频通道的回调消息,或者切换歌曲的消息
  70. while true do
  71. msg = sysplus.waitMsg(taskName, nil)
  72. if type(msg) == 'table' then
  73. if msg[1] == MSG_PD then
  74. log.info("播放结束")
  75. break
  76. end
  77. else
  78. log.error(type(msg), msg)
  79. end
  80. end
  81. else
  82. log.debug("解码失败!")
  83. sys.wait(1000)
  84. end
  85. if not audio.isEnd(0) then
  86. log.info("手动关闭")
  87. audio.playStop(0)
  88. end
  89. -- log.info(rtos.meminfo("sys"))
  90. -- log.info(rtos.meminfo("lua"))
  91. sys.wait(1000)
  92. end
  93. sysplus.taskDel(taskName)
  94. end
  95. sysplus.taskInitEx(audio_task, taskName, task_cb)
  96. -- 用户代码已结束---------------------------------------------
  97. -- 结尾总是这一句
  98. sys.run()
  99. -- sys.run()之后后面不要加任何语句!!!!!