2016-04-10 5 views
1

Я пишу новую аудиосистему для своей игры, и я столкнулся с этой ошибкой и не могу найти и найти где-нибудь,Ошибка при загрузке аудио в java (незаконный вызов open() в интерфейсе Clip)

java.lang.IllegalArgumentException: illegal call to open() in interface Clip 
at com.sun.media.sound.DirectAudioDevice$DirectClip.implOpen(Unknown Source) 
at com.sun.media.sound.AbstractDataLine.open(Unknown Source) 
at com.sun.media.sound.AbstractDataLine.open(Unknown Source) 

Это код, который я использую для загрузки и воспроизведения звука.

private Clip load(String filename) {   
    try { 
     //Loads the file 
     InputStream in = new FileInputStream(new File("res/" + filename + FILE_EXT)); 
     //Create the input buffer 
     InputStream bufferedIn = new BufferedInputStream(in); 
     //Convert into an audio stream 
     AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn); 
     //Get the audio format 
     AudioFormat format = audioStream.getFormat(); 
     //Get the data line info 
     DataLine.Info info = new DataLine.Info(Clip.class, format); 
     //Return the clip 
     Clip audioClip = (Clip) AudioSystem.getLine(info); 
     audioClip.addLineListener(this); 
     return this.clip = audioClip; 
    } catch (FileNotFoundException e) { 
     System.err.println("Failed to load audio! " + filename + " not found!"); 
     throw new RuntimeException(e); 
    } catch (UnsupportedAudioFileException e) { 
     System.err.println("Failed to load audio! " + filename + " is unsupported!"); 
     throw new RuntimeException(e); 
    } catch (IOException e) { 
     System.err.println("Failed to load audio! " + filename + " caused an IO Exception!"); 
     throw new RuntimeException(e); 
    } catch (LineUnavailableException e) { 
     System.err.println("Failed to load audio! " + filename + " line is unavalible!"); 
     e.printStackTrace(); 
    } 
    throw new RuntimeException("Failed to load audio! input == null!"); 
} 

private void startClip() { 
    if(this.clip != null) this.clip.start(); 
    else throw new RuntimeException("Failed to start audio clip! The clip appears to be null."); 
} 

private void stopClip() { 
    if(this.clip != null) this.clip.close(); 
    else throw new RuntimeException("Failed to close audio clip! The clip appears to be null."); 
} 

@Override 
public void play() { 
    try { 
     if(isPlaying()) return; 
     else { 
      startClip(); 
      this.clip.open(); 
      this.playing = true; 
     } 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
    } 
} 

Ошибка произошла в this.clip.open();

Может ли кто-нибудь мне помочь?

ответ

2

Вы ничего не передадите, чтобы играть Clip.

Line#open:

IllegalArgumentException - если этот метод вызывается на Clip инстанции.

Необходимо позвонить по номеру clip.open(audioStream), а не clip.open(). Кроме того, вам необходимо сделать это до, начиная с Clip.