2010-12-31 4 views
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); 
    } 
} 
+1

問題は何ですか?例外はありますか? – Favonius

+1

どうしたらよいはずがありませんか?それはどうしたらいいのでしょうか? –

+0

いいえ、例外はありません....しかし、私は音量を増減できません... !! – user528050

答えて

1

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

これが役に立ちます。

+0

最初に私は-20.63fと10.00,80.84 .....のボリュームをテストしますが、私は常にボリュームが同じであることがわかりました。 – user528050

+0

行s.setValue(pos)を削除する必要があります。または全体の "ダニ"方法でさえも。私はそれが何をすべきか分からないが、私は私がうまく働かないと賭けるだろう。 – Hal

+0

これは、曲のラインコントロールの位置を設定するためのものです。あなたがもっと良いアイデアを持っていれば...私はそれが何であるかを知っておく必要があります...しかし、まだボリュームを制御することができません...助けてくださいこの問題を解決するには...私は本当にこれが必要です。 – user528050

0

OK、「音量」コントロールを正しく作ったようです。あなたは次の行に異なる値を入れて、それは常に同じ音量で聞こえると言っていますか?

volume.setValue(-20.63f); 

私は範囲が6に-80されており、その下端のほとんどはかなり聞こえないと思うように私は、10または80の値がどうなるのかを想像することはできません。これは、-80〜6ボルトまたはVUメーターに典型的な何かのデシベルに対応すると考えられています。私のミキサーは、例えば-20から+5の範囲のVUメーターを持っています。

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

また、ほとんどの人は、再生中に動的プロセスとしてボリュームを変更すると予想しているため、タイマーやスライダなど、これを行うためのコード内の論理的な場所を探しています。しかし、ハードコーディングされたさまざまなサウンドレベルでサウンドを再生しようとしているだけで、スライダは進捗状況を表示するためのものだったと思います。私はコードを解読するのがむしろ難しく、問題の説明も見つけました。

関連する問題