Javasound - Kann Lautstärke nicht anpassen

AlexDozer

Aktives Mitglied
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:
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:

Ralph-Uwe

Bekanntes Mitglied
Hi,

ersetze mal in der stopSound Methode "Volumen" durch Master_Gain.

Java:
    public void stopSound() 
    {
        FloatControl control = (FloatControl) _sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
        control.setValue(0);
        
        _sourceDataLine.stop();
    }
 

AlexDozer

Aktives Mitglied
Hallo Ralph-Uwe,

leider funktioniert dies auch nicht. Es wird zwar keine Exception geworfen, aber es haut auch keine Auswirkungen d.h. die Laustärke ändert sich dadurch nicht.

Gruß Alex
 

Ralph-Uwe

Bekanntes Mitglied
Guten Morgen,

ich habe Deine Code genommen, die Änderung wie beschrieben durchgeführt und mit folgender main-Methode gestartet
und gestoppt:

Java:
private static Sound2 sound2 = new Sound2("f:/Audio/AudioTrack.mp3");

 public static void main(String args[]) throws MalformedURLException {
		 sound2.playSound();
		 try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		sound2.stopSound();
		 
	 }

sound starten und nach 5 sec wieder stoppen. Wobei die Wiedergabe nicht gestoppt wird sondern nur die Lautstärke auf
0 reduziert wird. Der Thread selber läuft weiter.
 
Zuletzt bearbeitet:

Ralph-Uwe

Bekanntes Mitglied
ich muss mich korrigieren,

wenn das Musikstück zu ende ist, stoppt der Thread.
Ich hatte im meinem Testprogramm noch andere implementationen die schuld waren, dass
der Thread nicht gestoppt hat. :-(
 

AlexDozer

Aktives Mitglied
Hmm, komisch das das bei dir einwandfrei funktioniert. Ich hab jetzt eine andere Lösung gefunden das Knacksen zu umgehen:

Java:
public class Sound {
	
	private Boolean _playSound;
	private AudioFormat _audioFormat;
	private AudioInputStream _audioInputStream;
	private SourceDataLine _sourceDataLine;
	private Thread _thread;
	
	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 playSound()                                                                                               
	{
		_playSound = true;
		_thread = new Thread() {
			
			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)
				{
					
				}
			}
		
		};
		_thread.start();
	}
	
	public void stopSound() 
	{
		_playSound = false;
	}

	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;
	}
}

Ich halte die Schleife, welche die Daten in die SourceDataLine schaufelt, einfach an. Bei diesem Verfahren ist kein
Knachsen zu hören.

Allerdings bleibt noch das Problem das wenn der Sound wieder gestartet wird, das er dann da anfängt wo er vorher gestoppt wurde. Aber das krieg ich auch noch hin.
 

Ralph-Uwe

Bekanntes Mitglied
Ich glaube ich war auch im falschen Märchen ;-) . Die Lautstärkeeinstellung funktionierte so auch nicht.

Das Einstellen der Lautstärke muss in die Schleife, in der die Daten von der Festplatte geladen werden und an die Soundkarte
weiter gereicht werden, da der Thread in der while-Scheife steckt.
Sonst wird auf die Lautstärke Änderung nicht reagiert.

Deine Sound Klasse würde so funktionieren:
Java:
public class Sound extends Thread{
    
