In Java, the FloatControl
class is commonly used in conjunction with the javax.sound.sampled
package to control certain sound properties, such as gain (volume) and balance, on lines (e.g., clips, data lines, or mixers).
Here’s a quick explanation on how to apply gain and balance using FloatControl
:
- Gain (Volume): The gain is used to adjust the volume of the audio.
FloatControl.Type.MASTER_GAIN
is typically used for this purpose. It represents a dB (decibel) scale, where0.0
dB is the neutral level (no change), a negative dB value reduces the volume, and a positive dB value increases the volume if supported. -
Balance: The balance control is used to pan the audio between the left channel and the right channel. It ranges from
-1.0
(full left) to+1.0
(full right), with0.0
representing the center (evenly distributed between left and right).
Example Code: Setting Gain and Balance
Here’s how you can achieve this in Java:
package org.kodejava.sound;
import javax.sound.sampled.*;
import java.util.Objects;
public class AudioControlExample {
public static void main(String[] args) {
try {
// Load an audio file
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
Objects.requireNonNull(AudioControlExample.class.getResource("/sound.wav")));
// Create a Clip object
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
// Apply gain (volume)
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float desiredGain = -10.0f; // Reduce volume by 10 decibels
gainControl.setValue(desiredGain);
// Apply balance (pan)
FloatControl balanceControl = (FloatControl) clip.getControl(FloatControl.Type.BALANCE);
float desiredBalance = -0.5f; // Shift to the left by 50%
balanceControl.setValue(desiredBalance);
// Start playing the clip
clip.start();
// Keep the program running while the clip plays
Thread.sleep(clip.getMicrosecondLength() / 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Steps to Understand the Code
- Load and Open Audio Clip:
- Use an
AudioInputStream
to load an audio file. - Open the stream with a
Clip
object, which represents the audio data and allows playback.
- Use an
- Obtain Controls:
- You retrieve a control for gain or balance using
clip.getControl(FloatControl.Type.MASTER_GAIN)
andclip.getControl(FloatControl.Type.BALANCE)
.
- You retrieve a control for gain or balance using
- Set Control Values:
- Use
gainControl.setValue(value)
to adjust the gain. Make sure the value you set is within the valid range of theFloatControl
, which you can get usinggainControl.getMinimum()
andgainControl.getMaximum()
. - Adjust the balance similarly, where values are typically between
-1.0
and1.0
.
- Use
- Play the Audio:
- Start the clip with
clip.start()
and let it play. The program pauses for the duration of the clip to prevent exiting too early.
- Start the clip with
Notes:
- You can check the minimum and maximum values for the gain and balance using appropriate methods (
getMinimum()
andgetMaximum()
) to ensure your desired settings are within the valid range. - Respective clips, formats, and controls need system support, so certain operations might fail if the audio system can’t handle them.
- Replace the placeholder
"/sound.wav"
with the actual path to your audio file.
This example handles both gain (volume control) and balance (channel panning) while playing back an audio file.