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 | 播放的位置,字节数 |