2011-11-04 54 views
0

我想創建一個簡單的PlayClipManager類來管理音頻剪輯的播放。這將有以下兩種方法:按順序播放剪輯,並有可能中斷其他剪輯(使用javax.sound)

public void addAndPlay(Clip clip) 
{ 
    ... 
} 

public void interruptAndPlay(Clip clip) 
{ 
    ... 
} 

第一種方法應該在剪輯添加到隊列中,只要在隊列中的其他剪輯已經完成播放。第二種方法接受一個剪輯,該剪輯會中斷當前播放,刷新隊列並將其自身添加到該隊列(它立即播放,因爲它是隊列中唯一的片段)。

如果有人可以訪問管理音頻播放的Java線程,這很容易,但除非我錯了,否則我不認爲有一個(有一個AudioSystem類,但它對此目的沒有幫助) 。我看到有帖子在這裏顯示瞭如何使用LineListener來檢查剪輯何時完成播放,但我不確定如何在我的示例中具體使用該剪輯。另外,用這個方法來中斷剪輯,我猜可能還有一些併發問題。

任何幫助我如何解決這個非常讚賞。

謝謝。

回答

0

如果我沒有弄錯,剪輯會將播放行與音頻數據捆綁在一起。

你打算排隊實際的剪輯?他們多大?這會佔用大量的記憶。如果您要存儲聲音文件的地址,並在播放時製作/加載新的剪輯,則最好使用SourceDataLine,因爲它會更快地啓動。剪輯必須在開始播放之前將整個文件加載到內存中。

以上是用於添加線監聽器的tutorial。我認爲這只是myClip.addLineListener(YourLineListener)。您可以對LineListener進行編碼,以提醒管理隊列的任何事件以啓動下一個剪輯,並對所有剪輯使用相同的LineListener。

或者也許像這樣的東西會有幫助,當您準備好播放隊列時將其稱爲新線程,並讓LineListener成爲播放剪輯的runnable的一部分。

class PlayClipRunnable implements Runnable, LineListener { 
    private Clip currentClip; 
    private QueueManager queueManager; 

    public PlayPadRunnable (Clip currentClip, 
      QueueManager myQueueManager) { 
     this.currentClip = currentClip; 
     this.myQueueManager = myQueueManager; 
    } 

    public void run() 
    { 
     try 
     { 
      currentClip.addLineListener(this); 
      currentClip.start(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void update(LineEvent event) { 
     if (event.getType() == LineEvent.Type.STOP) { 

      queueManager.clipIsStopped(); 
     } 
    } 
} 

我不知道什麼時候剪輯應該打開。我也不確定如何放置中斷剪輯的鉤子。也許,如果QueueManager執行currentClip.close(),那將起作用嗎?在這種情況下使currentClip易變可能會有所幫助。但我正在走出自己的深度。

我希望這些想法值得探索,並引導您找到解決方案。

相關問題