play_file.lua 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. --[[
  2. @module play_file
  3. @summary 播放文件
  4. @version 1.0
  5. @date 2025.09.08
  6. @author 梁健
  7. @usage
  8. 本文件为播放文件的应用功能模块,核心业务逻辑为:
  9. 1、自动播放一个1.mp3音乐,
  10. 2、点powerkey 按键进行音频切换,点击boot 按键停止音频播放
  11. 3、点击boot 按键停止音频播放
  12. 本文件没有对外接口,直接在main.lua中require "play_file"就可以加载运行;
  13. ]]
  14. exaudio = require("exaudio")
  15. local taskName = "task_audio"
  16. local audio_setup_param ={
  17. model= "es8311", -- 音频编解码类型,可填入"es8311","es8211"
  18. i2c_id = 0, -- i2c_id,可填入0,1 并使用pins 工具配置对应的管脚
  19. pa_ctrl = 162, -- 音频放大器电源控制管脚
  20. dac_ctrl = 164, -- 音频编解码芯片电源控制管脚
  21. }
  22. local function play_end(event)
  23. if event == exaudio.PLAY_DONE then
  24. log.info("播放完成",exaudio.is_end())
  25. end
  26. end
  27. local audio_play_param ={
  28. type= 0, -- 播放类型,有0,播放文件,1.播放tts 2. 流式播放
  29. -- 如果是播放文件,支持mp3,amr,wav格式
  30. -- 如果是tts,内容格式见:https://wiki.luatos.com/chips/air780e/tts.html?highlight=tts
  31. -- 流式播放,仅支持PCM 格式音频,如果是流式播放,则sampling_rate, sampling_depth,signed_or_unsigned 必填写
  32. content = "/luadb/1.mp3", -- 如果播放类型为0时,则填入string 是播放单个音频文件,如果是表则是播放多段音频文件。
  33. cbfnc = play_end, -- 播放完毕回调函数
  34. }
  35. ---------------------------------
  36. ---通过BOOT 按键进行播放停止操作---
  37. ---------------------------------
  38. local function stop_audio()
  39. log.info("停止播放")
  40. sys.sendMsg(taskName, MSG_KEY_PRESS, "STOP_AUDIO")
  41. end
  42. --按下boot 停止播放
  43. gpio.setup(0, stop_audio, gpio.PULLDOWN, gpio.RISING)
  44. gpio.debounce(0, 200, 1) -- 防抖,防止频繁触发
  45. ---------------------------------
  46. ---通过POWERKEY按键进行音频切换---
  47. ---------------------------------
  48. local function next_audio()
  49. log.info("切换播放")
  50. sys.sendMsg(taskName, MSG_KEY_PRESS, "NEXT_AUDIO")
  51. end
  52. --按下powerkey 打断播放,播放优先级更高的音频
  53. gpio.setup(gpio.PWR_KEY, next_audio, gpio.PULLUP, gpio.FALLING)
  54. gpio.debounce(gpio.PWR_KEY, 200, 1) -- 防抖,防止频繁触发
  55. ---------------------------------
  56. ---------------主task------------
  57. ---------------------------------
  58. local index_number = 1
  59. local audio_path = nil
  60. local function audio_task()
  61. log.info("开始播放音频文件")
  62. if exaudio.setup(audio_setup_param) then
  63. exaudio.play_start(audio_play_param) -- 仅仅支持task 中运行
  64. while true do
  65. local msg = sys.waitMsg(taskName, MSG_KEY_PRESS) -- 等待按键触发
  66. if msg[2] == "NEXT_AUDIO" then
  67. if index_number %2 == 0 then -- 切换音频路径
  68. audio_path = "/luadb/1.mp3"
  69. else
  70. audio_path = "/luadb/10.amr"
  71. end
  72. exaudio.play_start({type= 0, content = audio_path,cbfnc = play_end,priority = index_number})
  73. index_number= index_number +1
  74. elseif msg[2] == "STOP_AUDIO" then
  75. exaudio.play_stop()
  76. end
  77. end
  78. end
  79. end
  80. sys.taskInitEx(audio_task, taskName)