在Java中播放声音和快速淡出时的质量问题

时间:2016-04-22 11:25:25

标签: java performance audio media-player

抱歉我的英文不好

我编写了一个播放乐器音频文件样本的Java桌面应用程序。

每次应用程序收到笔记时,它必须停止当前播放的笔记并播放新笔记。如果用户停止播放,则应用必须对活动音符进行淡出。

顺便说一句,延迟越小越好。

我创建了一个runnable,它拥有一个播放和停止方法,允许我播放或停止音符(淡出)

我的代码有效,但音质不好(多次点击和裁剪等)..

- 如何改进我的代码?我犯了错误吗?

- 除了JavaFx媒体播放器以外,还有其他Java技术最适合我的需求吗?

public class SamplePlayer implements Runnable{

private boolean fadeOut=false; // true when a fade out is needed
private int soundToFadeOut=0; //the sound number to fade out
private int sound=0; // the sound number to play (nothing if zero)
private int lastSound=0; //the last sound number played that wee need to stop befor playing a new one



MediaPlayer[] sample = new MediaPlayer[42]; //array to store all pre-loaded sounds

public SamplePlayer()
{


    for(int i=0;i<42;i++) // load all sounds
    {
        Media pick = new Media(new File("./src/files/samples/1_"+(i+55)+".wav" ).toURI().toString());
        sample[i] = new MediaPlayer(pick);  


    }

}
/**
 * Here i try to play a sound each time the sound variable has changed
 * and fade out the sound specified in soundToFadeOut variable if fadeOut variable come to true;
 */
@Override
public void run() {
    while(true) // bad, but it's just for testing
    {
        try {
        if(sound!=0) // if a sound need to be played
        {
            if(lastSound!=0) // if i's not the first sound to played i stop the previous one.
            {  
                sample[lastSound].stop();                   
            }

            sample[sound].setVolume(1); //returns the volume to 1 in case we made a fade out
            lastSound=sound; 
            sound=0;//sound = 0 to monitor new other sound       
        }
        if(fadeOut==true) // if wee need to make a fade out
        {
            fadeOut=false;
            fadeOut(sample[soundToFadeOut],50);

        }

            Thread.sleep(1); // if not the thread keep busy and play, stop method not working properly
        } catch (InterruptedException ex) {
            Logger.getLogger(SamplePlayer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

    private void fadeOut(MediaPlayer player,double itteration) // fade out method : run a new thread to itterate on volume
    {Runnable task = () -> { 

         try{
        for(int i=0;i<itteration;i++)
        {
            double value=(itteration-i)/itteration; // set value to 1.0 to near 0.0 each itteration
            if(value<0.1)
            {
                value=0;
            }
            player.setVolume(value);
            Thread.sleep(5);
        }


    }catch(Exception e){e.printStackTrace();}

            };


    new Thread(task).start();



    }

    /*
     *
     * play and stop method which are called when a sound need to be  played or stoped (fade out)
     *
     */

    public void play(int note)
    {

        sound=note-55; // -55 just to match with our array range


    }
    public void stop(int note)
    {
        soundToFadeOut=note-55;
        fadeOut=true;
    }


}   

0 个答案:

没有答案