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

隨筆 - 505  文章 - 1034  trackbacks - 0
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910


子曾經(jīng)曰過:編程無(wú)他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊(cè)

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 925241
  • 排名 - 14

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

http://www.gamedev.net/reference/articles/article1958.asp

Programming 3D Sound With OpenAL in Windows
by Dan Ricart

As the capabilities of sound cards and sound APIs have increased over the years, 3D sound has played an increasingly important role in games. Creating an immersive experience for the gamer goes beyond nice looking graphics. Done correctly, ambient sound and music can take games to a whole new level. To achieve this effect, different sound programming APIs have been developed such as Microsoft's DirectSound and DirectSound3D, Aureal's A3D and Creative Labs EAX. More recently, Loki Entertainment and Creative Labs have developed OpenAL. They have done this in an effort to create a more standard, cross-platform API to allow developers to add sound to any title. This article explains the basics of OpenAL and how to get started adding 3D sound to your project.

OpenAL is basically an audio library that contains functions for playing back sounds and music in a game environment. It allows a programmer to load whatever sounds they like and control certain characteristics such as position, velocity, direction and angles for cones that determine how the sound is traveling. All sounds are positioned relative to the listener which represents the current place in the game universe where the user is. The closer the listener gets to a sound, the louder it gets. OpenAL can also be used for the playback of music. OpenAL can make use of streaming to continuously play music back in the background. OpenAL also supports the use of DirectSound3D and EAX in Windows. There are functions contained in the library that allow the use of these APIs without much extra programming.

The main advantage of OpenAL over DirectSound and EAX is that OpenAL is designed to be a cross platform API. It is possible to download Windows, Mac and Linux binaries of it so it can be used on many Operating Systems. DirectSound and DirectSound3D were designed only for Windows and EAX is basically an extension of DirectSound3D. For those wishing to create an application for multiple Operating Systems, OpenAL might be the way to go. This tutorial is designed to show you how to get basic functionality out of OpenAL in Windows. The code shown here is from the demo application that you can download which contains the complete example. OpenGL is used for the rendering so the demo shows some similarities between OpenGL and OpenAL.

Getting Started

The first thing to do is to obtain the OpenAL SDK. This can be obtained from Creative Labs developer site at developer.creative.com. Once the SDK is set up you can begin using its functions. You will first need to initialize OpenAL at the start of your game or application. For my application I am going to use the basic method of setting it up for DirectSound3D but it is also possible to make use of EAX by checking for its availability. The initialization code looks like this:

ALCcontext? * Context;
ALCdevice?
*
Device;

Device?
= ?alcOpenDevice((ALubyte * ) " DirectSound3D "
);
if ?(Device? ==
?NULL)
{
??exit(
- 1
);
}

// Create?context(s)

Context = alcCreateContext(Device,NULL);

// Set?active?context

alcMakeContextCurrent(Context);

// ?Clear?Error?Code

alGetError();

Loading Sounds

Once OpenAL has been initialized you can start filling buffers with sounds. The first step is to fill a buffer with sound using the alutLoadWAVFile function. Once you have filled the buffer you need to attach it to a source. This source can then be used to play back the sound. The code for loading a sound looks like this:

char * ?alBuffer;? // data?for?the?buffer
ALenum?alFormatBuffer;? // for?the?buffer?format
ALsizei?alFreqBuffer;? // for?the?frequency?of?the?buffer
long ?alBufferLen;? // the?bit?depth
ALboolean?alLoop;? // looped
unsigned? int ?alSource;? // buffer?source
unsigned? int ?alSampleSet;

// load?the?wave?file

alutLoadWAVFile( " test.wav " , & alFormatBuffer,?( void ? ** )? & alBuffer,(unsigned? int ? * ) & alBufferLen,? & alFreqBuffer,? & loop);

// create?1?source

alGenSources( 1 ,? & alSource);

// create?1?buffer

alGenBuffers( 1 ,? & alSampleSet);

// put?the?data?into?our?sampleset?buffer

alBufferData(alSampleSet,?alFormatBuffer,?alBuffer,?alBufferLen,?alFreqBuffer);

// assign?the?buffer?to?this?source

alSourcei(alSource,?AL_BUFFER,?alSampleSet);

// release?the?data

alutUnloadWAV(alFormatBuffer,?alBuffer,?alBufferLen,?alFreqBuffer);

The first step here was to load the file "test.wav". The data is read in and stored in alBuffer. Next a source and a buffer are created. Then the buffer is filled with data from alBuffer. Next the buffer is assigned to the source and the wave data is released.

Setting Source Properties

Once you have a sound source set up you will need to set some of its properties. To do this you use the alSource command. This function works similar to functions in OpenGL where different versions of the function exist such as alSourcei, alSourcef, alSource3f, and so on. The properties you are setting determine which function you use. Setting something like pitch for example just needs one floating point parameter so alSourcef is used. The first parameter passed to the function is that of the source you are modifying. The second parameter corresponds to what property you are changing. The rest of the parameters are the actual settings for this property. Here is an example of setting position and velocity for a sound source:

// set?source?position
alSource3f(alSource,AL_POSITION,?xposition,?yposition,?zposition);

// set?source?velocity

alSource3f(alSource,AL_VELOCITY,?xvelocity,?yvelocity,?zvelocity);

Here alSource is our sound source and AL_POSITION and AL_VELOCITY signal that we want to change the position and velocity parameters. The rest correspond to floating point numbers with preset values.

Using a Listener

The use of a listener in 3D sound is important so that you have a reference point from which to hear sounds. The closer a listener is to a sound source's position, the louder the sound will get provided there are no obstacles. OpenAL already has a listener object set up so all you need to do is modify its properties as needed. The most important properties of the listener are the position and orientation of the listener. These properties are generally updated once for every loop in a game. The position indicates where the listener currently is while the orientation is where the listener is facing. For example, if a listener is facing west and a sound is coming from the north, the sound will appear to come from the right. However if the user orientation changes and turns to face the north, the sound will now appear to come from straight ahead.

Modifying a listener's properties works similarly to the way you change a sound source's properties. The function alListener is used and has variations depending on the property you are modifying. For example, to set the listener position you can call alListener3f and specify 3 separate floating point numbers or you could call alListenerfv and pass an array of floating point numbers. The parameters for the position are simply the x, y and z values for the listener in the game world. The orientation property however takes 6 parameters. The first 3 are for the vector that corresponds to what the user of listener is currently looking at. The next 3 are for the vector leading straight up from where the listener is facing. Here is an example of setting the listener position and orientation:

float ?listenerx,?listenery,?listenerz;
float ?vec[ 6
];

listenerx
= 10.0f
;
listenery
= 0.0f
;
listenerz
= 5.0f
;

vec[
0 ]? = ?fvecx;? // forward?vector?x?value

vec[ 1 ]? = ?fvecy;? // forward?vector?y?value
vec[ 2 ]? = ?fvecz;? // forward?vector?z?value
vec[ 3 ]? = ?uvecx;? // up?vector?x?value
vec[ 4 ]? = ?uvecy;? // up?vector?y?value
vec[ 5 ]? = ?uvecz;? // up?vector?z?value

// set?current?listener?position

alListener3f(AL_POSITION,?listenerx,?listenery,?listenerz);

// set?current?listener?orientation

alListenerfv(AL_ORIENTATION,?vec);

In the first function call, 3 separate floating point numbers were passed for the x, y and z of the listener's position. For the second call, an array called vec is passed. This array is comprised of the six values for the two vectors dealing with the listener's orientation.

Playing Sounds

Once your sounds are loaded and you have set your listener properties you can then play your sounds. To do this you call the function alSourcePlay. This function takes a single parameter which is the source you want to play. To stop a sound you call the function alSourceStop which also takes the name of the source you want to stop. If you want your sound effect to loop such as if you have a sound of running water, you can set the looping property of the sound to true before playing the sound. Here is some sample code:

