Communauté

Gérer la fin de pau...
 
Notifications
Retirer tout

Gérer la fin de pause audio sur une liste de musique

14 Posts
2 Utilisateurs
0 Likes
231 Vu
0
Début du sujet

Bonjour,

j'ai besoin d'un peu d'aide, voici mon code :
-- Cette ligne permet d'afficher des traces dans la console pendant l'éxécution -- pour débugger :
io.stdout:setvbuf('no')

local font = love.graphics.newFont(14)
local pause = false
local debut = false
local piste = 2
local volumeMax = 1
local musicPaused = {}

--les musiques
local musicMask_Off = love.audio.newSource("sons/Mask_Off.ogg","stream")
local musicSe_Acabo = love.audio.newSource("sons/Se_Acabo.ogg","stream")
local musicI_Like_It = love.audio.newSource("sons/I_Like_It.ogg","stream")
local music50c = love.audio.newSource("sons/50Cent_In_Da_Club.ogg","stream")

local musicManager = {}

function CreateMusicManager()
local myMM = {}
myMM.lstMusics = {} -- listes des music
myMM.currentMusic = 0 --ID de la music en cours

function myMM.addMusic(pMusic)--obéit comme une instance d'objet
local newMusic = {}
newMusic.source = pMusic
--s'assure de faire boucler la musique
newMusic.source:setLooping(true)
--cope le volume par défaut
newMusic.source:setVolume(0)
table.insert(myMM.lstMusics, newMusic)

end

function myMM.update(dt)
--parcours ttes les musiques pour s'assurer :
--1) que la musique en cours à son volume à 1, sinon on l'augmente
--2) que si une ancienne musique n'a pas son volume à 0, on le baisse
for index, music in ipairs(myMM.lstMusics) do
if index == myMM.currentMusic then
if music.source:getVolume() < volumeMax then --and pause == false then
music.source:setVolume(music.source:getVolume()+0.01 * dt)
else
music.source:setVolume(volumeMax)
end
else
if music.source:getVolume() > 0 then
music.source:setVolume(music.source:getVolume()-0.1 * dt)
--if music.source:getVolume() <= 0 then
--music.source:stop()
--end
end
end
end
end

function myMM.PlayMusic(pNum)
--récupère la musique dans la liste et la démarre
print("ok")
local music = myMM.lstMusics[pNum]
if music.source:getVolume() == 0 and myMM.currentMusic ~= pNim then
print("start music "..pNum)
music.source:play()
end
--prend note de la nouvelle musique
--pour que la méthode update prenne le relai
myMM.currentMusic = pNum
end

return myMM
end

function StopAllMusic()
for _, music in ipairs(musicManager.lstMusics) do
music.source:setVolume(0)
music.source:stop()
end
end

function PauseAllMusic()
for _, music in ipairs(musicManager.lstMusics) do

music.source:stop()
end
end

function love.load()
print("load atteint")
--crée le musicManager et lui ajouter des musiques
musicManager = CreateMusicManager()--crée l"objet"
musicManager.addMusic(musicMask_Off)
musicManager.addMusic(musicSe_Acabo)
musicManager.addMusic(musicI_Like_It)
musicManager.addMusic(music50c)
--démarre la 1ère musique
--musicManager.PlayMusic(1)

-- Initialisez l'état de pause pour chaque piste à faux
for i = 1, #musicManager.lstMusics do
musicPaused[i] = false
end

end

function love.keypressed(key)--non remanante
local ctrl = love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")
if key == "a" then
musicManager.lstMusics[piste].source:stop()
musicManager.lstMusics[piste].source:setVolume(0)
musicManager.PlayMusic(piste)
end

if key == "s" then
StopAllMusic()

end
print("pause",pause)
if key == "p" then
-- Inversez l'état de pause de la piste actuelle
musicPaused[piste] = not musicPaused[piste]

if musicPaused[piste] then
-- Si en pause, mettez en pause la musique
musicManager.lstMusics[piste].source:pause()
else
-- Si pas en pause, reprenez la musique depuis le point de pause
musicManager.lstMusics[piste].source:play()
end
end
local current = love.audio.getActiveSourceCount()
if key == "right" then
if piste < #musicManager.lstMusics then
piste = piste +1
else
piste = 1
end
if current > 0 then
musicManager.PlayMusic(piste)
end
end
if key == "left" then
if piste > 1 then
piste = piste - 1
else
piste = #musicManager.lstMusics
end
if current > 0 then
musicManager.PlayMusic(piste)
end
end
end

function love.update(dt)
--parametrage/délaration touches rémanantes
local shift = love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")--déclartion de touches rémanant aditionnel en boolean
if love.keyboard.isDown("up") and shift then
if volumeMax < 1 then
volumeMax = volumeMax +0.1*dt*4
end
end

if love.keyboard.isDown("down") and shift then
if volumeMax > 0 then
volumeMax = volumeMax -0.1*dt*4
end
end

if love.keyboard.isDown("up") and shift == false then
if volumeMax < 1 then
volumeMax = musicManager.lstMusics[piste].source:getVolume()
volumeMax = volumeMax +0.1*dt*4
musicManager.lstMusics[piste].source:setVolume(volumeMax)
end
end

if love.keyboard.isDown("down") and shift == false then
if volumeMax > 0 then
volumeMax = musicManager.lstMusics[piste].source:getVolume()
volumeMax = volumeMax -0.1*dt*4
end
end

--musicManager.PlayMusic(1)
--demande au MusicManagerr de se mettre à jour
musicManager.update(dt)
end

function love.draw()
love .graphics.print("début de lecture : 'a' ; stop : 's' ; pause : 'p' ; volmue maximum et minimum : 'ctrl + up' 'ctrl + down' ; volmue : 'up' 'down'",0,0)
local current = love.audio.getActiveSourceCount()
if current ~= 0 then
love .graphics.print("piste en cours : "..musicManager.currentMusic,0,font:getHeight("X"))
local volume = musicManager.lstMusics[musicManager.currentMusic].source:getVolume()
love .graphics.print("volume maximum : "..volumeMax,0,font:getHeight("X")*2)
love .graphics.print("volume piste en cours : "..volume,0,font:getHeight("X")*3)

else
love .graphics.print("Pas de musique en cours de lecture.",0,font:getHeight("X"))
love .graphics.print("piste à lire : "..piste,0,font:getHeight("X")*2)
end
end
il permet d'avoir une liste de 4 morceau de musique, de passer d'une musique à l'autre, d'augmenter et de baisser le volume.

ce code est très inspiré de celui de l'atelier "sons et musiques".

Voici mon problème : la fin de pause ne fonctionne correctement qu'avec le morceau sur le quel la liste se lance, sur les autres morceaux : soit la fin de pause ne fonctionne pas, soit la lecture ne reprend pas au point d'arrêt mais au tout début.

J'ai essayé d'autres variante de formulation du code de pause mais à ne marche pas, c'est toujours le même résultat.

Pouvez-vous m'aider ?

Étiquettes du sujet
9 Réponses
0

Bonjour sansucre pourquoi dans ta fonction

function PauseAllMusic()
       for _, music in ipairs(musicManager.lstMusics) do
            music.source:stop()
       end

end

tu mets  music.sources:stop() et non  music.sources:pause() ?

petit conseil et pour une lecture plus facile utilise la balise code cela permet d'avoir un source bien indente et plus facile a lire.

Bien a toi

0
Début du sujet

Translator
 
 
 

Bonjour thi Nga Nguyen,

cette partie de code est une erreur de frappe, un morceau de code que j'ai oublié de retiré, il n'est rattaché  à rien.

voici le dernier bout de code que j'ai essayé :

function StopAllOtherMusic(exclus)
for _, music in ipairs(musicManager.lstMusics) do
if music ~= exclus then
print("music",music)
music.source:setVolume(0)
music.source:stop()
end
end
end

if key == "p" then
if musicManager.lstMusics[piste].source:isPlaying() then
StopAllOtherMusic(musicManager.lstMusics[piste])
local current = love.audio.getActiveSourceCount()
print("current",current)
print("pisteEnCours",musicManager.lstMusics[piste].source)
musicManager.lstMusics[piste].source:pause()
else
local current = love.audio.getActiveSourceCount()
print("current2",current)
love.audio.play(musicManager.lstMusics[piste].source)
current = love.audio.getActiveSourceCount()
print("current3",current)
print("pisteEnCours",musicManager.lstMusics[piste].source)
end
end

la function 'StopAllOtherMusic' sert à stopper toutes les autres musiques qui ne sont pas la musique principales.

la pause et la sortie de pause fonctionne correctement sur la musique qui es lancé en premier dans ma liste (peut importe sa position en index du moment que c'est celle qui est lancé en premier).

Par contre quand je swift vers une autre musique la sotie de pause ne fonctionne pas correctement.

la variable 'current' que j'ai placé dans mon code m'indique le nombre de piste en cours :

pour la 1ere musique, celle qui n'a aucun problème le nombre 'current' est toujours 1

pour les musique suivantes, pour une raison inconnue : après avoir passé la ligne 'love.audio.play(musicManager.lstMusics[piste].source)', qui devrait relancé la lecture à son point d'arrêt, le current prend la valeur 0 et la musique ne reprend pas, si je rappuie sur 'p' une nouvelle fois la musique reprends dès le début.

Peut-être la function 'pause' n'est-elle pas adaptée aux liste de lecture ?

Ce message a été modifié Il y a 6 mois parSansucre
0

@muchembled

bonjour a toi peux tu s'il te plait nous presenter un code comme cela :

Spoiler
ton code en plus lisible et ajout de commentaire
io.stdout:setvbuf('no')

local font = love.graphics.newFont(14)
local pause = false
local debut = false
local piste = 2
local volumeMax = 1
local musicPaused = {}

--les musiques
local musicMask_Off = love.audio.newSource("sons/Mask_Off.ogg","stream")
local musicSe_Acabo = love.audio.newSource("sons/Se_Acabo.ogg","stream")
local musicI_Like_It = love.audio.newSource("sons/I_Like_It.ogg","stream")
local music50c = love.audio.newSource("sons/50Cent_In_Da_Club.ogg","stream")

local musicManager = {}

function CreateMusicManager()
    local myMM = {}
    myMM.lstMusics = {} -- listes des music
    myMM.currentMusic = 0 --ID de la music en cours
-- ?? ou est le end 
function myMM.addMusic(pMusic)--obéit comme une instance d'objet
    local newMusic = {}
    newMusic.source = pMusic
    --s'assure de faire boucler la musique
    newMusic.source:setLooping(true)
    --cope le volume par défaut
    newMusic.source:setVolume(0)
    table.insert(myMM.lstMusics, newMusic)
end

function myMM.update(dt)
--parcours ttes les musiques pour s'assurer :
--1) que la musique en cours à son volume à 1, sinon on l'augmente
--2) que si une ancienne musique n'a pas son volume à 0, on le baisse
    for index, music in ipairs(myMM.lstMusics) do
        if index == myMM.currentMusic then
            if music.source:getVolume() < volumeMax then --and pause == false then
                music.source:setVolume(music.source:getVolume()+0.01 * dt)
            else
                music.source:setVolume(volumeMax)
            end
        else
            if music.source:getVolume() > 0 then
                music.source:setVolume(music.source:getVolume()-0.1 * dt)
                --if music.source:getVolume() <= 0 then
                    --music.source:stop()
                --end
            end
        end
    end
