Gérer la fin de pause audio sur une liste de musique
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 ?
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
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 ?
@muchembled
bonjour a toi peux tu s'il te plait nous presenter un code comme cela :
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
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
@muchembled
voici ce que j'ai fait si cela peut t'aider
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
Merci Thi NgaNguyen,
Je vais travailler avec ton code
@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
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
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
@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
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
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
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
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
- 6 Forums
- 262 Sujets
- 906 Posts
- 0 En ligne
- 45.6 {numéro}K Membres