桌面PC的性能日益提高,Java虛擬機的優化技術也不斷獲得突破,這一切使得用Java處理實時信號成為可能。本文將通過設計和構造一個支持實時MP3、WAV和Ogg音頻格式解碼/回放的Java音樂播放器,闡述用JavaSound API編寫音頻處理程序的思路和一般過程。
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的能力。