<!-- frame contents --> <!-- /frame contents --> JavaSound是一個小巧的低層API,支持數字音頻和MIDI數據的記錄/回放。在JDK 1.3.0之前,JavaSound是一個標准的Java擴展API,但從Java 2的1.3.0版開始,JavaSound就被包含到JDK之中。由於Java有著跨平台(操作系統、硬件平台)的特點,基於JavaSound的音頻處理程序(包括本文的程序)能夠在任何實現了Java 1.3+的系統上運行,無需加裝任何支持軟件。
一、JavaSound的體系結構
當前JDK的JavaSound API隨同Java媒體框架(JMF,Java Media Framework)一起發布,主頁在java.sun.com/prodUCts/java-media/jmf/,適合JDK 1.1以及更高的版本。除了JDK實現的JavaSound API之外,還有一個源代碼開放的JavaSound實現是Tritonus,主頁在http://www.tritonus.org/。
圖一描述了JavaSound API的體系結構,虛線表示Sun的JavaSound標准定義的API調用。上面一根虛線表示我們編寫音頻處理程序要調用的API,JavaSound API包含在javax.sound.sampled和javax.sound.midi包中。兩根虛線之間的部分就是JavaSound API的具體實現。
圖一:JavaSound體系結構
就象上面一根虛線表示的API具有統一標准一樣,在所有的JavaSound實現中,圖一下面一根虛線表示的SPI(服務提供者接口, Service Provider Interface)也是統一的。SPI的作用是以插件(Plug-In)的形式提供自定義的擴展模塊,我們只要提供與SPI兼容的插件擴展模塊,就可以在不改變API的情況下擴展音頻處理程序的能力。SPI包含在java.sound.sampled.spi和javax.sound.midi.spi包中。
例如,假設有一個只能播放WAV文件的程序,我們只要增加一個支持MP3文件解碼的插件模塊,就可以在不改動播放程序的任何一行代碼的前提下,為這個播放程序添加播放MP3的能力。
二、JavaSound混頻原理
圖二闡述了JavaSound的混頻器原理。在處理輸入音頻的應用中,對於來自各種音頻輸入端口的信號,例如麥克風、CD播放器、磁帶播放器,等等,我們可以在它們到達TargetDataLine之前,利用混頻器控制輸入混頻,最後在程序中通過TargetDataLine獲得數字化的音頻輸入流。
圖二:JavaSound混頻器
類似地,在處理輸出音頻的應用中,混頻器用來對一系列來自SourceDataLine的數據進行混頻處理,經處理後的信號可輸出到各種輸出端口,例如揚聲器、耳機等。SourceDataLine是一個可寫入音頻信號數字流的設備,例如,我們可以從一個WAV文件讀取內容寫入到SourceDataLine,然後再通過揚聲器輸出。
輸入到混頻器的信號可以來源於剪輯。剪輯(Clip)是一個包含一段完整音頻數據流的設備,或者說,剪輯就是一個緩沖在內存中的完整音頻數據流。在一些要求反復播放音樂片段的場合,例如游戲的背景音樂,剪輯是很有用的。
圖三描述了JavaSound API中一些常用的類、接口及其關系,所有圖三顯示的類、接口都通過Line這個基本接口統一起來。Line接口用來關閉/打開設備、注冊事件監聽器,以及提供一些用來調整聲音效果的對象,例如調整音量大小的對象。AudioSystem在JavaSound體系中起著一個工廠(Factory)類的作用,提供了一系列的靜態方法,我們通過這些靜態方法來獲取JavaSound系統默認配置的資源(所謂靜態方法,就是可以在不創建AudioSystem實例的情況下直接調用的方法)。