[✔️]OpenAL API

325 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

下载OpenAL Core SDK

alcOpenDevice

alcCreateContext

OpenAL通常一共只可以申请32个播放器。

alBufferData

将PCM数据填充到OpenAL的bufer里面

void alBufferData( 
 ALuint buffer, // buffer名字
 ALenum format, // 填充格式
    // AL_FORMAT_MONO8 单声道
    // AL_FORMAT_MONO16 
    // AL_FORMAT_STEREO8 
    // AL_FORMAT_STEREO16   16位立体声
 const ALvoid *data, // 指向音频数据的指针
 ALsizei size, // 音频数据的字节大小
 ALsizei freq // 音频的频率,值越大声音越尖锐
); 

alutCreateBufferFromFile

alSourceQueueBuffers

将buffer的音频数据加入的播放队列里面,所有通过alSourceQueueBuffers附加到某个source的buffer,都应该有相同的声音格式。

void alSourceQueueBuffers( 
 ALuint source, 
 ALsizei n, // buffer的数量
 ALuint* buffers // buffer的地址
); 

如果检查到错误码AL_INVALID_OPERATION,大部分原因都是新加的buffer格式不相同导致的,检查下format和freq

There is no current context, an attempt was made to add a new buffer which is not the same format as the buffers already in the queue, or the source already has a static buffer attached.

alSourceUnqueueBuffers

buffer队列用以保证声音的连续播放,不然就会出现一顿一顿的感觉,因为是边解析边播放

用alSourceQueueBuffers入队列的buffer个数,出队用alSourceUnqueueBuffers

format
AL_FORMAT_MONO1616位单声道
AL_FORMAT_STEREO1616位立体声

alSourcePlay

播放源的状态将更改为AL_playing。当在 源已在播放,源将在开始时重新启动。当 附加的缓冲区已完成播放,源将进入AL_STOPPED状态。

踩坑

alcOpenDevicealcCreateContext如果检查错误,都会返回AL_INVALID_OPERATION,这个属于正常现象,在调用alcMakeContextCurrent之前,都会返回这个错误

后来我调用alBufferData也会出现AL_INVALID_OPERATION,是因为我设置alSourcei导致的,暂时先取消了设置

属性设置

需要先设置bufferdata 再进行source的属性设置 才能正常播放声音

source属性

属性数据类型描述
AL_PITCHf, fvsource的buffer的频率(采样率)倍增器(pitchmultiplier),总是正数
AL_GAINf, fvsource增益,应为正数
AL_MAX_DISTANCEf, fv, i, iv用于反钳位距离模型(InverseClamped Distance Model),大于次距离,source不再衰减
AL_ROLLOFF_FACTORf, fv, i, ivsource的衰减率,默认为1.0
AL_REFERENCE_DISTANCEf, fv, i, iv小于此距离时,source的音量减半(在衰减率和AL_MAX_DISTANCE作用之前)
AL_MIN_GAINf, fvsource的最小增益
AL_MAX_GAINf, fvsource的最大增益
AL_CONE_OUTER_GAINf, fv外锥(outercone)外的增益
AL_CONE_INNER_ANGLEf, fv, i, iv内锥覆盖的角度,在此之中,source不会衰减
AL_CONE_OUTER_ANGLEf, fv, i, iv外锥覆盖的角度,在此之外,source完全衰减。内锥和外锥之间平滑衰减
AL_POSITIONfv, 3f指定聆听者在三维世界的X,Y,Z位置,不能小于0,否则听不见
AL_VELOCITYfv, 3f速度矢量
AL_DIRECTIONfv, 3f, iv, 3i方向矢量
AL_SOURCE_RELATIVEi, iv指示position是否是相对于listener
AL_SOURCE_TYPEi, ivsource类型,AL_UNDETERMINED,AL_STATIC, AL_STREAMING
AL_LOOPINGi, iv设置循环播放,AL_TURE,AL_FALSE
AL_BUFFERi, iv附加的buffer的ID
AL_SOURCE_STATEi, ivsource的状态,AL_STOPPED,AL_PLAYING, ...
AL_BUFFERS_QUEUED i, iv【只读】用alSourceQueueBuffers入队列的buffer个数,出队用alSourceUnqueueBuffers
AL_BUFFERS_PROCESSEDi, iv【只读】队列中已经被处理的buffer数
AL_SEC_OFFSETf, fv, i, iv播放的位置,秒
AL_SAMPLE_OFFSETf, fv, i, iv播放的位置,Sample数
AL_BYTE_OFFSETf, fv, i, iv播放的位置,字节数