Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Pygame/Module Music]

Programme bloquant...

Sujet résolu
Anonyme
    13 octobre 2012 à 13:41:18

    Hello !

    Voilà, je suis passé a la partie son de mon jeu que je développe avec Pygame. Petit problème, j'aimerai lancer un son en streaming sans qu'il bloque mon programme. Un son en fond quoi.

    J'ai déjà un premier jet de mon module, sauf qu'il est bloquant pour l'instant. Voici mon code :

    # -*- coding: utf-8 -*-
    
    import pygame
    import os
    
    # Suck but MAJ incoming
    
    def getSongs():
    	songs_list = []
    	for files in os.listdir("data"):
    		if files[-4:] == '.ogg':
    			songs_list.append(os.path.join("data",files))	
    	return songs_list
    
    def run():
    	pygame.mixer.init(22050,-16,2,2048)
    	songs_list = getSongs()	
    	print songs_list
    
    	while(1):
    		for song in songs_list:
    			try:
    				pygame.mixer.music.load(song)
    				print "Song loaded"
    				pygame.mixer.music.play()
    				while pygame.mixer.music.get_busy():
    					pass
    			except RuntimeError:
    				print "The sound doesnt load", song
    


    C'est le while qui bloque mon programme mais sans, mon son ne s’exécute pas ! Des idées ?
    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2012 à 16:10:16

      Je pense que la meilleure solution est d'utiliser les threads.
      En mettant la gestion du son dans un thread séparé tu ne seras plus bloqué dans ta boucle : tu pourras endormir cette partie du programme et le réveiller toutes les x secondes avec la fonction time.sleep(x) pour vérifier si la musique est terminée ou pas.
      Ce thread consommera très peu de ressources processeur (même avec un temps de pause plus faible) et ton programme principale pourra continuer normalement.
      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2012 à 0:04:22

        utilise ta boucle événementielle, à chaque fois qu'un morceau se termine, tu peux envoyer un signal dans la file d'événements qui indiquera qu'il faut charger un autre morceau ...

        pygame.mixer.music.set_endevent
        • Partager sur Facebook
        • Partager sur Twitter

        Python c'est bon, mangez-en. 

        Anonyme
          14 octobre 2012 à 11:19:53

          Les threads... J'y avais vraiment pas pensé ! Bon, j'ai implémenté ça et ça marche NI-CK-EL !! Merci beaucoup !

          Josmiley, je ne sais pas si tu avais bien compris mon problème : lorsque je lançais une musique quelconque mon programme était bloquant car je faisais un while pass. (pour lire la musique). Du coup avec un thread, je lance un processus annexe bloquant qui s'occupe de lancer la musique.

          • Partager sur Facebook
          • Partager sur Twitter
            14 octobre 2012 à 11:48:43

            Citation : Jlzz


            Josmiley, je ne sais pas si tu avais bien compris mon problème : lorsque je lançais une musique quelconque mon programme était bloquant car je faisais un while pass.



            j'avais compris ... toi par contre t'as pas compris que la lecture audio se fait déjà en arrière plan.
            Pygame permet de faire ce que tu veux sans thread additionnel; c'est ton algo qui n'est pas bon.
            • Partager sur Facebook
            • Partager sur Twitter

            Python c'est bon, mangez-en. 

            [Pygame/Module Music]

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown