Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6405128

REGRESSION: Maximum gain value causes sound distortion

XMLWordPrintable

    • b80
    • generic
    • generic

        Setting gain control to maximum value (returned by gain control's getMaximum method) causes distortion of played sound.
        Regression from 1.4.2
        In the test below distartion starts (0.5 sec. from begining)
        veronica.wav is attached.

        import java.io.*;
        import javax.sound.sampled.*;

        public class PlayClip {
            public static void main(String[] args) throws Exception {
                String fileName = args.length > 0 ? args[0] : "veronika.wav";
                System.out.println("Opening file <" + fileName + ">...");
                
                InputStream streamFile = new FileInputStream(fileName);
                AudioInputStream streamAudio = AudioSystem.getAudioInputStream(streamFile);
                
                System.out.println("Creating clip...");
                //Clip clip = AudioSystem.getClip();
                Clip clip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class));
                clip.open(streamAudio);
                System.out.println("Clip class: " + clip.getClass().toString());
                System.out.println("Clip format: " + clip.getFormat());
                System.out.println("Clip length: " + clip.getMicrosecondLength());

                System.out.println("Playing...");
                clip.start();

                Thread.sleep(500);
                
                if (clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
                    FloatControl gainCtrl = (FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
                    System.out.println("gain current value: " + gainCtrl.getValue());
                    
                    float maxValue = gainCtrl.getMaximum();
                    System.out.println("Updating gain to maximum value" + "("
                            + maxValue + " " + gainCtrl.getUnits()
                            + ", " + dBToLinear(maxValue) + " linear)...");
                    gainCtrl.setValue(maxValue);
                } else {
                    System.out.println("!!! gain doesn't supported!");
                }
                
                while (clip.isRunning())
                    Thread.sleep(100);
                
                clip.close();
                
                System.out.println("Done.");
            }
        }

              amenkov Alex Menkov
              amenkov Alex Menkov
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: