青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoxiaoling

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  17 Posts :: 2 Stories :: 9 Comments :: 0 Trackbacks

導(dǎo)言

FMOD Ex API被設(shè)計得非常直觀和靈活,本教程將簡要介紹引擎的使用方法,并對使用中涉及的相關(guān)問題做出解釋。

配置——What to include and what to link.

查閱文檔中的"Platform specific issues",找出指定平臺上要使用FMOD Ex函數(shù)所需鏈接的文件。

在C/C++中,如果只須使用C接口,則包含"fmod.h",要使用C++接口則須包含"fmod.hpp"。
注意:常量、回調(diào)函數(shù)、宏定義和枚舉類型都在fmod.h中,所以fmod.hpp也包含fmod.h,如果你使用C++的話就必須交叉使用。

對于Delphi、C#和Visual Basic,都有其對應(yīng)的頭文件可供在程序中使用。

初始化

要初始化fmod,最簡單的方法就是調(diào)用System::init函數(shù),FMOD會使用默認(rèn)參數(shù)來配置聲卡和其他設(shè)置。

在查看文檔中的System::init函數(shù)時,要記住maxchannels參數(shù)是你在游戲中可以同時播放聲音的最大數(shù)量,該數(shù)與聲卡或軟件混合器無關(guān)。

這些聲音是 虛擬聲音(virtual voices)。這意味著你可以同時播放任意多的聲音,而不用擔(dān)心硬件或軟件資源問題。
你可以在游戲中安全地播放每個聲音,而無須擔(dān)心System::playSound超出播放上限或搶占其它聲音。因此只要你喜歡,你可以將maxchannels設(shè)置為任意大的數(shù),如1,100,200,1000。
注意:同時播放1000個聲音并不會音像性能,因為它們中的大部分是聽不見的 (聽不見的聲音被“虛擬化”了)。而FMOD Ex虛擬聲音管理器決定哪些聲音能聽見,哪些聽不見只需要很小的系統(tǒng)開銷。
下面我們看一個初始化FMOD Ex的例子。

 

FMOD_RESULT result;

FMOD::System *system;

 

result =system);               // 創(chuàng)建主system對象

if (result != FMOD_OK)

{

    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));

    exit(-1);

}

 

result = system->init(100, FMOD_INIT_NORMAL, 0);     // 初始化FMOD

if (result != FMOD_OK)

{

    printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));

    exit(-1);

}

 

這是最基本的初始化FOMD引擎的方法,使用了100個虛擬聲音。
注意:mod、s3m、xm、it和midi格式的文件播放時只使用一個聲音,不要以為在這里增大數(shù)量就可以使用多個聲音來播放這些格式的文件。這些格式的都使用它們自己的internal pool voices。

配置選項

如果你不想使用默認(rèn)設(shè)置的話,可以自行設(shè)定輸出硬件、FOMD資源使用和其他配置選項。
這些操作都必須在System::init函數(shù)調(diào)用前進(jìn)行。
常用配置如下:

·  System::setOutput – 選擇輸出方式。例如你可以在Windows上選擇DirectSound、WinMM、ASIO、no-sound、wave-writer或其他輸出選項,每個平臺都有不同的選擇。如果你只是要使用默認(rèn)配置,就不需要調(diào)用它。

·  System::setDriver – 選擇用于播放的設(shè)備驅(qū)動。當(dāng)你擁有不止一塊聲卡并且不想使用默認(rèn)聲卡的時候,這個函數(shù)就很有用了。你需要用System::getNumDrivers函數(shù)來獲取設(shè)備數(shù),用System::getDriverName函數(shù)來獲取驅(qū)動名稱以供用戶選擇。

·  System::setHardwareChannels – 使用這個函數(shù)來限制硬件聲音的數(shù)量,或設(shè)定在reverting to 100% software mixed voice support之前的最小硬件聲音數(shù)量。“minimum”選項用于保證同時至少能聽到的聲音數(shù)量。

·  System::setSoftwareChannels – 使用這個函數(shù)來設(shè)定FMOD通道使用的軟件混合聲音的數(shù)量。 This will be purely for polyphony reasons or CPU / memory resource usage reasons. 使用mod/s3m/xm/it/midi這些格式時,不要指望使用它來增加聲音的數(shù)量,它們不使用通道的pool而使用自己的。

·  System::setSoftwareFormat – 用于改變FMOD軟件混合器的設(shè)置。包括采樣率、輸出模式(如integer vs float)、輸出通道數(shù)(如multi-output channel ASIO devices)、內(nèi)存使用和混合質(zhì)量。

·  System::setDSPBufferSize – 如果在很慢的機(jī)器上或非良好的聲卡驅(qū)動上出現(xiàn)聲音抖動,就需要使用這個函數(shù)。它可以改變軟件混合器的響應(yīng)時間,但誤用的話也可能影響性能。一些人可能想讓用戶在“低響應(yīng)時間”和“高兼容性”兩種模式間做出選擇,可以通過調(diào)整緩沖大小來達(dá)到犧牲響應(yīng)時間換取穩(wěn)定性的目的。

·  System::setSpeakerMode – 設(shè)置揚(yáng)聲器輸出模式。此函數(shù)只對FMOD軟件混合引擎起作用,默認(rèn)值為stereo (5.1 on xbox and xbox360 and 7.1 on ps3),可以按需要任意更改。注意:聲道數(shù)越多,占用的內(nèi)存也越多。

下面的例子使用了一些配置項來初始化FMOD。 要記住這些選項都是可選的,如果不需要就不用設(shè)置,在你沒有弄懂其真正含義前,千萬不要僅僅將下面的代碼復(fù)制再粘貼! 例如,如果用戶沒有5.1聲道的系統(tǒng),你就不能僅僅將揚(yáng)聲器模式設(shè)定為5.1。

 

FMOD_RESULT result;

FMOD::System *system;

 

result =system);               //創(chuàng)建主system對象

ERRCHECK(result);

 

// 設(shè)置揚(yáng)聲器模式為5.1聲道

result = system->setSpeakerMode(FMOD_SPEAKERMODE_5POINT1);   ERRCHECK(result);

 

// 允許同時播放100個軟件混合聲音

result = system->setSoftwareChannels(100);           ERRCHECK(result);

 

// 要求聲卡至少要有32個2D和3D硬件聲音,如果聲音數(shù)超過64,就限制為64

result = system->setHardwareChannels(32, 64, 32, 64); ERRCHECK(result);

 

// 初始化FOMD,使用100個虛擬聲音

result = system->init(200, FMOD_INIT_NORMAL, 0);            

ERRCHECK(result);

加載與播放

要播放聲音,你必須先加載!
使用System::createSoundSystem::createStream就可以完成這項工作。
默認(rèn)情況下,系統(tǒng)會嘗試將整個聲音解壓到內(nèi)存中(如果使用 System::createSound函數(shù)),而和sample不同的是stream(用 System::createStream創(chuàng)建)是在運(yùn)行時解碼,僅使用很少的內(nèi)存作為緩沖,這就是為什么大文件最好用stream的原因。
更多請參見術(shù)語/基本原理

下面是一個加載MP3文件的例子,默認(rèn)條件下System::createSound函數(shù)將整個MP3解壓成16bit的PCM格式,這就意味著將占用比文件本身大許多倍的內(nèi)存。

 

FMOD::Sound *sound;
// FMOD_DEFAULT等效于FMOD_LOOP_OFF | FMOD_2D | FMOD_HARDWARE.

result = system->createSound("../media/wave.mp3", FMOD_DEFAULT, 0, &sound);       

ERRCHECK(result);



下面是一個用stream打開MP3文件的例子。System::createStream函數(shù)將打開文件并預(yù)緩沖小部分?jǐn)?shù)據(jù),然后就可以在System::playSound調(diào)用時直接播放了。

 

FMOD::Sound *sound;
// FMOD_DEFAULT等效于FMOD_LOOP_OFF | FMOD_2D | FMOD_HARDWARE.

result = system->createStream("../media/wave.mp3", FMOD_DEFAULT, 0, &sound);              

ERRCHECK(result);



指定用軟件混合就必須使用FMOD_SOFTWARE標(biāo)記。如果你想要使用如DSP effects、spectrum analysis、getwavedata、point to point looping和其它更多的高級技術(shù),就必須使用軟件混合。

 

FMOD::Sound *sound;
// 使用軟件混合

result = system->createSound("../media/wave.mp3", FMOD_SOFTWARE, 0, &sound);             

ERRCHECK(result);



