OpenAL Lesson 2: Looping and Fadeaway(转载)

转载 2007年10月14日 19:51:00

转自http://www.devmaster.net/articles/openal-tutorials/lesson2.php

Hope you found the last tutorial of some use. I know I did. This will be a real quick and easy tutorial. It won't get too much more complicated at this point.

#include <conio.h>
#include 
<time.h>
#include 
<stdlib.h>
#include 
<al/al.h>
#include 
<al/alc.h>
#include 
<al/alu.h>
#include 
<al/alut.c>

// Buffers hold sound data.
ALuint Buffer;

// Sources are points of emitting sound.
ALuint Source;

// Position of the source sound.
ALfloat SourcePos[] = ...0.00.00.0 };

// Velocity of the source sound.
ALfloat SourceVel[] = ...0.00.00.1 };

// Position of the listener.
ALfloat ListenerPos[] = ...0.00.00.0 };

// Velocity of the listener.
ALfloat ListenerVel[] = ...0.00.00.0 };

// Orientation of the listener. (first 3 elements are "at", second 3 are "up")
ALfloat ListenerOri[] = ...0.00.0-1.0,  0.01.00.0 };

There is only one change in the code since the last tutorial in this fist section. It is that we altered the sources velocity. It's 'z' field is now 0.1.

ALboolean LoadALData()
...{
    
// Variables to load into.

    ALenum format;
    ALsizei size;
    ALvoid
* data;
    ALsizei freq;
    ALboolean loop;

    
// Load wav data into a buffer.

    alGenBuffers(
1&Buffer);

    
if (alGetError() != AL_NO_ERROR)
        
return AL_FALSE;

    alutLoadWAVFile(
"wavdata/Footsteps.wav"&format, &data, &size, &freq, &loop);
    alBufferData(Buffer, format, data, size, freq);
    alutUnloadWAV(format, data, size, freq);

    
// Bind buffer with a source.

    alGenSources(
1&Source);

    
if (alGetError() != AL_NO_ERROR)
        
return AL_FALSE;

    alSourcei (Source, AL_BUFFER,   Buffer   );
    alSourcef (Source, AL_PITCH,    
1.0f     );
    alSourcef (Source, AL_GAIN,     
1.0f     );
    alSourcefv(Source, AL_POSITION, SourcePos);
    alSourcefv(Source, AL_VELOCITY, SourceVel);
    alSourcei (Source, AL_LOOPING,  AL_TRUE  );

    
// Do an error check and return.

    
if (alGetError() != AL_NO_ERROR)
        
return AL_FALSE;

    
return AL_TRUE;
}

Two changes in this section. First we are loading the file "Footsteps.wav". We are also explicitly setting the sources 'AL_LOOPING' value to 'AL_TRUE'. What this means is that when the source is prompted to play it will continue to play until stopped. It will play over again after the sound clip has ended.

void SetListenerValues()
...{
    alListenerfv(AL_POSITION,    ListenerPos);
    alListenerfv(AL_VELOCITY,    ListenerVel);
    alListenerfv(AL_ORIENTATION, ListenerOri);
}


void KillALData()
...{
    alDeleteBuffers(
1&Buffer);
    alDeleteSources(
1&Source);
    alutExit();
}

Nothing has changed here.

int main(int argc, char *argv[])
...{
    
// Initialize OpenAL and clear the error bit.
    alutInit(NULL,0);
    alGetError();

    
// Load the wav data.
    if (LoadALData() == AL_FALSE)
        
return 0;

    SetListenerValues();

    
// Setup an exit procedure.
    atexit(KillALData);

    
// Begin the source playing.
    alSourcePlay(Source);

    
// Loop
    ALint time = 0;
    ALint elapse 
= 0;

    
while (!kbhit())
    
...{
        elapse 
+= clock() - time;
        time 
+= elapse;

        
if (elapse > 50)
        
...{
            elapse 
= 0;

            SourcePos[
0+= SourceVel[0];
            SourcePos[
1+= SourceVel[1];
            SourcePos[
2+= SourceVel[2];

            alSourcefv(Source, AL_POSITION, SourcePos);
        }

    }



    
return 0;
}

The only thing that has changed in this code is the loop. Instead of playing and stopping the audio sample it will slowly get quieter as the sources position grows more distant. We do this by slowly incrementing the position by it's velocity over time. The time is sampled by checking the system clock which gives us a tick count. It shouldn't be necessary to change this, but if the audio clip fades too fast you might want to change 50 to some higher number. Pressing any key will end the loop.

 

openal的借鉴

因为之前在原公司上班的时候,用过openAL来播放PCM实时数据流.现在换了新公司又要求我用自己的方法写个音频播放器.我就选用这openAL H-,RzL/   但是这次使用openAL的时候,就...
  • xiaojun111111
  • xiaojun111111
  • 2015年03月05日 16:47
  • 612

使用openal播放WAV音频

不使用alut,只使用openal播放WAV文件: #include #include struct WAVE_Data { char subChunkID[4]; //should con...
  • u011417605
  • u011417605
  • 2015年11月05日 18:48
  • 1209

OpenAl音频播放

OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。刚开始接触的时候可以下载工具包Alut,...
  • T20091
  • T20091
  • 2013年11月29日 19:04
  • 1840

使用OpenAL和FFMPEG解码并播放音乐

使用OpenAL和FFMPEG解码并播放音乐OpenAL是一个开源的音效库,然而这里只用它来播放音乐。 FFMPEG负责把音乐解码并转换成指定的编码和采样率,然后送到OpenAL中播放。 (已在w...
  • beichen2012
  • beichen2012
  • 2017年03月10日 11:18
  • 762

通过OpenAL对音频添加音效并存储

1. 前言前面的文章讲了如何使用OpenAL对音频添加音效,并播放,参见: OpenAL 使用基本流程 使用OpenAL混音,添加音频特效本文谈谈如何对音频进行渲染,然后存储下来。2. 初始化初始...
  • xiyanlgu
  • xiyanlgu
  • 2016年12月17日 11:24
  • 883

csdn如何转载别人的文章

csdn如何转载别人的文章
  • stonesing
  • stonesing
  • 2016年08月25日 17:07
  • 2097

csdn如何转载别人的文章

转载地址:http://blog.csdn.net/jiangping_zhu/article/details/18044109 1、找到要转载的文章,用chrome浏览器打开,右键选择审查元...
  • dlhlSC
  • dlhlSC
  • 2016年08月19日 16:51
  • 5078

个人对openAL的看法

个人对openAL的看法 因为之前在原公司上班的时候,用过openAL来播放PCM实时数据流.现在换了新公司又要求我用自己的方法写个音频播放器.我就选用这openAL  但是这次使用openAL的时候...
  • langsim
  • langsim
  • 2014年08月18日 18:31
  • 1119

iOS 最简单的OpenAL播放PCM实时音频

iOS 最简单的OpenAL播放PCM实时音频
  • chenchao_shenzhen
  • chenchao_shenzhen
  • 2016年02月02日 10:33
  • 3651

编程知识汇总--OpenAL

1,OpenAL源码编译 (http://blog.csdn.net/oilcode/article/details/50748568) 2,声音衰减,以及alDistanceModel函数使用详解 ...
  • oilcode
  • oilcode
  • 2016年02月26日 22:07
  • 749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenAL Lesson 2: Looping and Fadeaway(转载)
举报原因:
原因补充:

(最多只允许输入30个字)