OpenAL

接觸AL也有一兩個月了吧~
一直想做個筆記卻不知從何做起
其實也還沒摸完,所以就慢慢加入吧!凡事總要先起頭!

首先,廢話還是要先說一次
先去官方網站下載 OpenAL SDK,在程式裡把該 Include 的 In 一下,該 Link 的 Lin 一下!
在此,比較建議先別使用ALUT(OpenAL Utility Toolkit),應該會比較容易了解運作流程
其實,我也還沒用過 ALUT

-OpenAL有三寶 SourceBufferListener

  1. Source(聲源)
    發出聲響的聲源,就當成收音機(Radio)吧!
  2. Buffer(緩衝區)
    聲音資料,我把它視為錄音帶(tape)。
  3. Listener(聽者)
    就聽者囉!

-創造&&毀滅

創造公式:
    alGen*( … );
毀滅公式:
    alDelete*( … );

*: Buffers Sources

 ALuint uiBuffer;
 // 創造一個緩衝區
 alGenBuffers( 1, &uiBuffer );

 // 刪除緩衝區
 alDeleteBuffers( 1, &uiBuffer );

 ALuint uiSourcesArr[10];
 // 創造一堆聲源
 alGenSources( 10, uiSourcesArr );

 // 刪除一堆聲源
 alDeleteSources( 10, uiSourcesArr );

-放進錄音帶

假設我們創造了一個緩衝區 uiBuffer ,一個源頭 uiSource

 // 連結 buffer 與 source
 alSourcei( uiSource, AL_BUFFER, uiBuffer );

這裡對某個 source 做的設定吧?
依照Open系列的風格,這種函式都有一定的規格

函數名稱 + 參數規格( … );

舉例來說,上面的 alSourcei(…)
說明了這個函數名稱叫做 alSource , 所需要的參數為 int
第一個參數是要設定的對象
第二個參數是要設定的屬性
接著就是參數

以此類推, alSource3f 就是需要三個 float
alBuffer3i 就是需要三個 int

-控制收音機

 // 播放
 alSourcePlay( uiSource );
 // 停止
 alSourceStop(
uiSource );
 // 暫停
 alSourcePause(
uiSource );


當然,AL也可以讓你一次控制多個聲源,線再假設有一個聲源陣列 uiSourceArr

 // 停止多個聲源
 alSourceStopv( uiSourceArr );

-偷看收音機

嗯~我知道你也想知道收音機目前的狀況

 // 取得目前狀態
 // 在聲源播放完畢、停止、暫停等等,都會改變狀態
 alGetSourcei( uiSource, AL_SOURCE_STATE, &iState );

-待續
目前先到這邊!
急著想知道其他的話,參考 OpenAL 官方提供的連結吧^^!
幫你連一下



2007 – 11 – 07

這一陣子為了把音效3D化,搞得滿城風雨(好像太誇張了點=口=")
走了一大圈…
今天才發現 + 想起來,3D模式只對單聲道有反應 |||Orz
(已經有點絕望的想轉去DSound了說~哈哈!)
OK!這樣就萬事具備啦!
測試後,阿咧…
把聽者定位後,2D音效就消失了 囧
當然,目前的狀況來說,這僅限於單聲道的音效
雙聲道放下去還是很愉快的響著~
這邊來說一下單聲道的2D處理方式:

首先,依照上文,已經有 uiSource 、 uiBuffer ,已經將發聲源和聽者設定好相關屬性後
只要加上:

 alSourcei( uiSource, AL_SOURCE_RELATIVE, AL_TRUE );

完成!夠簡單吧XD
找了很多篇文章都沒對這個屬性作解說(AL文件裡又有看沒有懂 囧)
真感謝那位提問的外國人>_<~

目前包裝的差不多了~再把Ogg解碼包進去就大致上完成了!明峻兄~真讓你久等了QQ

–End

One thought on “OpenAL

  1. 你好: 我最近也在使用openal上有問題,想請問下al的distancemodel該怎使用呢 我之前照書上的範列是這樣寫的: alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); alSourcef(source[0],AL_GAIN, 1.0f); // 設定衰減公式的參數 alSourcef(source[0], AL_MAX_DISTANCE, 100.0); // 設定最大的距離 alSourcef(source[0], AL_ROLLOFF_FACTOR, 1.0); // 衰減因素 alSourcef(source[0], AL_REFERENCE_DISTANCE, 50.0); // 距離單位 alSourcef(source[0], AL_MAX_GAIN, 1.0); // 最大增益 alSourcef(source[0], AL_MIN_GAIN, 0.0); // 最小增益 但聲音的效果卻我所想要的變化,是我哪邊的設定有問題呢 而且al的距離設定上有預設的model嗎? 因為我把上面那段code駐解掉後,也是有效果,而且是跟我在駐解掉前的效果是一樣的 找了好久,還是不得其解,請問前輩能幫我解答嗎?

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s