处理 - 最小音频播放器 - 播放器不在句子内停止

时间:2016-01-10 21:31:39

标签: java processing minim

我一直在努力解决这个问题。 Stop()函数不能在if语句中起作用(歌曲只是在彼此之上播放而不是暂停和倒带)。如果我将Stop()函数调用置于if语句之外,它似乎可以正常工作(即根本没有播放任何预期行为的文件)想知道是否有人可以解决这些问题?

--------------代码示例-------------------------



      import processing.serial.*;
import ddf.minim.*;
String id;
Card Card1 = new Card();
Minim minim;//audio context;
AudioPlayer Backgroundplayer;

   public class Card{ // CARD OBJECT so can set up each card.
     String id;
     String FileToPlay;
     boolean Playing = false;
     AudioPlayer player;
     public Card(){}
     public  Card(String ID, String FILETOPLAY){
       id = ID;
       FileToPlay = FILETOPLAY;
     }
     void Load(){
       player = minim.loadFile(FileToPlay);
     }
     void Play(){
        if(Playing == false){
           player.play();
           Playing = true;
           println("PLaying");
          }else if(Playing == true){
            Playing = false;
            Stop();
        }

   }

        void Stop(){
         println("Stopping");
         player.pause();
          player.rewind();
       }

   }

void setup() {
  size(400, 300);
}

void draw() {

}

void mouseClicked() {
  Card1.id = id;
  Card1.FileToPlay = "drumploop.wav";
  Card1.Load();
  Card1.Play();
}




期望的结果是每张卡片播放不同的声音。但是,当扫描卡片时,如果卡片已经在播放片段,当再次扫描时,它应该停止播放指定的片段,而剩余的其他片段仍在播放。

1 个答案:

答案 0 :(得分:0)

您似乎认为if/else函数中的Play()语句会被触发两次:一次开始播放剪辑,一次播放另一个剪辑。

然而,事实并非如此:您似乎只为Play() 的每个实例一次调用Card函数。换句话说,即使您可能正在创建Card的多个实例并在每个实例上调用Play()函数,但每个实例仍然只有一次!让我们更明显一点:

Card card1 = new Card("one", "clip1.wav");
card1.Load(); //load the first clip
card1.Play(); //play the first clip

Card card2 = new Card("two", "clip2.wav");
card2.Load(); //load the second clip
card2.Play(); //play the second clip

请注意,当您拨打card2.Play()时,没有任何内容正在呼叫card1.Play()card1.Stop(),因此第一个剪辑会继续播放!

如果您希望它们在播放新剪辑之前停止播放,您必须专门调用任何播放剪辑的Stop()功能:

Card card1 = new Card("one", "clip1.wav");
card1.Load(); //load the first clip
card1.Play(); //play the first clip

Card card2 = new Card("two", "clip2.wav");
card1.Stop(); //stop the first clip
card2.Load(); //load the second clip
card2.Play(); //play the second clip