2010年11月25日 星期四

let's play sound with powerbuilder

最近在用PB10做一些觸控裝置的UI(使用者介面,User Interface),雖然是觸控,不過使用起來的UE(user experience)跟 iPhone、iPad實在也差很多,無怪乎用過 iPhone之類的觸控裝至以後對於PC的各類觸控總覺得就是不喜歡。

題外話結束。

在設計這類的句有觸控介面的程式時除了UI要非常易懂、直覺以外,其他的輔助可能就需要那麼一點了。在設計這個CASE的UI時,尤其是數字鍵盤,如若加個語音提示或是導航,也許會減少許多輸入錯誤的機會。

目前PB10尚未支援 .NET ,所以依然使用API設計。

使用方式不困難,因為Windows就有內建一些標準函式可以用了
首先,定義函式呼叫

Function Long auxGetNumDevs() Library "Winmm.dll"
Function Long auxSetVolume (Long uDeviceID , Long dwVolume) Library "Winmm.dll" alias for "auxSetVolume"
Function Boolean sndPlaySound(ref String lpszSound , Long fuSound ) Library "Winmm.dll" alias for "sndPlaySoundW"


然後幾個基本常數

Constant Long SND_SYNC = 0
Constant Long SND_ASYNC = 1
Constant Long SND_NODEFAULT = 2
Constant Long SND_LOOP = 8
Constant Long SND_NOSTOP = 16


再來就是呼叫方式了,大部分常用的呼叫方式有兩種:同步 或 非同步(Synchronous / Asynchronous)

同步方式:採用同步方式的話,程序本身必須等待聲音檔撥完才能繼續執行。

ls_wav = "c:\piano.wav"
sndPlaySound(ls_wav , SND_SYNC)


非同步方式:當聲音檔案播放時,程序會繼續執行,其聲音停止的方式除了播放完畢以外,撥放另一個聲音檔會中斷上一次正在播放的聲音,或是程序結束時。

ls_wav = "c:\piano.wav"
sndPlaySound(ls_wav , SND_ASYNC)


另外若是要調整聲裝置音量大小,可以使用auxSetVolume,使用前需使用auxGetNumDevs來先取得裝置代號。

//調整音量到最大
li_devs = auxGetNumDevs() - 1 // base 0

li_right = 255 //右聲道音量(0-255)
li_left = 255 //左聲道音量(0-255)

for li_dev = 0 to li_devs
ll_vol = (li_right * 256) + li_left //HEX FFFF 高位元右聲道,低位元佐聲道各聲道255階
auxSetVolume(li_dev , ll_vol)
next


不過這個音量調整的Function都一直沒有成功過,原因還在查。