    private Boolean _playSound;
    private AudioFormat _audioFormat;
    private AudioInputStream _audioInputStream;
    private SourceDataLine _sourceDataLine;
    private FloatControl control; //  neu FloatControl für den ganzen Thread zugänglich machen
    private int gainPercent = 90;  //gibt die Lautstärke in Prozent an.  (0% = -80dB und 100% = 6dB) //neu Anfangslautstärke
    
    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);
            control = (FloatControl) _sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); // neu hier das control besorgen
            if (_sourceDataLine != null)
            {
                // Start
                _sourceDataLine.start();
                int nBytesRead = 0;
                while (nBytesRead != -1 && _playSound)
                {
                	int gainLevel= (int) ((int)control.getMinimum()+((control.getMaximum()-control.getMinimum())/100*gainPercent)); // Berechnung der Lautstärke  (0% = -80dB und 100% = 6dB)
                	control.setValue(gainLevel); // neu Lautstärke in der While-Scheife
                	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 setVolumen(int volumen){
		if ((volumen <= 100) || (volumen >= 0)){
			gainPercent = volumen; // Setzen der Lautstärke zwischen 0 und 100 %
		}
		
	}
    
    
    
    public void stopSound() 
    {
         _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;
    }
}

das Hauptprogramm so:
Java:
	 public static void main(String args[]) throws MalformedURLException {
		 sound2.playSound();
		 try {
			 Thread.sleep(5000);
			 sound2.setVolumen(90);
			 Thread.sleep(5000);
			 sound2.setVolumen(80);
			 Thread.sleep(5000);
			 sound2.setVolumen(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	 }



}

Ich hoffe, dass ich Dir hiermit weiterhelfen konnte.
 

AlexDozer

Aktives Mitglied
Ja, habs bisher nur mit Mp3 probiert. Das ganze wird in einem Applet benutzt, von daher muss der Sound wenig Platz verbrauchen. Das schliesst Wave von vornherein aus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Lautstärke AudioClip Spiele- und Multimedia-Programmierung 8
I Bei MusikStream Lautstärke anpassen Spiele- und Multimedia-Programmierung 0
M SoundEngin problme mit lautstärke reglung Spiele- und Multimedia-Programmierung 0
E Lautstärke kontrollieren per Master gain Spiele- und Multimedia-Programmierung 2
P Prozess Lautstärke ändern Spiele- und Multimedia-Programmierung 4
J JMF Lautstärke an Stelle ermitteln und .wav cutten Spiele- und Multimedia-Programmierung 6
Developer_X Sound Lautstärke ohne spezifische API regulieren Spiele- und Multimedia-Programmierung 3
Dragonfire Java Sound API - Lautstärke ändert sich nicht Spiele- und Multimedia-Programmierung 2
O soundlösung für spiele (mit lautstärke) Spiele- und Multimedia-Programmierung 4
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
Fabel TicTacToe MiniMax Algorithmus geht nicht Spiele- und Multimedia-Programmierung 4
ThoraxLaneus Minecraft MCP-Client mit Optifine fertig machen in IntelliJ klappt nicht ganz Spiele- und Multimedia-Programmierung 6
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
Mika_MDF Minecraft Eclipse startet Minecraft nicht? Spiele- und Multimedia-Programmierung 23
H Musik Datei lädt nicht? Spiele- und Multimedia-Programmierung 8
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
JeremyStarTM Minecraft Minecraft Spigot Server akzeptiert JAR-Version nicht Spiele- und Multimedia-Programmierung 8
K Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei Spiele- und Multimedia-Programmierung 5
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
Z Minecraft Multiplayer geht nicht Spiele- und Multimedia-Programmierung 2
L Minecraft 1.7.10 Server startet nicht Spiele- und Multimedia-Programmierung 1
R Memory - Nicht alle Button lassen sich aktivieren? Spiele- und Multimedia-Programmierung 1
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
N der Player bewegt sich nicht Spiele- und Multimedia-Programmierung 14
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
N Warum tut der Gegner nicht das was er soll? Spiele- und Multimedia-Programmierung 13
N Warum ist das Fenster nicht schwarz? Spiele- und Multimedia-Programmierung 26
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
A Dateifehler - Öffnet nicht Spiele- und Multimedia-Programmierung 7
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
R Laufbewegung geht nicht.. Spiele- und Multimedia-Programmierung 1
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
F vlcj läuft nicht exportiert, aber in Eclipse Spiele- und Multimedia-Programmierung 2
A MouseListener ändert nicht das Lable Icon. Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
A Spielball bewegt sich nicht richtig, prallt falsch ab Spiele- und Multimedia-Programmierung 7
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
Blender3D VLCJ Video lässt sich nicht mehr abspielen nach mysql Installation Spiele- und Multimedia-Programmierung 1
J Programm kann Audio Datei nicht finden Spiele- und Multimedia-Programmierung 7
Viktim Snake - Schlange wächst nicht Spiele- und Multimedia-Programmierung 3
J Mensch Ärgere Dich nicht - Künstliche Intelligenz Spiele- und Multimedia-Programmierung 2
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
L Mensch ärgere dich nicht Spiele- und Multimedia-Programmierung 9
Polarfuchs Status von Midi Datei(wird gerade abgespielt oder nicht) Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
4 AudioSystem.write() wirft IllegalArgumentException, obwohl dies eig. nicht passieren dürfte Spiele- und Multimedia-Programmierung 2
V Methoden werden zwar ausgeführt führen aber nicht zum Ergebnis Spiele- und Multimedia-Programmierung 5
M [JOGL] eclipse export Runnable Jar - startet nicht Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
S Slick2D KeyInput reagiert nicht. Spiele- und Multimedia-Programmierung 3
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
W [libGDX] findet SplashScreen.png nicht Spiele- und Multimedia-Programmierung 4
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
Androbin Kollision zwischen Raster und Nicht-Raster Spiele- und Multimedia-Programmierung 2
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
B Mein Programm reagiert nicht auf den Tasstendruck Spiele- und Multimedia-Programmierung 1
F HashMap liefert nicht gewünschten Wert (gar nix) Spiele- und Multimedia-Programmierung 5
J mensch ärger dich nicht Spiele- und Multimedia-Programmierung 1
M Spiele Tutorial.. Findet Bilddateien nicht Spiele- und Multimedia-Programmierung 6
G Ausführbare Jar findet Bilddateien nicht... Spiele- und Multimedia-Programmierung 4
P Rotation von Sprite klappt nicht Spiele- und Multimedia-Programmierung 4
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
J KeyMapping funktioniert nicht Spiele- und Multimedia-Programmierung 5
R Minecraft Minecraft läuft nicht paralel mit minecraft server ? Spiele- und Multimedia-Programmierung 3
S eine nullpointerexception, wo sie nicht sein sollte Spiele- und Multimedia-Programmierung 12
J Java3D - Textur laden geht nicht Spiele- und Multimedia-Programmierung 9
S Mensch-Ärger-Dich-Nicht Methoden Spiele- und Multimedia-Programmierung 2
S VLCJ libjawt.so nicht gefunden Spiele- und Multimedia-Programmierung 3
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
A JME3 will Blender/j3o Objekte nicht einladen Spiele- und Multimedia-Programmierung 3
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
D Key Listener reagiert nicht ! Spiele- und Multimedia-Programmierung 4
CookieSoft 3D Würfel will sich nicht drehen! [LWJGL] Spiele- und Multimedia-Programmierung 2
T lwjgl vertex buffer rendert nicht Spiele- und Multimedia-Programmierung 9
R Kollisionsabfrage haut nicht hin Spiele- und Multimedia-Programmierung 15
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
A Patter Array Eintrag vergleichen geht nicht!!! Spiele- und Multimedia-Programmierung 3
M Jmonkey läuft nicht Spiele- und Multimedia-Programmierung 7
0 Finde den Fehler nicht Spiele- und Multimedia-Programmierung 2
M Mathetrainer - Reset Button funktioniert nicht! Spiele- und Multimedia-Programmierung 8
A OpenGL Textur und nicht Textur Spiele- und Multimedia-Programmierung 2
D JAR file startet manchmal nicht Spiele- und Multimedia-Programmierung 3
S MouseEvent.getPint() ist nicht Courser Spitze Spiele- und Multimedia-Programmierung 4
M Minecraft Bukkit Server VM Kann nicht Vergrößert werden Spiele- und Multimedia-Programmierung 20
K Kugeln werden nicht unsichtbar Spiele- und Multimedia-Programmierung 23

Ähnliche Java Themen

Neue Themen


Oben