开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情
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_MONO16 | 16位单声道 |
| AL_FORMAT_STEREO16 | 16位立体声 |
alSourcePlay
播放源的状态将更改为AL_playing。当在 源已在播放,源将在开始时重新启动。当 附加的缓冲区已完成播放,源将进入AL_STOPPED状态。
踩坑
alcOpenDevice和alcCreateContext如果检查错误,都会返回AL_INVALID_OPERATION,这个属于正常现象,在调用alcMakeContextCurrent之前,都会返回这个错误
后来我调用alBufferData也会出现AL_INVALID_OPERATION,是因为我设置alSourcei导致的,暂时先取消了设置
属性设置
需要先设置bufferdata 再进行source的属性设置 才能正常播放声音
source属性
| 属性 | 数据类型 | 描述 |
|---|---|---|
| AL_PITCH | f, fv | source的buffer的频率(采样率)倍增器(pitchmultiplier),总是正数 |
| AL_GAIN | f, fv | source增益,应为正数 |
| AL_MAX_DISTANCE | f, fv, i, iv | 用于反钳位距离模型(InverseClamped Distance Model),大于次距离,source不再衰减 |
| AL_ROLLOFF_FACTOR | f, fv, i, iv | source的衰减率,默认为1.0 |
| AL_REFERENCE_DISTANCE | f, fv, i, iv | 小于此距离时,source的音量减半(在衰减率和AL_MAX_DISTANCE作用之前) |
| AL_MIN_GAIN | f, fv | source的最小增益 |
| AL_MAX_GAIN | f, fv | source的最大增益 |
| AL_CONE_OUTER_GAIN | f, fv | 外锥(outercone)外的增益 |
| AL_CONE_INNER_ANGLE | f, fv, i, iv | 内锥覆盖的角度,在此之中,source不会衰减 |
| AL_CONE_OUTER_ANGLE | f, fv, i, iv | 外锥覆盖的角度,在此之外,source完全衰减。内锥和外锥之间平滑衰减 |
AL_POSITION | fv, 3f | 指定聆听者在三维世界的X,Y,Z位置,不能小于0,否则听不见 |
| AL_VELOCITY | fv, 3f | 速度矢量 |
| AL_DIRECTION | fv, 3f, iv, 3i | 方向矢量 |
| AL_SOURCE_RELATIVE | i, iv | 指示position是否是相对于listener |
| AL_SOURCE_TYPE | i, iv | source类型,AL_UNDETERMINED,AL_STATIC, AL_STREAMING |
| AL_LOOPING | i, iv | 设置循环播放,AL_TURE,AL_FALSE |
AL_BUFFER | i, iv | 附加的buffer的ID |
| AL_SOURCE_STATE | i, iv | source的状态,AL_STOPPED,AL_PLAYING, ... |
AL_BUFFERS_QUEUED | i, iv | 【只读】用alSourceQueueBuffers入队列的buffer个数,出队用alSourceUnqueueBuffers |
AL_BUFFERS_PROCESSED | i, iv | 【只读】队列中已经被处理的buffer数 |
| AL_SEC_OFFSET | f, fv, i, iv | 播放的位置,秒 |
| AL_SAMPLE_OFFSET | f, fv, i, iv | 播放的位置,Sample数 |
| AL_BYTE_OFFSET | f, fv, i, iv | 播放的位置,字节数 |