end

function myMM.PlayMusic(pNum)
--récupère la musique dans la liste et la démarre
    print("ok")
    local music = myMM.lstMusics[pNum]
    if music.source:getVolume() == 0 and myMM.currentMusic ~= pNim then
        print("start music "..pNum)
        music.source:play()
    end
--prend note de la nouvelle musique
--pour que la méthode update prenne le relai
    myMM.currentMusic = pNum
end

return myMM --????
end -- ce end termine quoi ???

function StopAllMusic()
    for _, music in ipairs(musicManager.lstMusics) do
        music.source:setVolume(0)
        music.source:stop()
    end
end

function PauseAllMusic()
    for _, music in ipairs(musicManager.lstMusics) do
        music.source:stop()
    end
end

function love.load()
    print("load atteint")
--crée le musicManager et lui ajouter des musiques
    musicManager = CreateMusicManager()--crée l"objet"
    musicManager.addMusic(musicMask_Off)
    musicManager.addMusic(musicSe_Acabo)
    musicManager.addMusic(musicI_Like_It)
    musicManager.addMusic(music50c)
--démarre la 1ère musique
--musicManager.PlayMusic(1)

-- Initialisez l'état de pause pour chaque piste à faux
    for i = 1, #musicManager.lstMusics do
        musicPaused[i] = false
    end
end

function love.keypressed(key)--non remanante
    local ctrl = love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")
    if key == "a" then
        musicManager.lstMusics[piste].source:stop()
        musicManager.lstMusics[piste].source:setVolume(0)
        musicManager.PlayMusic(piste)
    end
    if key == "s" then
        StopAllMusic()
    end
    print("pause",pause)
    if key == "p" then
        -- Inversez l'état de pause de la piste actuelle
        musicPaused[piste] = not musicPaused[piste]
        if musicPaused[piste] then
            -- Si en pause, mettez en pause la musique
            musicManager.lstMusics[piste].source:pause()
        else
            -- Si pas en pause, reprenez la musique depuis le point de pause
            musicManager.lstMusics[piste].source:play()
        end
    end
    local current = love.audio.getActiveSourceCount()
    if key == "right" then
        if piste < #musicManager.lstMusics then
            piste = piste +1
        else
            piste = 1
        end
        if current > 0 then
            musicManager.PlayMusic(piste)
        end
    end
    if key == "left" then
        if piste > 1 then
            piste = piste - 1
        else
            piste = #musicManager.lstMusics
        end
    if current > 0 then
        musicManager.PlayMusic(piste)
    end
-- ils servent a quoi ses end ?? un oui mai 2 
end   
end

function love.update(dt)
--parametrage/délaration touches rémanantes
    local shift = love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")--déclartion de touches rémanant aditionnel en boolean
    if love.keyboard.isDown("up") and shift then
        if volumeMax < 1 then
            volumeMax = volumeMax +0.1*dt*4
        end
    end

    if love.keyboard.isDown("down") and shift then
        if volumeMax > 0 then
            volumeMax = volumeMax -0.1*dt*4
        end
    end

    if love.keyboard.isDown("up") and shift == false then
        if volumeMax < 1 then
            volumeMax = musicManager.lstMusics[piste].source:getVolume()
            volumeMax = volumeMax +0.1*dt*4
            musicManager.lstMusics[piste].source:setVolume(volumeMax)
        end
    end

    if love.keyboard.isDown("down") and shift == false then
        if volumeMax > 0 then
            volumeMax = musicManager.lstMusics[piste].source:getVolume()
            volumeMax = volumeMax -0.1*dt*4
        end
    end

--musicManager.PlayMusic(1)
--demande au MusicManagerr de se mettre à jour
    musicManager.update(dt)
end

function love.draw()
    love .graphics.print("début de lecture : 'a' ; stop : 's' ; pause : 'p' ; volmue maximum et minimum : 'ctrl + up' 'ctrl + down' ; volmue : 'up' 'down'",0,0)
    local current = love.audio.getActiveSourceCount()
    if current ~= 0 then
        love .graphics.print("piste en cours : "..musicManager.currentMusic,0,font:getHeight("X"))
        local volume = musicManager.lstMusics[musicManager.currentMusic].source:getVolume()
        love .graphics.print("volume maximum : "..volumeMax,0,font:getHeight("X")*2)
        love .graphics.print("volume piste en cours : "..volume,0,font:getHeight("X")*3)

    else
        love .graphics.print("Pas de musique en cours de lecture.",0,font:getHeight("X"))
        love .graphics.print("piste à lire : "..piste,0,font:getHeight("X")*2)
    end
end
0
Début du sujet

En effet désolé, voici mon code :

 -- Cette ligne permet d'afficher des traces dans la console pendant l'éxécution -- pour débugger :
io.stdout:setvbuf('no')

