OpenAL 使用基本流程

1. 初始化

        ALCcontext* p_context;
        ALCdevice* p_device;
        ALuint ui_source;
        ALuint m_buffers[MAX_CACHE];
        std::list<ALuint> m_buffer_queue;

        p_device = alcOpenDevice(NULL);
        p_context = alcCreate(p_device, NULL);
        alcMakeContextCurrent(p_context);
        alGenBuffers(MAX_SIZE, m_buffers);
        alGenSource(1, &p_source);
        for(auto buf : m_buffers)
        {
            m_buffer_queue.push_back(buf);
        }

2. 设置音效

alListenerf(AL_GAIN, 1.45f);

3. 播放

播放最简单的流程就是:
- 加载音频数据(PS:必须是Raw Data)
- 把数据写入buffer: alBufferData
- alSourcePlay

支持缓冲区的播放:
- 加载音频数据
- 回收Buffer : alSourceUnqueueBuffers
- 把数据写入buffer: alBufferData
- 将buffer放回缓冲区:alSourceQueueBuffers
- 播放: alSourcePlay

具体流程如下:
PS:下面代码是摘出来的,不一定可以运行,看看即可

while(b_break)
{
    //Read Data
    int size= ReadData(buffer);

    //recycle buffers
    ALint i_num;
    alGetSourcei(m_source, AL_BUFFERS_PROCESSED, &i_num);
    ALuint buffers[MAX_SIZE];
    alSourceUnqueueBuffers(ui_source, i_num, buffers);
    for(int i = 0; i <= i_num; ++i)
    {
        m_bufferQueue.push_back(buffers[i]);
    }

    //push data to al buffers
    alBuf = m_buffer_queue.front();
    alBufferData(alBuf, AL_FORMAT_MONO16, buffer, size * kByte, header->samplesPerSec);
    alSourceQueueBuffers(ui_source, 1, &alBuf);

   //play
   ALint bufferQueued;
   alGetSourcei(ui_source, AL_BUFFERS_QUEUED, &bufferQueued);
   if(bufferQueued != 0)
       alSourcePlay(m_source);
}

3. 退出

            //stop
            alSourceStop(ui_source);

            //release
            alcMakeContextCurrent(p_context)
            alDeleteSources(1, &ui_source);
            m_source = 0;

            alDeleteBuffers(MAX_CACHE, m_buffer);
            memset(m_buffer, 0, sizeof(m_buffer));

            alcMakeContextCurrent(nullptr);
            alcDestroyContext(p_context);
            m_context = nullptr;
            alcCloseDevice(p_device);
            p_device = nullptr;
            m_buffer_queue.clear();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值