2016-06-03 28 views
1

Ich versuche, etwas Einfaches zu tun. Ich möchte Sound auf einem bestimmten Soundmedium abspielen, anstatt auf dem Standardton zu spielen.Abspielen von Sound auf bestimmten Sound-Gerät Java

Dort ist mein letzter Versuch, alle Medien zu iterieren und einen Ton zu spielen. Nur die Medien auf dem Standardgerät spielen etwas. Selbst das Standardgerät funktioniert nicht, wenn es direkt abgespielt wird.

public void testSoundPLayer() throws Exception { 
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(Main.class.getResourceAsStream(Constants.SOUND_ALERT)); 

    Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 
    for(int i = 0; i < mixerInfo.length; i++) 
    { 
     Mixer.Info info = mixerInfo[i]; 

     System.out.println(String.format("Name [%s] \n Description [%s]\n\n", info.getName(), info.getDescription())); 
     System.out.println(info.getDescription()); 

     try 
     { 
      Clip clip = AudioSystem.getClip(info); 
      clip.open(inputStream); 
      clip.start(); 
     } 
     catch (Throwable t) 
     { 
      System.out.println(t.toString()); 
     } 
     Thread.sleep(2000L); 
    } 
} 

Ich bin offen für externe Libraries, oder sogar um die Standard-Soundkarte zu ändern. Ich möchte nur eine "nette" Methode, um einen Sound (WAV) auf einer bestimmten Soundkarte ohne OS-abhängige Methode zu spielen.

+0

'Clip' ist Teil der Java Sound nicht JMF. * "Ich möchte nur eine" nette "Methode, um einen Sound (WAV) ohne Betriebssystem abhängige Methode zu spielen." * Sie sind verwirrt. Der 'Clip' ist es! –

+0

Effektiv ist mein letzter Satz verwirrend. Ich möchte eine nette Methode, um einen Sound auf einer bestimmten Soundkarte abzuspielen. Ich bearbeite den Beitrag. – Manticore

Antwort

1

Das ist eine Schande, ich habe einen großen Fehler gemacht, ich habe den Stream nicht neu geladen. Dies bedeutet, dass die Sekundenwiedergabe nicht funktioniert.

Es gibt ein funktionierendes Beispiel.

public void testSoundPLayer() throws Exception { 

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 
for(int i = 0; i < mixerInfo.length; i++) 
{ 
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(Main.class.getResourceAsStream(Constants.SOUND_ALERT)); 

    Mixer.Info info = mixerInfo[i]; 

    System.out.println(String.format("Name [%s] \n Description [%s]\n\n", info.getName(), info.getDescription())); 
    System.out.println(info.getDescription()); 

    try 
    { 
     Clip clip = AudioSystem.getClip(info); 
     clip.open(inputStream); 
     clip.start(); 
    } 
    catch (Throwable t) 
    { 
     System.out.println(t.toString()); 
    } 
    Thread.sleep(2000L); 
} 

}

Zur Überprüfung, ob das Gerät ein Eingang oder Ausgang die folgende Methode verwenden:

// Param for playback (input) device. 
Line.Info playbackLine = new Line.Info(SourceDataLine.class); 
// Param for capture (output) device. 
Line.Info captureLine = new Line.Info(TargetDataLine.class); 


private List<Mixer.Info> filterDevices(final Line.Info supportedLine) { 
    List<Mixer.Info> result = Lists.newArrayList(); 

    ArrayList<Mixer.Info> infos = Lists.newArrayList(AudioSystem.getMixerInfo()); 
    for (Mixer.Info info : infos) { 
     Mixer mixer = AudioSystem.getMixer(info); 
     if (mixer.isLineSupported(supportedLine)) { 
      result.add(info); 
     } 
    } 
    return result; 
}