main.lua 3.7 KB

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