下一個例子是將MP3以sample的形式載入內(nèi)存而不解壓,使用 FMOD_CREATECOMPRESSEDSAMPLE標(biāo)記。此時如果沒有指定FMOD_HARDWAREFMOD_SOFTWARE,將默認(rèn)為軟件混合。硬件聲音回放不支持這個標(biāo)記,除非格式為ADPCM on Xbox、VAG on PS2/PSP或GCADPCM on Gamecube/Wii。 Platforms like PS3 and Xbox 360 are all done one the cpu (usually a different core to the main cpu so it does not affect performance).

 

FMOD::Sound *sound;
// FMOD_CREATECOMPRESSEDSAMPLE標(biāo)記讓sample先嘗試直接播放(不解壓到內(nèi)存),但僅限于IMA ADPCM、MP2、MP3和XMA格式

result = system->createSound("../media/wave.mp3", FMOD_CREATECOMPRESSEDSAMPLE, 0, &sound);

ERRCHECK(result);

警告! 必須謹(jǐn)慎使用這種模式,它看上去和PCM sample很相似,但它會在運(yùn)行時導(dǎo)致巨大CPU開銷。FMOD按照聲音的壓縮格式,在播放時對其進(jìn)行解碼。


現(xiàn)在,要播放sound或stream只需簡單地調(diào)用System::playSound就行了。

 

FMOD::Channel *channel;

result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);

ERRCHECK(result);

 

此時,聲音已經(jīng)在后臺播放了!而你的程序?qū)⒗^續(xù)執(zhí)行。

關(guān)于playSound的注意事項:

·  如果不需要的話,可以不必獲取channel句柄,可以將其設(shè)為0或NULL。如果你不需要更改這個sound實(shí)例,或者這個聲音很短(不循環(huán)),就可以省去它。例如:

 

 

  result = system->playSound(FMOD_CHANNEL_FREE, sound, false, 0);

  ERRCHECK(result);

 

·  可以在開始播放時暫停,這樣就可以更改聲音的屬性而不會被用戶聽見,這就是“paused”參數(shù)的用處所在。例如,如果你將paused設(shè)為true,再設(shè)置音量為0.5,然后解除暫停,此時聲音就會一一般的音量播放。但如果你是將paused設(shè)為false,而其它操作相同的話,你會聽見聲音開始時瞬間是全音量播放的,用戶可不希望聽到。

 

 

  result = system->playSound(FMOD_CHANNEL_FREE, sound, true, &channel);

  ERRCHECK(result);

  // 暫停時設(shè)定音量

  result = channel->setVolume(0.5f);           

  ERRCHECK(result);

  // 聲音從這里才開始播放

  result = channel->setPaused(false);          

  ERRCHECK(result);

 

·           一個“channel”就是一個聲音的實(shí)例。一個聲音你可以同時播放多次,每次播放都會得到一個新的channel句柄,但stream除外,它只能同時播放一次,如果你嘗試多次播放,只會重復(fù)播放當(dāng)前stream并返回同上次一樣的channel句柄。這是因為stream只有一個緩沖和一個文件句柄。要同時播放兩個stream就必須打開兩次再播放兩次。

·           始終使用FMOD_CHANNEL_FREE。FMOD會使用通道管理器自動為你選擇一個未使用的channel。如果希望使用一個現(xiàn)有的channel來播放,就使用FMOD_CHANNEL_REUSE標(biāo)記,這樣可以避免每次調(diào)用System::playSound函數(shù)都產(chǎn)生一個新的實(shí)例。

·           不需要“free”或“release”一個channel句柄。所有的channel都位于你使用System::init所創(chuàng)建的一個pool中。當(dāng)聲音停止后,channel可以被復(fù)用;如果所有的channel都處于播放狀態(tài),那么其中一個優(yōu)先級最低的會被搶占。其實(shí)只需增大System::init中的通道數(shù)就可以避免發(fā)生這樣的情況。

·           一個channel會在播放結(jié)束時即刻失效。這意味著你不能再對其進(jìn)行更改,即使做了也沒有實(shí)際意義,因為它不可能再播放了。絕大多數(shù)情況下,引用一個已失效的channel會導(dǎo)致一個FMOD_ERR_INVALID_HANDLE錯誤。

Update. (This is important!)

在每一幀中調(diào)用System::update函數(shù)是很重要的,但不需要多次調(diào)用,那樣只會影響效率。
該函數(shù)用于更新FMOD Ex的以下內(nèi)容:

·           Platform specific routines 例如向PS2的IOP發(fā)送一個frame command packet。在這個平臺上,不調(diào)用update的話就聽不到聲音。