local font = love.graphics.newFont(14)
local pause = false
local debut = false
local piste = 2
local volumeMax = 1
local musicPaused = {}

--les musiques
local musicMask_Off = love.audio.newSource("sons/Mask_Off.ogg","stream")
local musicSe_Acabo = love.audio.newSource("sons/Se_Acabo.ogg","stream")
local musicI_Like_It = love.audio.newSource("sons/I_Like_It.ogg","stream")
local music50c = love.audio.newSource("sons/50Cent_In_Da_Club.ogg","stream")

local musicManager = {}

function CreateMusicManager()
  local myMM = {}
  myMM.lstMusics = {} -- listes des music
  myMM.currentMusic = 0 --ID de la music en cours
  
  function myMM.addMusic(pMusic)--obéit comme une instance d'objet
    local newMusic = {}
    newMusic.source = pMusic
    --s'assure de faire boucler la musique
    newMusic.source:setLooping(true)
    --cope le volume par défaut 
    newMusic.source:setVolume(0)
    table.insert(myMM.lstMusics, newMusic)    
    
  end 
  
  function myMM.update(dt)
    --parcours ttes les musiques pour s'assurer :
    --1) que la musique en cours à son volume à 1, sinon on l'augmente
    --2) que si une ancienne musique n'a pas son volume à 0, on le baisse
    for index, music in ipairs(myMM.lstMusics) do
      if index == myMM.currentMusic then
        if music.source:getVolume() < volumeMax then --and pause == false then
          music.source:setVolume(music.source:getVolume()+0.01 * dt)
        else
          music.source:setVolume(volumeMax)
        end      
      else
        if music.source:getVolume() > 0 then
          music.source:setVolume(music.source:getVolume()-0.1 * dt)
          --if music.source:getVolume() <= 0 then
            --music.source:stop()
          --end          
        end        
      end      
    end    
  end
    
  function myMM.PlayMusic(pNum)
    --récupère la musique dans la liste et la démarre
    print("ok")
    local music = myMM.lstMusics[pNum]
    if music.source:getVolume() == 0 and myMM.currentMusic ~= pNim then
      print("start music "..pNum)
      music.source:play()
    end
    --prend note de la nouvelle musique
    --pour que la méthode update prenne le relai
    myMM.currentMusic = pNum    
  end
  
  return myMM  
end

function StopAllMusic()
  for _, music in ipairs(musicManager.lstMusics) do
    music.source:setVolume(0)
    music.source:stop()
  end  
end

function StopAllOtherMusic(exclus)
  for _, music in ipairs(musicManager.lstMusics) do
    if music ~= exclus then
      print("music",music)
      music.source:setVolume(0)
      music.source:stop()
    end    
  end  
end



function love.load()
print("load atteint")
  --crée le musicManager et lui ajouter des musiques
  musicManager = CreateMusicManager()--crée l"objet"
  musicManager.addMusic(musicMask_Off)
  musicManager.addMusic(musicSe_Acabo)
  musicManager.addMusic(musicI_Like_It)
  musicManager.addMusic(music50c)
  --démarre la 1ère musique
  --musicManager.PlayMusic(1)
  
    -- Initialisez l'état de pause pour chaque piste à faux
  for i = 1, #musicManager.lstMusics do
      musicPaused[i] = false
  end
  
end

function love.keypressed(key)--non remanante
  local ctrl = love.keyboard.isDown("lctrl") or love.keyboard.isDown("rctrl")
  
  
  local current = love.audio.getActiveSourceCount()
    if key == "right"  then
      if piste < #musicManager.lstMusics then
        piste = piste +1
      else
        piste = 1
      end  
      if current > 0 then
        musicManager.PlayMusic(piste)
      end      
    end    
    if key == "left" then
      if piste > 1 then
        piste = piste - 1
      else
        piste = #musicManager.lstMusics
      end  
      if current > 0 then
        musicManager.PlayMusic(piste)
      end    
    end    
  
  
  if key == "a" then
    musicManager.lstMusics[piste].source:stop()      
    musicManager.lstMusics[piste].source:setVolume(0)
    musicManager.PlayMusic(piste)  
  end    
  
  if key == "s" then
    StopAllMusic()
    
  end    
    --print("pause",pause)
  local pisteEnCours = musicManager.lstMusics[piste].source
  local position
  if key == "p" then  
    if musicManager.lstMusics[piste].source:isPlaying() then --and pause == false then
    --if pause == false then     
      print("1pause false dans P pause",pause)
      StopAllOtherMusic(musicManager.lstMusics[piste])
      --StopAllMusic()
      
      local current = love.audio.getActiveSourceCount()
      print("current",current)
      musicManager.lstMusics[piste].source:pause()
      print("pisteEnCours",musicManager.lstMusics[piste].source)
      --musicManager.lstMusics[piste].source:pause() 
      --love.audio.pause( )
      --pisteEnCours=musicManager.lstMusics[piste].source:getPosition( )
      print("2positonPause",positonPause)
      --pause = true
    else
      --love.audio.play()
      print("3pause true dans P pause",pause)
      print("pisteEnCours",musicManager.lstMusics[piste].source)
      local current = love.audio.getActiveSourceCount()
      print("current2",current)
      --StopAllOtherMusic(musicManager.lstMusics[piste])
     love.audio.play(musicManager.lstMusics[piste].source)
     print("pisteEnCours",musicManager.lstMusics[piste].source)
     --musicManager.lstMusics[piste].source:play() 
     
            current = love.audio.getActiveSourceCount()
      print("current3",current)
      print("pisteEnCours",musicManager.lstMusics[piste].source)
      print("4pause true après dans P pause",pause)
      --love.audio.play(musicManager.lstMusics[piste].source)
      --musicManager.lstMusics[piste].source:play() 
    end
    --pause = true
    --print("pause false dans P devient true",pause)
  end  

  
  --if key == "p" then
      -- Inversez l'état de pause de la piste actuelle
    --  musicPaused[piste] = not musicPaused[piste]
      --if musicPaused[piste] then
          -- Si en pause, mettez en pause la musique
        --  musicManager.lstMusics[piste].source:pause()
      --else
          -- Si pas en pause, reprenez la musique depuis le point de pause
        --  musicManager.lstMusics[piste].source:play()
      --end
  --end
  
  
  
  
  
  
