谁能告诉我为什么我的音量控制不起作用?

时间:2010-12-31 08:50:47

标签: java audio javasound

有谁能告诉我为什么我的音量控制不起作用......?

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.*;
import javax.swing.event.*;
/*<Applet code="kkk" height=400 width=400></Applet>*/
public class kkk extends JComponent
{
    static File f1;
    int prog;
    static JFrame jf;
    int al;
    JLabel time;
    Timer tr;
    Button b;
    int pos=0;
    Clip c;
    AudioInputStream a;
    JSlider s;
    public static void main(String args[]) 
    {
        f1=new File("mm.wav");
        jf=new JFrame();
        jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        kkk kp=new kkk(f1);
        jf.getContentPane().add(kp, "Center");
        jf.setSize(400,400);
        jf.setVisible(true);
    }
    kkk(File f1)
    {
        try
        {
            a=AudioSystem.getAudioInputStream(f1);
            AudioFormat af=a.getFormat();
            DataLine.Info di=new DataLine.Info(Clip.class,af);
            c=(Clip)AudioSystem.getLine(di);
            c.open(a);
        }
        catch(Exception e)
        {
            System.out.println("Exception caught ");
        }
        finally 
        {
            try
            {
                a.close();
            }
            catch(Exception e)
            {
                System.out.println("Exception caught ");
            }
        }
        al=(int)(c.getMicrosecondLength()/1000); 
        s=new JSlider();
        Button b=new Button("play");
        time=new JLabel();
        Box row = Box.createHorizontalBox();
        row.add(s);
        row.add(b);
        row.add(time);
        b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent eee)
        {
            play();
        }});
        s.addChangeListener(new ChangeListener(){
        public void stateChanged(ChangeEvent ee)
        {
            //repaint();
            prog=s.getValue();
            time.setText(prog / 1000 + "." + (prog % 1000) / 100);
            //if(prog!=ap)
            //skip(prog);
        }});
        tr = new javax.swing.Timer(100, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                tick();
                }
                });
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
                this.add(row);
    }
    public void play()
    {
        try
        {
            FloatControl volume = (FloatControl) c.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(-20.63f);
        }
        catch(Exception e)
        {}
        c.start();
        tr.start();
    }
    //public void skip(
    public void tick()
    {
          pos = (int) (c.getMicrosecondPosition() / 1000);
              s.setValue(pos);
    }
}

2 个答案:

答案 0 :(得分:1)

音量永远不会改变只是因为......你永远不会改变它! 我想你想要在滑块状态改变时修改音量,所以你只需要在stateChanged方法中设置音量。为此,您可以使用以下指令:volume.setValue(-20.63f),您已在程序的其他位置使用过该指令。只需将参数替换为您想要的值(例如滑块的值)。

希望这有帮助。

答案 1 :(得分:0)

好的,好像你正确地控制了“音量”。你是说你在下面的行中放了不同的值,它总是听起来是相同的音量?

volume.setValue(-20.63f);  

我无法想象10或80的值会是什么,因为我认为范围是-80到6.而且大部分底端都是听不到的。它应该对应于-80到6或伏特的分贝或VU表更典型的分贝。我的调音台有一个VU表,例如-20到+5。

无论如何,尝试像5或0或-10这样的测试值可能会有更好的机会听起来像。

此外,大多数人都希望在播放期间更改音量,作为动态过程,因此我们在代码中寻找逻辑位置来执行此操作,例如Timer或Slider。但我想你只是试图让声音以不同的硬编码声音级别播放,而滑块只是用于显示进度。我发现代码很难破译,以及问题的描述。