// tell?the?sound?to?loop?continuously
alSourcei(alSource,AL_LOOPING,AL_TRUE);

// play?the?sound

alSourcePlay(alSource);
To stop the sound:
alSourceStop(alSource);

Cleaning Up

Once you are finished with your program you need to free up your sources and buffers and shut down OpenAL. The commands are relatively simple. Here is how to delete your sources and buffers:

//delete?our?source
alDeleteSources(1,&alSource);

//delete?our?buffer

alDeleteBuffers(1,&alSampleSet);
Here the first parameter for each is the number of buffers or sources to be deleted and the second is the buffer or source to be deleted. The last step is to close out OpenAL itself. This is done as follows:
//Get?active?context
Context=alcGetCurrentContext();

//Get?device?for?active?context

Device=alcGetContextsDevice(Context);

//Disable?context

alcMakeContextCurrent(NULL);

//Release?context(s)

alcDestroyContext(Context);

//Close?device

alcCloseDevice(Device);

That's about it for playing basic sounds in OpenAL. The basic steps are to first initialize OpenAL, then load in whatever sounds you need, set the properties of the sounds and listener and then play the sounds. There is a lot more you can do with OpenAL but this was just written to describe some of the basics. The source code that comes along with this demonstrates the use of all of this in an OpenGL demo. In the demo, you control the listener and its position is set to your current position every loop. If you have any questions or comments, e-mail me at ricart3@tcnj.edu.

Download the source code for this article here.