end


function love.update(dt)
  --parametrage/délaration touches rémanantes
	local shift = love.keyboard.isDown("lshift") or love.keyboard.isDown("rshift")--déclartion de touches rémanant aditionnel en boolean
  if love.keyboard.isDown("up") and shift then
    if volumeMax < 1 then
      volumeMax = volumeMax +0.1*dt*4
    end   
  end
  
  if love.keyboard.isDown("down") and shift then
    if volumeMax > 0 then
      volumeMax = volumeMax -0.1*dt*4
    end    
  end 
  
    if love.keyboard.isDown("up") and shift == false then
    if volumeMax < 1 then
      volumeMax = musicManager.lstMusics[piste].source:getVolume()
      volumeMax = volumeMax +0.1*dt*4
      musicManager.lstMusics[piste].source:setVolume(volumeMax)
    end   
  end
  
  if love.keyboard.isDown("down") and shift == false then
    if volumeMax > 0 then
      volumeMax = musicManager.lstMusics[piste].source:getVolume()
      volumeMax = volumeMax -0.1*dt*4
    end    
  end 
  
  --musicManager.PlayMusic(1)
  --demande au MusicManagerr de se mettre à jour
  musicManager.update(dt)
end

function love.draw()
  love .graphics.print("début de lecture : 'a' ; stop : 's' ; pause : 'p' ; volmue maximum et minimum : 'ctrl + up' 'ctrl + down' ; volmue : 'up' 'down'",0,0)
  local current = love.audio.getActiveSourceCount()
  if current ~= 0 then 
    love .graphics.print("piste en cours : "..musicManager.currentMusic,0,font:getHeight("X"))
    local volume = musicManager.lstMusics[musicManager.currentMusic].source:getVolume()
    love .graphics.print("volume maximum : "..volumeMax,0,font:getHeight("X")*2)
    love .graphics.print("volume piste en cours : "..volume,0,font:getHeight("X")*3)
    
  else
    love .graphics.print("Pas de musique en cours de lecture.",0,font:getHeight("X"))
    love .graphics.print("piste à lire : "..piste,0,font:getHeight("X")*2)
  end
end
Thi Nga Nguyen 07/09/2023 3:15

@muchembled 

voici ce que j'ai fait si cela peut t'aider

Spoiler
un exemple simple

