2017-02-24 2 views
3

Ceci est juste le fichier de test, j'ai ma classe Sound et je l'appelle depuis une autre classe principale. Il joue pendant 3 secondes, puis il s'arrête, puis il ne joue plus. Quel pourrait être le problème?Le son Java ne fonctionne pas après l'avoir arrêté

Cela me rend fou.

Classe son

public class Sound { 

    private static URL url1, url2, url3, url4; 
    private static AudioClip gun, boom; 
    private static Clip menuClip, gameClip; 
    private static AudioInputStream menu, game; 

    public static boolean menuPlaying, gamePlaying, explosionOn; 

    public Sound() { 
     menuPlaying = false; 
     gamePlaying = false; 
     url1 = Sound.class.getResource("/laserSound.wav"); 

     url2 = Sound.class.getResource("/boom.wav"); 

     url3 = Sound.class.getResource("/adventure.wav"); 

     url4 = Sound.class.getResource("/adventure.wav"); 

     gun = Applet.newAudioClip(url1); 

     boom = Applet.newAudioClip(url2); 

     try { 
      game = AudioSystem.getAudioInputStream(url4); 
      //menu = AudioSystem.getAudioInputStream(url3); 
     } catch (UnsupportedAudioFileException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void playGunSound() { 
     gun.play(); 
    } 

    public void stopGunSound() { 
     gun.stop(); 
    } 

    public void playExplosion() { 
     boom.stop(); 
     boom.play(); 
    } 

    public void stopExplosion() { 
     boom.stop(); 
    } 
    public void playGameMusic() throws LineUnavailableException { 
     if (gamePlaying == false) { 
      gameClip = AudioSystem.getClip(); 
      try { 
       gameClip.open(game); 
      } catch (
      LineUnavailableException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      gameClip.start(); 
      gameClip.loop(Clip.LOOP_CONTINUOUSLY); 
      gamePlaying = true; 
     } 
    } 

    public void stopGameMusic() { 
      gameClip.stop(); 
      gamePlaying = false; 

    } 

} 

Méthode principale

public static void main(String[] args) throws LineUnavailableException, InterruptedException { 
    Sound sound = new Sound(); 
    sound.playGameMusic(); 
    TimeUnit.SECONDS.sleep(3); 
    sound.stopGameMusic(); 
    TimeUnit.SECONDS.sleep(3); 
    sound.playGameMusic(); 
} 
+0

avez-vous essayé de le déboguer? Et si vous instanciez un nouvel objet 'Sound'? –

+0

Oui cela fonctionne quand j'instancie un nouvel objet Sound. Je ne sais toujours pas pourquoi cela ne fonctionne pas sans instancier, mais je vous remercie de votre aide ... :) @ScaryWombat – KiranGautam

+0

Probablement vous devez libérer la ressource après avoir appelé la méthode d'arrêt, de sorte qu'il joue à nouveau sur l'appel playmusic – SoulRayder

Répondre

1

La façon dont le code est maintenant, il y a quelques choses curieuses qui doivent être nettoyés.

Tout d'abord, il serait bon de mettre le gameClip.open dans une méthode séparée. Vous avez seulement besoin d'ouvrir un clip une fois. Tant que vous ne le fermez pas, vous pouvez le démarrer et l'arrêter à volonté. En l'état, vous ouvrez le clip à chaque lecture, et chaque fois que vous le faites, le fichier audio entier doit être chargé en mémoire avant la lecture du clip. Cela annule le but de l'objet Clip.

Deuxièmement, le démarrage suivi de la boucle est redondant. L'un ou l'autre jouera le clip. Si vous voulez une lecture en boucle continue, appelez simplement la méthode de la boucle, ne démarrez pas. Après avoir nettoyé ces deux choses, nous allons revoir le code et voir si les problèmes ont disparu ou non. Je ne sais pas si le problème est dû à une erreur spécifique ou si l'une de vos deux opérations de code redondantes crée une situation non définie/inattendue.

Avez-vous regardé l'API Clip?

Je n'ai pas d'expérience avec AudioClip. Mais j'ai utilisé le clip avec succès.

+0

Merci beaucoup. Mettre gameClip.open dans une méthode séparée a résolu aussi j'ai enlevé le début redondant, cela fonctionne parfaitement. Merci de votre aide. – KiranGautam