Advertisement
N2AZ

cc_music

Jul 18th, 2023 (edited)
912
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.25 KB | Gaming | 0 0
  1. -- Chargement du module dfpwm pour la gestion audio et recherche du périphérique "speaker"
  2. local dfpwm = require("cc.audio.dfpwm")
  3. local speaker = peripheral.find("speaker")
  4. local decoder = dfpwm.make_decoder()
  5.  
  6. -- Fonctions d'aide pour l'interface
  7. local function pos(...) term.setCursorPos(...) end
  8. local function cls() term.clear() end
  9. local function tCol(...) term.setTextColor(...) end
  10. local function bCol(...) term.setBackgroundColor(...) end
  11. local function box(...) paintutils.drawFilledBox(...) end
  12. local function line(...) paintutils.drawLine(...) end
  13.  
  14. -- Récupération de la taille du terminal
  15. local x, y = term.getSize()
  16.  
  17. -- Variable globale pour contrôler la lecture
  18. local isPlaying = false
  19. local currentLink = nil
  20.  
  21. -- Fonction pour jouer un lien direct de manière non bloquante
  22. local function playDirectLink(lien)
  23.     local handle = assert(http.get(lien, nil, true))
  24.     return function()
  25.         local chunk = handle.read(16 * 1024)
  26.         if chunk then
  27.             local buffer = decoder(chunk)
  28.             while not speaker.playAudio(buffer) do
  29.                 os.pullEvent("speaker_audio_empty")
  30.                 if not isPlaying then
  31.                     handle.close()
  32.                     return false
  33.                 end
  34.             end
  35.             return true
  36.         else
  37.             handle.close()
  38.             return false
  39.         end
  40.     end
  41. end
  42.  
  43. -- Fonction pour dessiner le menu principal de l'interface
  44. local function drawMenu()
  45.     cls()
  46.     box(1,1,x,y,colors.lightBlue) -- Fond d'écran
  47.  
  48.     local menuWidth = math.min(x - 2, 28)
  49.     local menuHeight = math.min(y - 2, 4) -- Réduit encore la hauteur du menu
  50.     local menuX = math.floor((x - menuWidth) / 2)
  51.     local menuY = math.floor((y - menuHeight) / 2)
  52.  
  53.     box(menuX, menuY, menuX + menuWidth, menuY + menuHeight, colors.gray) -- Menu
  54.     line(menuX, menuY, menuX + menuWidth, menuY, colors.lightGray) -- Barre du haut
  55.     line(menuX + menuWidth - 2, menuY, menuX + menuWidth, menuY, colors.red) -- Zone de fermeture
  56.  
  57.     local inputWidth = menuWidth - 10
  58.     line(menuX + 9, menuY + 2, menuX + 9 + inputWidth, menuY + 2, colors.black) -- Zone MUSIC
  59.  
  60.     tCol(colors.black) bCol(colors.red)
  61.     pos(menuX + menuWidth - 1, menuY)
  62.     write("X")
  63.  
  64.     tCol(colors.yellow) bCol(colors.gray)
  65.     pos(menuX + 1, menuY + 2)
  66.     write("MUSIC")
  67.  
  68.     tCol(colors.white) bCol(colors.black)
  69. end
  70.  
  71. -- Fonction pour jouer de la musique
  72. local function musicPlay()
  73.     local menuX = math.floor((x - math.min(x - 2, 28)) / 2)
  74.     local menuY = math.floor((y - math.min(y - 2, 4)) / 2)
  75.     pos(menuX + 9, menuY + 2)
  76.     local input = read()
  77.    
  78.     if input:sub(1,4) == "http" then
  79.         if isPlaying then
  80.             isPlaying = false -- Arrête la musique en cours
  81.             os.sleep(0.5) -- Attente pour s'assurer que la lecture précédente est arrêtée
  82.         end
  83.         currentLink = input
  84.         isPlaying = true
  85.         playNextChunk = playDirectLink(currentLink)
  86.     else
  87.         print("Lien invalide")
  88.         os.sleep(2)
  89.     end
  90.     drawMenu()
  91. end
  92.  
  93. -- Fonction principale
  94. local function main()
  95.     drawMenu()
  96.    
  97.     while true do
  98.         local event, button, mx, my = os.pullEvent()
  99.         if event == "mouse_click" and button == 1 then
  100.             local menuWidth = math.min(x - 2, 28)
  101.             local menuHeight = math.min(y - 2, 4)
  102.             local menuX = math.floor((x - menuWidth) / 2)
  103.             local menuY = math.floor((y - menuHeight) / 2)
  104.             local inputWidth = menuWidth - 10
  105.  
  106.             if mx >= menuX + 9 and mx <= menuX + 9 + inputWidth and my == menuY + 2 then
  107.                 musicPlay()
  108.             elseif mx >= menuX + menuWidth - 2 and mx <= menuX + menuWidth and my == menuY then
  109.                 isPlaying = false -- Arrête la musique si elle est en cours
  110.                 os.reboot()
  111.             end
  112.         end
  113.     end
  114. end
  115.  
  116. -- Modification du lancement du programme
  117. parallel.waitForAny(
  118.     main,
  119.     function()
  120.         while true do
  121.             if isPlaying and playNextChunk then
  122.                 if not playNextChunk() then
  123.                     isPlaying = false
  124.                     drawMenu()
  125.                 end
  126.             end
  127.             os.sleep(0)
  128.         end
  129.     end
  130. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement