應用程式實作 應用程式實作 應用程式實作 應用程式實作
5.2 自訂協定與運作架構 自訂協定與運作架構 自訂協定與運作架構 自訂協定與運作架構
5.2.3 聲音處理 聲音處理 聲音處理 聲音處理
二二
二二、、、、 audio 程式設計程式設計程式設計程式設計
Linux 的音效系統有許多不同的團體在維護,其中的 open sound
system(oss),Linux 2.4 本身就有支援,因此這裡使用 oss 來開發聲音處理的 程式。oss 的好處是相當簡單,使用我們熟悉的 Linux 的 System Call 就可以 達成。
使用音效裝置的基本流程:
1. 以 open( )開啟 device file,將回傳 file descriptor(以下簡稱 fd)。接下 來將透過這個 fd 來使用裝置。
2. 以 read( )/write( )來讀寫裝置,或以 ioctl( )設定裝置行為。
3. 以 close( )關閉 device file。
Voice Messenger 所使用的 device file 和其用途如表 6 所示。不過 device file 的名稱(file name)只對應用程式有意義,kernel 則是以 major number 來辨識,
這個部份已在「4.3.2 模組與驅動程式」說明過。
表 6 使用的 device file 與用途 major
number
minor number
device file description
14 0 /dev/mixer 設定錄音來源、設定音量
14 3 /dev/dsp 設定全雙工(full duplex)、設定音效參數(取樣頻 率、取樣大小、頻道數)、錄音、放音
錄音與放音,其實就是直接對 device file 寫入資料或讀取資料,也就是使用 write( )、read( )來達成。
設定裝置行為,都是使用 ioctl( )來完成,ioctl( )可對裝置做 I/O 操作,所能 控制的功能和裝置本身及驅動程式息息相關。ioctl( )所須傳入的第一個參數 fd 用來決定目標裝置,第二個參數 command 會決定控制功能,第三個參數(或 以上)則是額外所需的資訊或將回傳的資訊。oss 的程式設計可以參考「OSS Programmer's guide v1.1」http://www.opensound.com/pguide/oss.pdf
三三
三三、、、、 程式流程程式流程程式流程程式流程
以下為 client 主程式開始語音交談的流程:
圖 21 語音交談流程圖
音效初始化的工作包括:
1. 使用 mixer 裝置設定錄音來源與音量。
2. 使用 dsp 裝置設定全雙工與設定音效參數(取樣頻率、取樣大小、
頻道數)。
「錄音、傳送資料」和「放音、接收資料」各由一個 thread 負責,並且重覆 運作。直到主程式下達終止動作或對方斷線。
Thread2
音效初始化
接收資料
放音 錄音
傳送資料
Thread1
Microwindows 支援 1、2、4 和 8 bpp(每像素的位元數)的調色顯示,以及 8、
16、24 和 32 bpp 的真實色彩顯示。Nano-X Server 佔用的記憶體大小約只有 100 K 到 150 K 位元組,除此之外 Nano-X 與 Xlib 實現不同,仍在每個 Client 端上同 步運行。意指一旦發送了 Client 端要求封包,Server 在另一個 Client 端提供服務 之前一直等待,直到整個封包都送達為止。這使 Server 程式碼非常簡單,而運 行的速度仍非常快,故綜合以上優點選用 Nano-X API 來實作。libnano-X 為 Microwindows 的 Nano-X API 程式庫,共分為十大類,如表 7。
表 7 Nano-X API 程式庫種類
General 一般類 Window 視窗類 Graphic 繪圖類 event 事件處理類 Fonts 字型處理類
pointer 滑鼠指標類 colours 顏色處理類 Regions 視窗區域類 selections 內文選取類 misc 其他類
而專題實作的介面中主要用了 general〈一般類〉、window〈視窗類〉、graphic
〈繪圖類〉的函式,其中比較特殊的是 GrNewGC( )函式,當我們對一個視窗做 繪圖上的變化時需要引用 GC,設定 GC 函式有 GrSetGCForeground( )、
GrSetGCBackground( )、GrSetGCUseBackground( )、GrSetGCMode( )、
GrSetGCFont( )、GrSetGCClipOrigin( )、GrSetGCGraphicsExposure( )。
實作的按鍵就是使用兩種不同的 GC 去做變化,用 GrSetGCForeground( )、
GrSetGCBackground( )函式定義前景與背景顏色,再利用畫邊框方式使視窗產生 視覺上的立體感,按鍵的外觀就成形了。當滑鼠按下時,按鍵呈現如圖 22;當 滑鼠彈起時,按鍵呈現如圖 23。