0

ボリュームコントロールが機能しない理由を誰か教えてもらえますか?

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

2 に答える 2

1

ボリュームが変わることはありません...あなたが決してそれを変えていないからです! スライダーの状態が変化したときに音量を変更したいので、stateChanged メソッドで音量を設定するだけです。これを行うには、次の命令を使用できます: volume.setValue(-20.63f) は、プログラムの他の場所で既に使用しています。パラメーターを必要な値 (スライダーの値など) に置き換えるだけです。

お役に立てれば。

于 2011-01-02T17:17:40.343 に答える
0

OK、「ボリューム」コントロールを正しく作成したようです。次の行に異なる値を入力すると、常に同じ音量に聞こえるということですか?

volume.setValue(-20.63f);  

範囲は-80から6だと思うので、10または80の値がどうなるか想像できません。そして、その下端のほとんどはほとんど聞こえません。これは、-80 から 6 のデシベルまたはボルト、または VU メーターに典型的なものに対応するはずです。たとえば、私のミキサーには、-20 から +5 の範囲の VU メーターがあります。

いずれにせよ、5、0、または -10 などのテスト値を試すと、何かのように聞こえる可能性が高くなります。

また、ほとんどの人は、動的プロセスとして再生中に音量を変更することを期待しているため、タイマーやスライダーなど、コード内でこれを行うための論理的な場所を探しています。しかし、ハードコードされたさまざまなサウンド レベルでサウンドを再生しようとしていただけで、スライダーは進行状況を表示するためのものだったと思います。問題の説明と同様に、コードを解読するのがかなり難しいことがわかりました。

于 2011-06-21T10:05:34.530 に答える