J'ai un problème très spécifique avec JLayer
dans mon projet Music-Player. Je veux inclure quelque chose pour ajuster le volume, mais il semble que ce ne soit pas si facile à mettre en œuvre.Modification du volume avec JLayer
Ceci est dû au fait que JLayer
ne le prend pas en charge par lui-même. J'ai exclu la classe Player
de mon projet et a changé certaines méthodes et cela fonctionne bien pour jouer mp3
. Pour régler le volume I ajouté à la classe Player
cette méthode:
public boolean setGain(float newGain) {
if (audio instanceof JavaSoundAudioDevice) {
System.out.println("InstanceOf");
JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio;
try {
jsAudio.write(null, 0, 0);
} catch (JavaLayerException ex) {
ex.printStackTrace();
}
return jsAudio.setLineGain(newGain);
}
return false;
}
Je puis extrait le JavaSoundAudioDevice
, décompilé et changé:
public boolean setLineGain(float gain)
{
System.out.println("Vor Source");
if (source != null)
{
System.out.println("Nach Source");
FloatControl volControl = (FloatControl) source.getControl(FloatControl.Type.MASTER_GAIN);
float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum());
volControl.setValue(newGain);
return true;
}
return false;
}
Et:
public void createSource() throws JavaLayerException {
Throwable t = null;
try {
Line line = AudioSystem.getLine(getSourceLineInfo());
if (line instanceof SourceDataLine) {
source = (SourceDataLine) line;
//source.open(fmt, millisecondsToBytes(fmt, 2000));
source.open(fmt);
/*
if (source.isControlSupported(FloatControl.Type.MASTER_GAIN))
{
FloatControl c = (FloatControl)source.getControl(FloatControl.Type.MASTER_GAIN);
c.setValue(c.getMaximum());
}*/
source.start();
}
} catch (RuntimeException ex) {
t = ex;
} catch (LinkageError ex) {
t = ex;
} catch (LineUnavailableException ex) {
t = ex;
}
if (source == null) {
throw new JavaLayerException("cannot obtain source audio line", t);
}
}
Mais la La méthode createSource
, qui était déjà implémentée, ne fonctionne pas. Sur la ligne
Line line = AudioSystem.getLine(getSourceLineInfo());
Je reçois toujours un IllegalArgumentException:
java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 0.0 Hz, 16 bit, 0 channels, 0 bytes/frame, little-endian is supported.
at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:479)
at javazoom.jl.player.JavaSoundAudioDevice.createSource(JavaSoundAudioDevice.java:80)
at javazoom.jl.player.JavaSoundAudioDevice.writeImpl(JavaSoundAudioDevice.java:119)
at javazoom.jl.player.AudioDeviceBase.write(Unknown Source)
at MusikPlayer.Erweiterungen.Players.MyPlayer.setGain(MyPlayer.java:192)
at MusikPlayer.PlayerTest.main(PlayerTest.java:21)
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_SIGNED 0.0 Hz, 16 bit, 0 channels, 0 bytes/frame, little-endian is supported.
at javax.sound.sampled.AudioSystem.getLine(AudioSystem.java:479)
at javazoom.jl.player.JavaSoundAudioDevice.createSource(JavaSoundAudioDevice.java:80)
at javazoom.jl.player.JavaSoundAudioDevice.writeImpl(JavaSoundAudioDevice.java:119)
at javazoom.jl.player.AudioDeviceBase.write(Unknown Source)
at MusikPlayer.Erweiterungen.Players.MyPlayer.decodeFrame(MyPlayer.java:161)
at MusikPlayer.Erweiterungen.Players.MyPlayer.play(MyPlayer.java:87)
at MusikPlayer.Erweiterungen.Players.MyPlayer.play(MyPlayer.java:66)
at MusikPlayer.PlayerTest.main(PlayerTest.java:22)
Est-ce que quelqu'un sait pourquoi cela se passe? Est-ce que quelqu'un sait comment résoudre ce problème?
Avez-vous commencé à partir de [ccm.libs.javazoom.jl.player.JavaSoundAudioDevice] (https://github.com/CCM-Modding/Pay2Spawn/blob/master/src/main/java/ccm/libs/javazoom /jl/player/JavaSoundAudioDevice.java) sur GitHub? Il semble être open source donc je ne vois pas le besoin de décompiler quelque chose. –
Pour autant que je l'ai comparé, les deux classes sont les mêmes. Je viens de décompiler la classe de ma bibliothèque jlayer dont je dispose: http://www.javazoom.net/javalayer/sources.html – Schesam
Téléchargez le projet depuis GitHub et déboguez-le. Ce problème nécessite une connaissance intime de cette bibliothèque. C'est l'avantage d'être open source: vous pouvez trouver le problème vous-même. –