Hi,
ich benutze in meinem neuen Projekt mp3 SPI. Dies basiert bzw. erweitert ja Javasound. Leider hab ich das Problem
das beim beenden des Sound es immer knackst. Dies wollte ich damit umgehen das ich vorher die Lautstärke auf 0 setze.
Aus dem Internet hab ich folgenden Code:
Wenn ich diesen Code anwende erhalte ich folgende Exception:
Hier die ganze Klasse:
Was läuft hier falsch? Bei dem Beispiel im Internet wird das auf genau den selben Typ, nämlich SourceInputLine, angwendet. Oder hat jemand eine andere Idee das Knacksen wegzukriegen?
Gruß Alex
ich benutze in meinem neuen Projekt mp3 SPI. Dies basiert bzw. erweitert ja Javasound. Leider hab ich das Problem
das beim beenden des Sound es immer knackst. Dies wollte ich damit umgehen das ich vorher die Lautstärke auf 0 setze.
Aus dem Internet hab ich folgenden Code:
Java:
FloatControl control = (FloatControl) _sourceDataLine.getControl(FloatControl.Type.VOLUME);
control.setValue(0);
Wenn ich diesen Code anwende erhalte ich folgende Exception:
Java:
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported control type: Volume
at com.sun.media.sound.AbstractLine.getControl(Unknown Source)
at Sound.stopSound(Sound.java:86)
at Main.main(Main.java:19)
Hier die ganze Klasse:
Java:
public class Sound extends Thread{
private Boolean _playSound;
private AudioFormat _audioFormat;
private AudioInputStream _audioInputStream;
private SourceDataLine _sourceDataLine;
public Sound(String filename)
{
try
{
File file = new File(filename);
AudioInputStream in= AudioSystem.getAudioInputStream(file);
_audioInputStream = null;
AudioFormat baseFormat = in.getFormat();
_audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
_audioInputStream = AudioSystem.getAudioInputStream(_audioFormat, in);
_playSound = true;
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void run()
{
try
{
byte[] data = new byte[4096];
_sourceDataLine = getLine(_audioFormat);
if (_sourceDataLine != null)
{
// Start
_sourceDataLine.start();
int nBytesRead = 0;
while (nBytesRead != -1 && _playSound)
{
nBytesRead = _audioInputStream.read(data, 0, data.length);
if (nBytesRead != -1)
_sourceDataLine.write(data, 0, nBytesRead);
}
// Stop
_sourceDataLine.drain();
_sourceDataLine.stop();
}
}
catch(Exception e)
{
}
}
public void playSound()
{
start();
}
public void stopSound()
{
FloatControl control = (FloatControl) _sourceDataLine.getControl(FloatControl.Type.VOLUME);
control.setValue(0);
_sourceDataLine.stop();
}
private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException
{
SourceDataLine res = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
res = (SourceDataLine) AudioSystem.getLine(info);
res.open(audioFormat);
return res;
}
}
Was läuft hier falsch? Bei dem Beispiel im Internet wird das auf genau den selben Typ, nämlich SourceInputLine, angwendet. Oder hat jemand eine andere Idee das Knacksen wegzukriegen?
Gruß Alex
Zuletzt bearbeitet: