# Minimalist Sound Manager

A minimalist sound manager to make playing sounds easier without adding a whole library:

    do-- will hold the currently playing sourceslocal sources = {}

        -- check for sources that finished playing and remove them
        -- add to love.update
        function love.audio.update()
            local remove = {}
            for _,s in pairs(sources) do
                if s:isStopped() then
                    remove[#remove + 1] = s
                end
            end

            for i,s in ipairs(remove) do
                sources[s] = nil
            end
        end

        -- overwrite love.audio.play to create and register source if needed
        local play = love.audio.play
        function love.audio.play(what, how, loop)
            local src = what
            if type(what) ~= "userdata" or not what:typeOf("Source") then
                src = love.audio.newSource(what, how)
                src:setLooping(loop or false)
            end

            play(src)
            sources[src] = src
            return src
        end

        -- stops a source
        local stop = love.audio.stop
        function love.audio.stop(src)
            if not src then return end
            stop(src)
            sources[src] = nil
        end
    end

Now you can play sound effects and background music without worrying about the actual source objects:

    function love.load()
        -- you will still get a source handle if you need it
        bgm = love.audio.play("background-music.ogg", "stream", true) -- stream and loop background music
    end

    function love.update(dt)
        love.audio.update()
    end

    function love.keypressed(key)
        if key == 's' then
            love.audio.stop(bgm)
        elseif key == 'p' then
            love.audio.play(bgm) -- still streaming and looping
        else
            love.audio.play("explosion.ogg") -- play explosion sound once
        end
    end

Category:

- Snippets