·           Virtual voice emulation 不調(diào)用update,虛擬聲音就不會播放。

·           3D voice calculation 如果不調(diào)用update,就算channel或listener已經(jīng)正確設(shè)置,也無法聽到聲音移動的3D音效。

·           Geometry engine FMOD的polygon/geometry引擎需要通過update來啟用。否則用戶定義的occlusion/obstruction特性將無法呈現(xiàn)。

·           Non realtime output FMOD_OUTPUTTYPE_NOSOUND_NRTFMOD_OUTPUTTYPE_WAVWRITER_NRT標(biāo)記需要此函數(shù)才能更新到輸出(如用FMOD_OUTPUTTYPE_WAVWRITER_NRT寫出到文件)。

·           Streaming engine 如果指定了FMOD_INIT_STREAM_FROM_UPDATE標(biāo)記,如果用戶希望在主線程中自己驅(qū)動流引擎,就必須有規(guī)律地調(diào)用update,否則會導(dǎo)致抖動和緩沖溢出。

關(guān)閉

調(diào)用System::release函數(shù)來關(guān)閉輸出設(shè)備并釋放對象關(guān)聯(lián)的內(nèi)存。
你不必人工關(guān)閉channel和sound,這些都在System::release中自動完成。
當(dāng)然,你也可以手動關(guān)閉它們,這是個很好的編程練習(xí)(雖然是多余的)。
如果你要釋放system對象就不需要調(diào)用System::close函數(shù)了,在System::release中已經(jīng)包含了對System::close的調(diào)用。

資源使用配制

在程序開發(fā)中,一些開發(fā)人員希望和其它程序一樣用自己的函數(shù)來訪問所有的磁盤或內(nèi)存。
在FMOD Ex中你可以通過System::setFileSystem函數(shù)來設(shè)置FMOD文件系統(tǒng)使你自己的文件程序。

要讓FMOD使用你的內(nèi)存系統(tǒng),或?qū)MOD限制在一個內(nèi)存塊中,使用Memory_Initialize

注意! 在Xbox和XBox 360中,必須給FMOD提供一個塊內(nèi)存。Xbox 360上必須使用XPhysicalAlloc來分配這塊內(nèi)存。更多參見"Platform specific issues"。

