Play music when excavating
This commit is contained in:
96
controller/audio_controller.lua
Normal file
96
controller/audio_controller.lua
Normal file
@ -0,0 +1,96 @@
|
||||
local dfpwm = require("cc.audio.dfpwm")
|
||||
local Direction = require("lib.direction")
|
||||
|
||||
---@alias AudioControllerConfig {buffer_length_seconds: number}
|
||||
|
||||
---@class AudioController
|
||||
---@field config AudioControllerConfig
|
||||
---@field play boolean
|
||||
local AudioController = {}
|
||||
AudioController.__index = AudioController
|
||||
|
||||
|
||||
---@return AudioController
|
||||
function AudioController:Create()
|
||||
local t = {}
|
||||
setmetatable(t, AudioController)
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
-- Fields
|
||||
-----------------------------------------------------------------------------------------------
|
||||
t.config = {
|
||||
buffer_length_seconds = 1
|
||||
}
|
||||
t.play = false
|
||||
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
-- Audio Methods
|
||||
-----------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
function AudioController:PlayAudio(filename)
|
||||
self.play = true
|
||||
|
||||
local decoder = dfpwm.make_decoder()
|
||||
while self.play do
|
||||
for chunk in io.lines(("audio/%s.dfpwm"):format(filename), self.config.buffer_length_seconds * 1024) do
|
||||
if not self.play then
|
||||
break
|
||||
end
|
||||
|
||||
local buffer = decoder(chunk)
|
||||
|
||||
while not self:GetSpeaker().playAudio(buffer) do
|
||||
---@diagnostic disable-next-line: undefined-field
|
||||
os.pullEvent("speaker_audio_empty")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function AudioController:PlayAudioFactory(filename)
|
||||
local function play()
|
||||
self:PlayAudio(filename)
|
||||
end
|
||||
|
||||
return play
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
-- Management Methods
|
||||
-----------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
---@return table | nil
|
||||
function AudioController:GetSpeaker()
|
||||
return peripheral.find("speaker")
|
||||
end
|
||||
|
||||
|
||||
function AudioController:StopPlaying()
|
||||
self.play = false
|
||||
self:GetSpeaker().stop()
|
||||
end
|
||||
|
||||
|
||||
-----------------------------------------------------------------------------------------------
|
||||
-- Main Method
|
||||
-----------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
function AudioController:Run()
|
||||
-- self:Configure()
|
||||
|
||||
self:PlayAudio("bangarang")
|
||||
end
|
||||
|
||||
|
||||
return AudioController
|
||||
Reference in New Issue
Block a user