posted on 2006-11-20 00:01 七星重劍 閱讀(1361) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Game Music & Sound
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            性欧美精品高清| 国产在线欧美日韩| 欧美成人激情视频| 国产一区亚洲一区| 欧美日韩在线一二三| 亚洲日本成人| 欧美成人蜜桃| 亚洲国产专区| 在线视频精品一区| 欧美日韩精品一区视频| 99视频有精品| 亚洲资源av| 国产精品视频最多的网站| 午夜久久资源| 久久先锋资源| 亚洲黄色一区二区三区| 欧美国产一区二区在线观看| 亚洲巨乳在线| 久久电影一区| 亚洲人被黑人高潮完整版| 欧美裸体一区二区三区| 亚洲欧美经典视频| 欧美高清在线观看| 中国av一区| 狠狠色噜噜狠狠狠狠色吗综合| 美国成人毛片| 亚洲视频一二| 免费成年人欧美视频| 中文在线资源观看视频网站免费不卡| 亚洲福利电影| 国产精品久久久久久久久久尿 | 免费国产一区二区| 久久久999精品| 日韩一级免费| 国产日韩欧美黄色| 欧美国产第二页| 欧美电影免费观看高清完整版| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品美女免费| 亚洲日本激情| 夜久久久久久| 亚洲新中文字幕| 亚洲人成亚洲人成在线观看| 亚洲国产精品激情在线观看| 最新中文字幕亚洲| 免费毛片一区二区三区久久久| 久久永久免费| 亚洲激精日韩激精欧美精品| 亚洲日韩中文字幕在线播放| 亚洲精品久久| 99国产精品一区| 亚洲欧美激情诱惑| 久久久久久69| 亚洲一区二区三区在线| 亚洲精品国产精品乱码不99| 99视频精品在线| 午夜影院日韩| 久久综合久久综合九色| 性色av一区二区三区红粉影视| 欧美中文字幕在线播放| 一区二区三区回区在观看免费视频| 欧美韩日高清| 久热国产精品| 久久婷婷影院| 亚洲福利国产精品| 欧美电影免费| 一区二区欧美日韩视频| 欧美在线一级va免费观看| 男女精品视频| 欧美成人一区二区三区片免费| 欧美三级韩国三级日本三斤| 国产日产欧美一区| 国产欧美精品在线观看| 91久久国产综合久久蜜月精品 | 久久精品日产第一区二区| 亚洲欧美国产高清va在线播| 一二三区精品福利视频| 日韩一级片网址| 久久超碰97中文字幕| 亚洲高清资源综合久久精品| 亚洲一区三区电影在线观看| 久久久综合免费视频| 欧美日韩在线播放三区四区| 国产精品99一区| 欧美亚洲第一页| 亚洲国产电影| 欧美一区二区三区视频在线| 久久不见久久见免费视频1| 亚洲激情在线播放| 久久国产欧美精品| 久久天堂av综合合色| 国产精品老牛| 一本色道久久88综合日韩精品| 卡通动漫国产精品| 亚洲一区二区三区成人在线视频精品 | 免费观看不卡av| 夜夜狂射影院欧美极品| 久久精品99国产精品| 欧美午夜性色大片在线观看| 亚洲国产女人aaa毛片在线| 欧美一区二区三区视频免费播放| 亚洲精品欧美日韩专区| 巨胸喷奶水www久久久免费动漫| 国产精品一香蕉国产线看观看 | 久久婷婷国产综合尤物精品| 一区二区免费在线播放| 欧美大片国产精品| 影音先锋成人资源站| 亚洲国产日日夜夜| 久久欧美中文字幕| 亚洲国产精品久久久久久女王| 欧美一级片一区| 久久一区二区三区超碰国产精品| 国产精品日本一区二区| 国产精品99久久久久久人| 欧美国产日韩一区二区在线观看| 久久av一区二区三区漫画| 国产精品一二三四| 亚洲男人av电影| 夜夜嗨av一区二区三区免费区| 欧美欧美在线| 日韩一级大片| 91久久夜色精品国产九色| 女人天堂亚洲aⅴ在线观看| 伊人久久综合| 免费在线欧美黄色| 久久久最新网址| 在线电影一区| 免费成人性网站| 久久女同互慰一区二区三区| 黄页网站一区| 亚洲欧美日韩直播| 亚洲一二三区在线观看| 国产精品视频免费一区| 欧美亚洲免费在线| 午夜精品久久| 欧美日韩精品免费看| 99热这里只有精品8| 亚洲欧洲在线一区| 欧美日韩蜜桃| 校园激情久久| 久久国内精品自在自线400部| 国产一区二区三区在线观看精品 | 韩国一区二区在线观看| 久久综合狠狠综合久久综青草| 久久久www成人免费精品| 国产精品久久久久久久久久免费看 | 亚洲一区二区三区乱码aⅴ| 久热精品在线| 久热精品在线| 99精品国产在热久久| 亚洲精品国产日韩| 国产精品h在线观看| 欧美一区二视频| 久久先锋影音av| 99精品99| 午夜精品福利一区二区蜜股av| 经典三级久久| 亚洲精品视频免费| 国产欧美一区二区三区在线老狼 | 亚洲免费在线精品一区| 亚洲女同精品视频| 136国产福利精品导航网址| 久久精品99国产精品| 久久免费视频网| 一本久久综合| 欧美一区二区三区男人的天堂 | 国外视频精品毛片| 亚洲国产一区二区三区青草影视 | 一区二区三区国产精品| 国产自产女人91一区在线观看| 欧美电影打屁股sp| 国产精品区一区二区三区| 欧美成人激情视频| 国产精品久久久久久久9999| 美女网站久久| 国产精品swag| 欧美激情中文字幕在线| 国产精品免费看片| 欧美激情精品久久久六区热门| 国产精品久久久久久久久久ktv| 美女视频网站黄色亚洲| 欧美色网在线| 欧美黄色aaaa| 国产欧美一级| 夜夜嗨av一区二区三区| 亚洲激情视频在线| 午夜精品久久久久久| 亚洲美女91| 99精品福利视频| 影音欧美亚洲| 午夜精品久久久久99热蜜桃导演| 亚洲精品自在久久| 久久不射2019中文字幕| 亚洲一区二区三区久久| 欧美激情va永久在线播放| 久久人体大胆视频| 国产精品亚洲一区二区三区在线| 亚洲日本理论电影| 亚洲三级视频在线观看|