posted on 2008-09-26 10:21 clcl 閱讀(1675) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区在线视频| 国产精品久久久久久久久婷婷| 欧美电影在线免费观看网站| 久久久综合免费视频| 久久免费观看视频| 久久免费国产精品| 欧美成人精品1314www| 欧美激情中文字幕一区二区| 亚洲二区在线| 亚洲国产精品成人综合| 亚洲高清激情| 亚洲女性裸体视频| 亚洲国产成人精品女人久久久| 欧美不卡在线视频| 亚洲国产精品99久久久久久久久| 亚洲国产精品久久久久秋霞不卡| 亚洲茄子视频| 亚洲欧美日韩一区二区三区在线| 久久精品亚洲乱码伦伦中文 | 国产一区二区福利| 精品福利电影| 亚洲图片在线| 美国十次成人| 亚洲视频在线观看网站| 久久蜜桃av一区精品变态类天堂| 欧美丰满少妇xxxbbb| 国产农村妇女毛片精品久久麻豆 | 国产精品久久久99| 在线观看亚洲视频啊啊啊啊| 日韩一级成人av| 久久在线播放| 亚洲一区二区三区视频| 免费亚洲一区二区| 国内成人在线| 亚洲欧美日韩国产成人| 欧美国产91| 久久国产欧美| 国产精品99免视看9| 亚洲精品乱码视频| 久久精品99无色码中文字幕 | 久久亚洲国产成人| 国产精品久久久久久久7电影| 在线成人h网| 欧美一区二区三区免费在线看| 欧美激情视频一区二区三区在线播放 | 午夜精品久久久久久久99热浪潮| 美女日韩欧美| 国产一区久久| 欧美一级电影久久| 亚洲一二三区在线| 欧美日韩大片| 亚洲日本欧美日韩高观看| 狂野欧美激情性xxxx| 欧美一区二区三区视频在线| 国产精品超碰97尤物18| 一区二区久久| 亚洲美女视频在线免费观看| 欧美激情一区二区三区不卡| 亚洲国产一二三| 免费在线视频一区| 蜜臀av一级做a爰片久久| 影音先锋中文字幕一区| 久久嫩草精品久久久精品| 久久av一区二区三区亚洲| 国产亚洲精品久久久| 久久精视频免费在线久久完整在线看| 亚洲在线观看视频网站| 国产欧美在线观看一区| 久久一区二区视频| 老色鬼久久亚洲一区二区 | 亚洲经典视频在线观看| 欧美韩国在线| 欧美日韩亚洲一区三区| 亚洲一区精品视频| 午夜精品久久久久久久| 黄色成人av网站| 欧美电影在线免费观看网站| 欧美成人免费播放| 一区二区三区不卡视频在线观看| 99国产精品国产精品久久| 国产精品乱人伦一区二区| 久久www成人_看片免费不卡 | 国产精品视频导航| 久久久97精品| 欧美成人国产va精品日本一级| 亚洲精品乱码视频| 亚洲网站在线| 伊人一区二区三区久久精品| 亚洲国产高清在线观看视频| 欧美日韩精品免费看| 午夜一区二区三视频在线观看| 久久成人国产| 一本一本大道香蕉久在线精品| 在线视频日韩精品| 久久精品91| 亚洲精品乱码久久久久久黑人 | 久久精品最新地址| 久久综合影音| 欧美a级一区二区| 99视频在线精品国自产拍免费观看| 亚洲精品一区二区三区蜜桃久| 国产精品久久久久婷婷| 另类图片国产| 国产精品qvod| 美女91精品| 国产伦精品一区二区三区视频孕妇 | 欧美体内she精视频在线观看| 久久成人在线| 欧美日韩国产首页在线观看| 久久久精品一区| 欧美色图麻豆| 亚洲国产欧美另类丝袜| 激情欧美一区二区三区在线观看| 99ri日韩精品视频| 亚洲片在线观看| 久久精品视频在线看| 亚洲免费视频观看| 欧美日本国产精品| 欧美激情小视频| 伊甸园精品99久久久久久| 亚洲综合首页| 午夜一区不卡| 国产精品播放| 亚洲免费观看| 99在线热播精品免费| 免费久久99精品国产自| 久久综合伊人| 精品动漫av| 欧美在线高清| 久久久国产成人精品| 国产精品自在在线| 亚洲一区日韩| 久久成人精品视频| 国产欧美一区二区在线观看| 亚洲欧美国产77777| 欧美一区二区三区久久精品| 国产精品爱啪在线线免费观看| 91久久国产自产拍夜夜嗨| 亚洲精品日本| 欧美日韩国产首页| 中文有码久久| 欧美在线观看一区| 国内精品免费在线观看| 久久久91精品国产一区二区三区 | 亚洲欧美国产77777| 欧美一区二区三区播放老司机| 国产精品自拍在线| 久久精品天堂| 欧美高清视频www夜色资源网| 在线观看国产欧美| 久久一区二区三区国产精品| 欧美成人午夜激情在线| 亚洲国产你懂的| 一区二区精品在线| 国产精品久久久久久久第一福利 | 久久成人精品视频| 韩国精品在线观看| 麻豆成人小视频| 亚洲美女啪啪| 久久精品一区二区三区不卡牛牛| 韩国欧美一区| 欧美成人一区二区| 亚洲图片欧洲图片日韩av| 久久久久久久久久久久久女国产乱| 狠狠爱综合网| 欧美久久久久中文字幕| 亚洲主播在线观看| 欧美成人久久| 亚洲欧美日韩中文播放| 一区二区在线观看视频在线观看| 欧美高清在线视频观看不卡| 一本色道久久综合亚洲精品不卡 | 一区二区不卡在线视频 午夜欧美不卡'| 亚洲砖区区免费| 极品尤物一区二区三区| 欧美日韩1234| 久久精品99久久香蕉国产色戒| 亚洲国产视频一区| 欧美在线视频一区二区三区| 亚洲国产毛片完整版| 国产精品视频久久一区| 欧美成人精品1314www| 亚洲影院色无极综合| 亚洲国产一成人久久精品| 久久精品二区三区| 亚洲一区二区三区免费观看| 在线播放中文字幕一区| 国产精品视频不卡| 欧美日韩国产精品一区二区亚洲| 久久狠狠婷婷| 在线一区二区视频| 亚洲激情网站免费观看| 久久亚洲综合色| 西西裸体人体做爰大胆久久久| 亚洲国产精品v| 狠狠综合久久| 国产日韩欧美高清免费| 国产精品大全| 欧美午夜精品电影| 欧美国产一区在线|