io.stdout:setvbuf('no')
local lstMusics={}
local current=1
function pauseAndPlay(pLast,pCurrent)
    local last=pLast
    current=pCurrent
    if(current>#lstMusics) then
        current=1
    end
    if(current<1) then
        current=#lstMusics;
    end
    lstMusics[last]:setVolume(0)
    lstMusics[last]:pause()
    lstMusics[current]:setVolume(1)
    lstMusics[current]:play()
end
function love.load()
    lstMusics[1]=love.audio.newSource("sons/Pirate 1.ogg","stream")
    lstMusics[2]=love.audio.newSource("sons/Pirate 2.ogg","stream")
    lstMusics[3]=love.audio.newSource("sons/Pirate 3.ogg","stream")
    lstMusics[4]=love.audio.newSource("sons/Pirate 4.ogg","stream")
    for _,music in ipairs(lstMusics) do
        music:setLooping(true)
        music:pause()
        music:setVolume(0)
    end
end
function love.draw()
    love.graphics.print(" a => lance la lecture ou reprend le morceau courant right => suivant left => precedent",100,0)
    love.graphics.print(" p => pause s =>stop",100,16)
end
function love.keypressed(key)
    if key=="a" then
        lstMusics[current]:setVolume(1)
        lstMusics[current]:play()
    elseif key=="right" then
        pauseAndPlay(current,current+1)    
    elseif key=="left" then
        pauseAndPlay(current,current-1)
    elseif key=="s" then
        lstMusics[current]:setVolume(0)
        lstMusics[current]:stop()
    elseif key=="p" then
        lstMusics[current]:setVolume(0)
        lstMusics[current]:pause()
    end
end

0
Début du sujet

Merci Thi NgaNguyen,

Je vais travailler avec ton code 

Thi Nga Nguyen 07/09/2023 7:31

@muchembled 

Pour repondre a ta question sur love.audio.play(xxxx) tu peux ajouter  a ta fonction keypressed le code qui suit. Si tu souhaites utiliser la touche p pour mettre en pause et reprendre le morceau tu as  xxxx:isPlaying() qui renvoie un boolean

bonne journee a toi sansucre

elseif key=="x" then
        for _,music in ipairs(lstMusics) do
            music:setVolume(1)
        end
        love.audio.play(lstMusics)
elseif key=="y" then
        love.audio.stop()
elseif key=="z" then
        love.audio.pause()
end
0
Début du sujet

Translator
 
 
 

Merci encore Thi Nga Nguyen pour ton aide.
A partir de ton code, j'ai tenté de rentre le volume sonore dynamique entre 2 pistes.
Tel que dans l'exemple du cours de l'atelier "sons et musiques".
mon code ne fonctionne pas avec la 1ère piste, je le sais, c'est juste pour tester sur les pistes suivantes.
J'ai placé ta fonction'pauseAndPlay' dans Love.update(dt), en modifiant les parties de gestion du volume, mais pour une raison que j'ignore : le volume resete static, il reste bloqué à 0.19....
Vois-tu ce que je fais de mal ?

io.stdout:setvbuf('no')
local lstMusics={}
local current=1


function love.load()
    lstMusics[1]=love.audio.newSource("sons/Mask_Off.ogg","stream")
    lstMusics[2]=love.audio.newSource("sons/Se_Acabo.ogg","stream")
    lstMusics[3]=love.audio.newSource("sons/I_Like_It.ogg","stream")
    lstMusics[4]=love.audio.newSource("sons/50Cent_In_Da_Club.ogg","stream")
    for _,music in ipairs(lstMusics) do
        music:setLooping(true)
        music:pause()
        music:setVolume(0)
    end
end

function love.update(dt)
	function pauseAndPlay(pLast,pCurrent)
    local last=pLast
    current=pCurrent
	if(current>#lstMusics) then
		current=1
	end
	if(current<1) then
		current=#lstMusics;
	end
		
	if lstMusics[last]:getVolume() > 0 then
		lstMusics[last]:setVolume(lstMusics[last]:getVolume()-0.1*dt)
		if lstMusics[last]:getVolume() <= 0.02 then
		    lstMusics[last]:setVolume(0)
			lstMusics[last]:pause()
		end
	else  
		lstMusics[last]:setVolume(0)
		lstMusics[last]:pause()
	end
	
	--lstMusics[current]:setVolume(0)
    lstMusics[current]:play()
	if lstMusics[current]:getVolume() < 1 then
		lstMusics[current]:setVolume(lstMusics[current]:getVolume()+0.1*dt*1000)
	end
    --lstMusics[last]:setVolume(0)
    --lstMusics[last]:pause()
    --lstMusics[current]:setVolume(1)
    --lstMusics[current]:play()	
	end

end

function love.draw()
  local current = love.audio.getActiveSourceCount()
  love.graphics.print(" a => lance la lecture ou reprend le morceau courant right => suivant left => precedent",100,0)
  love.graphics.print(" p => pause s =>stop",100,16)
  if current ~= 0 then 
    local volume = lstMusics[current]:getVolume()
    love.graphics.print("volume : "..volume,100,32)
  end
    
end
function love.keypressed(key)
    if key=="a" then
        --lstMusics[current]:setVolume(1)
        lstMusics[current]:play()
    elseif key=="right" then
        pauseAndPlay(current,current+1)    
    elseif key=="left" then
        pauseAndPlay(current,current-1)
    elseif key=="s" then
        lstMusics[current]:setVolume(0)
        lstMusics[current]:stop()
    elseif key=="p" then
        lstMusics[current]:setVolume(0)
        lstMusics[current]:pause()
    end
end
Ce message a été modifié Il y a 6 mois parSansucre
0
Début du sujet

J'ai compris le problème mais je ne sais pas comment le résoudre : la fonction 'pauseAndPlay' n'a pas accès à un 'dt' updaté  le 'dt' pris en compte a la valeur de 'dt' au moment ou la fonction est lancée, et rien n'est dynamique.

Il faut que je transmette dt a la fonction mais je ne sais pas comment faire 

Thi Nga Nguyen 08/09/2023 3:50

@muchembled 

Bonjour a toi,

peux tu sortir la declaration de la fonction pauseAndPlay de la Update. et la mettre avant function love.load(). tu peux rajouter le dt en parametre de pauseAndPlay  ce qui donnerai dans la declaration function pauseAndPlay(pLast, pCurrent,pDetlaTime) ce que je t'ai donne est un exemple 

0
Début du sujet

Bonjour Thi,

Merci de ton aide et de tes conseils,

Je galère vraiment avec la dynamise du son.

avec le code ci-dessous, je parviens à rendre dynamique la musique 'current' et elle augmente progressivement.

Par contre la musique 'last' n'est pas prise en compte.

Je pense que je vais continué les autres ateliers, et que je reviendrais sur ce problème plu tard.

	local last = 0
function pauseAndPlay(pLast,pCurrent)
  --local last=pLast
  last=pLast
  current=pCurrent
	if(current>#lstMusics) then
		current=1
	end
	if(current<1) then
		current=#lstMusics;
	end

	
    lstMusics[current]:setVolume(0)
    lstMusics[current]:play()

end
	
function love.update(dt)
	if current ~= 0 then
      if lstMusics[current]:getVolume() < 1 then
        lstMusics[current]:setVolume(lstMusics[current]:getVolume()+ 0.015*dt) 
        volumeCurrent = lstMusics[current]:getVolume()
      end
	end
  if last ~= 0 then 
    if lstMusics[last]:getVolume() < 1 then
      lstMusics[last]:setVolume(lstMusics[last]:getVolume()- 0.015*dt) 
    end      
  end
end
Sansucre Début du sujet 08/09/2023 3:11

Translator
 
 
 

finalement j'ai continué a travailler dessus.

La pause n'est pas stable a 100%

mais ça marche pour le fondu enchainé entre 2 piste, le stop aussi :

 

-- Désactive la mise en mémoire tampon pour la sortie standard.
io.stdout:setvbuf('no')

-- Tableau pour stocker les pistes audio.
local lstMusics={}

-- Index de la piste audio actuelle.
local current=1

-- Durée en secondes pour le fondu enchaîné.
local fadeDuration = 20--plus le nombre est élevé, plus la progression est lente
local vitesseDiminution = 5/10000

-- Timer pour le fondu enchaîné.
local fadeTimer = 0

-- Variable pour suivre l'état de la pause.
local isPaused = false

-- Fonction pour mettre en pause la piste précédente et jouer la nouvelle piste en fondu.
function pauseAndPlay(pLast, pCurrent)
    local last = pLast
    current = pCurrent

    -- Gestion des limites de l'index.
    if current > #lstMusics then
        current = 1
    end
    if current < 1 then
        current = #lstMusics
    end

    -- Réinitialisation du timer de fondu.
    fadeTimer = 0

    -- Mise en pause de la piste précédente et réglage du volume de la nouvelle piste.
    lstMusics[current]:setVolume(0)
    lstMusics[current]:play()
end

-- Fonction pour arrêter toutes les musiques en cours de lecture.
function stopAllMusic()
    for _, music in ipairs(lstMusics) do
        music:setVolume(0)
        music:stop()
    end
end

-- Fonction de chargement initial.
function love.load()
    -- Chargement des pistes audio.
    lstMusics[1] = love.audio.newSource("sons/Mask_Off.ogg", "stream")
    lstMusics[2] = love.audio.newSource("sons/Se_Acabo.ogg", "stream")
    lstMusics[3] = love.audio.newSource("sons/I_Like_It.ogg", "stream")
    lstMusics[4] = love.audio.newSource("sons/50Cent_In_Da_Club.ogg", "stream")
    
    -- Configuration des pistes audio.
    for _, music in ipairs(lstMusics) do
        music:setLooping(true)
        music:pause()
        music:setVolume(0)
    end
end

-- Fonction de mise à jour.
function love.update(dt)
    -- Gestion du fondu enchaîné.
    if fadeTimer < fadeDuration then
        local prevVolume = lstMusics[current - 1] and lstMusics[current - 1]:getVolume() or 0
        local tempVolume = lstMusics[current - 1] and lstMusics[current - 1]:getVolume() or 0
        
        fadeTimer = fadeTimer + dt
        
        if fadeTimer >= fadeDuration then
            lstMusics[current]:setVolume(1)
        else
            -- Calcul du nouveau volume en fonction du temps écoulé.
            local newVolume = fadeTimer / fadeDuration
            lstMusics[current]:setVolume(newVolume)
            
            -- Réglage du volume de la piste précédente.
            if prevVolume > 0 then
                lstMusics[current - 1]:setVolume(tempVolume - newVolume * vitesseDiminution)
                
                -- Mise en pause de la piste précédente lorsque son volume est proche de 0.
                if prevVolume < 0.01 then
                    lstMusics[current - 1]:pause()
                end
            end
        end
    end
end

-- Fonction de rendu graphique.
function love.draw()
    -- Affichage des instructions.
    love.graphics.print(" a => lance la lecture ou reprend le morceau courant right => suivant left => precedent", 100, 0)
    love.graphics.print(" p => pause s =>stop", 100, 16)
    
    -- Affichage du volume en temps réel si une piste est en cours de lecture
    if lstMusics[current]:isPlaying() then
        love.graphics.print("current : "..current,100,32)
        local currentVolume = lstMusics[current]:getVolume()
        love.graphics.print("Volume : " .. string.format("%.2f", currentVolume), 100, 48)
    end

    -- Affichage de la piste précédente en cours de lecture si elle existe.
    if current > 1 and lstMusics[current - 1]:isPlaying() then
        love.graphics.print("Piste précédente : " .. current - 1, 100, 64)
        local prevVolume = lstMusics[current - 1]:getVolume()
        love.graphics.print("Volume précédent : " .. string.format("%.2f", prevVolume), 100, 80)
    end
end

-- Fonction de gestion des événements de touche.
function love.keypressed(key)
    if key == "a" then
        pauseAndPlay(current, current)
    elseif key == "right" then
        pauseAndPlay(current, current + 1)
    elseif key == "left" then
        pauseAndPlay(current, current - 1)
    elseif key == "s" then
        stopAllMusic()  -- Stopper toutes les musiques en cours de lecture et réinitialiser leur volume.
    elseif key == "p" then
        if isPaused then
            -- Reprise de la musique courante si elle est en pause.
            lstMusics[current]:play()
        else
            -- Mise en pause de toutes les musiques en cours de lecture.
            for _, music in ipairs(lstMusics) do
                music:pause()
            end
        end
        -- Inversion de l'état de pause.
        isPaused = not isPaused
    end
end
Sansucre Début du sujet 08/09/2023 6:03

Translator
 
 
 

La pause un bug qui apparaît parfois, de façon aléatoire semble-t-il, je ne sais pas pourquoi, mais je vais en resté là pour l'instant c'est quasiment ce que je voulais, merci Thi :

-- Désactive la mise en mémoire tampon pour la sortie standard.
io.stdout:setvbuf('no')

-- Tableau pour stocker les pistes audio.
local lstMusics={}

-- Index de la piste audio actuelle.
local current=1

-- Durée en secondes pour le fondu enchaîné.
local fadeDuration = 20--plus le nombre est élevé, plus la progression est lente
local vitesseDiminution = 5/10000

-- Timer pour le fondu enchaîné.
local fadeTimer = 0

-- Variable pour suivre l'état de la pause.
local isPaused = false

-- Fonction pour mettre en pause la piste précédente et jouer la nouvelle piste en fondu.
function pauseAndPlay(pLast, pCurrent)
    local last = pLast
    current = pCurrent

    -- Gestion des limites de l'index.
    if current > #lstMusics then
        current = 1
    end
    if current < 1 then
        current = #lstMusics
    end

    -- Réinitialisation du timer de fondu.
    fadeTimer = 0

    -- Mise en pause de la piste précédente et réglage du volume de la nouvelle piste.
    lstMusics[current]:setVolume(0)
    lstMusics[current]:play()
end

-- Fonction pour arrêter toutes les musiques en cours de lecture.
function stopAllMusic()
    for _, music in ipairs(lstMusics) do
        music:setVolume(0)
        music:stop()
    end
end

-- Fonction de chargement initial.
function love.load()
    -- Chargement des pistes audio.
    lstMusics[1] = love.audio.newSource("sons/Mask_Off.ogg", "stream")
    lstMusics[2] = love.audio.newSource("sons/Se_Acabo.ogg", "stream")
    lstMusics[3] = love.audio.newSource("sons/I_Like_It.ogg", "stream")
    lstMusics[4] = love.audio.newSource("sons/50Cent_In_Da_Club.ogg", "stream")
    
    -- Configuration des pistes audio.
    for _, music in ipairs(lstMusics) do
        music:setLooping(true)
        music:pause()
        music:setVolume(0)
    end
end

-- Fonction de mise à jour.
function love.update(dt)
  if isPaused == false then
    -- Gestion du fondu enchaîné.
    if fadeTimer < fadeDuration then
        local prevVolume = lstMusics[current - 1] and lstMusics[current - 1]:getVolume() or 0
        local tempVolume = lstMusics[current - 1] and lstMusics[current - 1]:getVolume() or 0
        
        fadeTimer = fadeTimer + dt
        
        if fadeTimer >= fadeDuration then
            lstMusics[current]:setVolume(1)
        else
            -- Calcul du nouveau volume en fonction du temps écoulé.
            local newVolume = fadeTimer / fadeDuration
            lstMusics[current]:setVolume(newVolume)
            
              -- Réglage du volume de la piste précédente.
              if prevVolume > 0 then
                  lstMusics[current - 1]:setVolume(tempVolume - newVolume * vitesseDiminution)
                  
                  -- Mise en pause de la piste précédente lorsque son volume est proche de 0.
                  if prevVolume < 0.01 then
                      lstMusics[current - 1]:pause()
                  end
              end
        end
    end
  end  
end

-- Fonction de rendu graphique.
function love.draw()
    -- Affichage des instructions.
    love.graphics.print(" a => lance la lecture ou reprend le morceau courant right => suivant left => precedent", 100, 0)
    love.graphics.print(" p => pause s =>stop", 100, 16)
    
    -- Affichage du volume en temps réel si une piste est en cours de lecture
    if lstMusics[current]:isPlaying() then
        love.graphics.print("current : "..current,100,32)
        local currentVolume = lstMusics[current]:getVolume()
        love.graphics.print("Volume : " .. string.format("%.2f", currentVolume), 100, 48)
    end

    local past
    if current == 1 then
      past = #lstMusics
    else
      past = current - 1 
    end

    -- Affichage de la piste précédente en cours de lecture si elle existe.
    if current >= 1 and lstMusics[past]:isPlaying() then
        
          love.graphics.print("Piste précédente : " .. past, 100, 64)
          local prevVolume = lstMusics[past]:getVolume()
          love.graphics.print("Volume précédent : " .. string.format("%.2f", prevVolume), 100, 80)
                    
    end
    if isPaused then
      love.graphics.print("pause active", 100, 96)
    else      
      love.graphics.print("pause non active", 100, 96)
    end
      
end

function MiseEnPause()
    if isPaused then
      for _, music in ipairs(lstMusics) do
          music:pause()          
      end
   end
end


-- Fonction de gestion des événements de touche.
function love.keypressed(key)
  if key == "a" then
      pauseAndPlay(current, current)
  elseif key == "right" then
      isPaused = false
      pauseAndPlay(current, current + 1)
  elseif key == "left" then
      isPaused = false
      pauseAndPlay(current, current - 1)
  elseif key == "s" then
      stopAllMusic()  -- Stopper toutes les musiques en cours de lecture et réinitialiser leur volume.
  elseif key == "p" then
    local currentMusic = lstMusics[current]
    local encours = love.audio.getActiveSourceCount()
    if isPaused == true then
      lstMusics[current]:play()   
      isPaused = false
    else
      isPaused = true
      MiseEnPause()    
    end
  end
end
0

de rien si cela a put t'aider avec mon exemple basique j'en suis heureux pour toi. Tu pourras toujours revenir dessus lorsque tu auras un peu plus progresse.

Dommage que je n'ai pas eu de reponse a mon poste sur un probleme en c++ dont je ne voyais pas le probleme et que j'ai fini par demander a David de supprimer mon message

Je te souhaite une bonne journee

Répondre
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.