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

隨筆 - 505  文章 - 1034  trackbacks - 0
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345


子曾經曰過:編程無他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 923078
  • 排名 - 14

最新隨筆

最新評論

閱讀排行榜

評論排行榜

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 七星重劍 閱讀(1353) 評論(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>
            久久久国产一区二区三区| 在线综合+亚洲+欧美中文字幕| 国产日韩在线亚洲字幕中文| 亚洲影视在线播放| 久久中文字幕一区二区三区| 亚洲高清成人| 国产精品av免费在线观看| 亚洲欧美日韩直播| 免费亚洲电影在线观看| 日韩亚洲不卡在线| 国产免费一区二区三区香蕉精| 久久精品视频在线免费观看| 亚洲日本va午夜在线电影| 欧美一区二区精美| 亚洲精品一区二区三区樱花| 国产欧美综合在线| 美日韩丰满少妇在线观看| 国产精品99久久久久久人| 欧美va日韩va| 久久久7777| 欧美一区2区视频在线观看| 亚洲激情另类| 亚洲国产精品www| 国产日韩欧美综合精品| 国产精品久久久久999| 欧美华人在线视频| 欧美xx视频| 免费看亚洲片| 久久男人av资源网站| 欧美一区2区三区4区公司二百| 亚洲少妇自拍| 在线视频日韩| 亚洲欧美日产图| 欧美一级视频免费在线观看| 亚洲视频在线播放| 亚洲一区二区三| 亚洲在线观看视频| 欧美一区二区私人影院日本| 性做久久久久久| 久久人人爽人人爽爽久久| 久久国内精品自在自线400部| 欧美诱惑福利视频| 老司机精品视频网站| 欧美激情视频网站| 国产精品sss| 伊人久久婷婷色综合98网| 亚洲高清一二三区| 亚洲无线视频| 久久久久久91香蕉国产| 亚洲国产精品一区在线观看不卡| 亚洲人成网站在线播| 宅男精品视频| 欧美精品久久久久a| 国产精品亚洲激情| 99精品国产热久久91蜜凸| 亚洲一线二线三线久久久| 老色批av在线精品| 一本色道久久综合亚洲精品按摩 | 亚洲专区一区| 欧美顶级艳妇交换群宴| 国产欧美在线看| 在线亚洲一区| 亚洲黄色精品| 久久在线免费观看| 国产专区一区| 欧美在线观看日本一区| avtt综合网| 欧美日韩在线免费| 一区二区三区不卡视频在线观看| 久久综合激情| 欧美综合激情网| 国产揄拍国内精品对白| 久久久天天操| 久久婷婷人人澡人人喊人人爽| 国产日韩欧美在线看| 欧美在线免费观看视频| 西西人体一区二区| 在线播放国产一区中文字幕剧情欧美 | 欧美国产先锋| 欧美大片免费久久精品三p | 免费黄网站欧美| 日韩午夜激情| 亚洲一区3d动漫同人无遮挡| 国产精品久久久久久久7电影| 亚洲午夜激情网站| 欧美专区在线观看一区| 在线日韩日本国产亚洲| 欧美激情网友自拍| 欧美午夜电影完整版| 午夜日韩在线| 久久午夜电影网| 亚洲午夜激情网站| 久久成人精品| 正在播放欧美一区| 久久国产精品99久久久久久老狼| 亚洲大片在线| 香蕉久久久久久久av网站| 亚洲激情成人| 久久久国产精品亚洲一区| 一区二区三区日韩欧美精品| 欧美在线视频观看| 亚洲一二三级电影| 欧美电影免费观看| 久久精品国产一区二区电影| 欧美精品国产一区| 欧美99久久| 黑人巨大精品欧美一区二区 | 国产精品久久久久久av福利软件 | 久久久久久久久久久久久久一区| 一区二区激情| 欧美精品久久天天躁| 欧美高清不卡在线| 在线看片日韩| 麻豆av一区二区三区| 久久久久国内| 好看的亚洲午夜视频在线| 欧美一区二区在线播放| 欧美一区二区视频免费观看| 国产精品乱人伦一区二区| 国产精品99久久久久久有的能看| 亚洲色诱最新| 国产精品稀缺呦系列在线| 亚洲欧美综合精品久久成人| 欧美一区二区三区精品电影| 国产精品永久免费| 久久精品一本| 亚洲激情在线激情| 亚洲一区三区在线观看| 国产精品视频99| 久久亚洲不卡| 一区二区三区色| 久久婷婷国产综合尤物精品 | 久久久精品一区| 91久久久亚洲精品| 欧美午夜精品久久久久免费视 | 亚洲国产第一| 欧美一二三区精品| 亚洲高清自拍| 国产精品一卡二卡| 欧美高清在线观看| 久久成人一区二区| 在线视频亚洲| 亚洲精品在线免费| 欧美aaaaaaaa牛牛影院| 亚洲手机成人高清视频| 激情视频亚洲| 国产精品日韩精品欧美精品| 欧美 日韩 国产精品免费观看| 亚洲一区www| 亚洲精品在线观看免费| 欧美电影在线| 免费不卡在线观看av| 久久精品色图| 久久久999成人| 欧美自拍偷拍| 久久精品2019中文字幕| 亚洲午夜电影| 亚洲综合电影| 亚洲欧洲99久久| 午夜精品久久久久久| 欧美一区二区久久久| 欧美亚洲日本网站| 久久av一区二区三区亚洲| 欧美专区中文字幕| 久久人人九九| 亚洲国产日日夜夜| 夜色激情一区二区| 亚洲淫性视频| 久久精品国产精品亚洲| 欧美国产日韩精品免费观看| 欧美女激情福利| 国产精品美女久久久久av超清| 国产日韩欧美视频| 一区二区视频在线观看| 日韩一二三在线视频播| 亚洲一区免费| 欧美本精品男人aⅴ天堂| 亚洲精品欧美在线| 亚洲欧美日韩综合一区| 欧美第一黄色网| 国产精品午夜在线| 日韩视频在线免费观看| 欧美一区二区三区在线观看视频 | 亚洲一二三区在线| 另类国产ts人妖高潮视频| 国产乱码精品一区二区三区av| 亚洲电影毛片| 久久国产精品久久久久久电车| 亚洲高清三级视频| 久久久久久久综合色一本| 国产精品乱码| 亚洲欧美日韩精品久久奇米色影视| 久久aⅴ国产欧美74aaa| 亚洲午夜精品国产| 欧美日韩另类字幕中文| 亚洲伦理中文字幕| 亚洲丰满少妇videoshd| 久久久久一本一区二区青青蜜月| 国产精品男人爽免费视频1| 一区二区毛片|