「.ogg再生(OpenAL)」の編集履歴(バックアップ)一覧はこちら
「.ogg再生(OpenAL)」(2012/12/18 (火) 15:44:45) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>OpenAL で .ogg を再生します。</strong></p>
<table width="600" border="1" cellspacing="1" cellpadding="1"><tbody><tr><td>
<p>#pragma comment ( lib, "libogg_static.lib" )<br />
#pragma comment ( lib, "libvorbis_static.lib" )<br />
#pragma comment ( lib, "libvorbisfile_static.lib" )<br />
#pragma comment ( lib, "OpenAL32.lib" )<br />
#include "vorbis/vorbisfile.h"<br />
#include <windows.h></p>
<p>#include <al.h><br />
#include <alc.h><br />
#include <stdio.h><br />
#define NUM_BUFFERS 32<br />
#define BUFFER_SIZE 4096<br />
void main()<br />
{<br />
ALCdevice *device;<br />
ALCcontext *context;<br />
ALuint source, buffer;<br />
ALint state, num;<br />
device = alcOpenDevice(NULL);<br />
context = alcCreateContext(device, NULL);<br />
alcMakeContextCurrent(context);<br />
alGenSources(1, &source);<br />
FILE *fp;<br />
fopen_s(&fp,"sample.ogg", "rb");<br />
OggVorbis_File vf;<br />
int current = 0;<br />
ov_open(fp, &vf, NULL, 0);<br />
while(1) {<br />
char data[BUFFER_SIZE];<br />
long size = ov_read(&vf, data, sizeof(data), 0, 2, 1,
&current);<br />
vorbis_info *info = ov_info(&vf, -1);<br />
ALenum format = info->channels == 1 ? AL_FORMAT_MONO16 :
AL_FORMAT_STEREO16;<br />
if (size <= 0) {<br />
break;<br />
}<br />
alGetSourcei(source, AL_BUFFERS_QUEUED, &num);<br />
if (num < NUM_BUFFERS) {<br />
alGenBuffers(1, &buffer);<br />
} else {<br />
alGetSourcei(source, AL_SOURCE_STATE, &state);<br />
if (state != AL_PLAYING) {<br />
alSourcePlay(source);<br />
}<br />
while (alGetSourcei(source, AL_BUFFERS_PROCESSED, &num), num ==
0) {<br />
Sleep(100);<br />
}<br />
alSourceUnqueueBuffers(source, 1, &buffer);<br />
}<br />
alBufferData(buffer, format, data, size, info->rate);<br />
alSourceQueueBuffers(source, 1, &buffer);<br />
}<br />
ov_clear(&vf);<br />
alGetSourcei(source, AL_SOURCE_STATE, &state);<br />
if (state != AL_PLAYING) {<br />
alSourcePlay(source);<br />
}<br />
while (alGetSourcei(source, AL_SOURCE_STATE, &state), state ==
AL_PLAYING) {<br />
Sleep(100);<br />
}<br />
while (alGetSourcei(source, AL_BUFFERS_PROCESSED, &num), num > 0)
{<br />
alSourceUnqueueBuffers(source, 1, &buffer);<br />
alDeleteBuffers(1, &buffer);<br />
}<br />
alDeleteSources(1, &source);<br />
alcMakeContextCurrent(NULL);<br />
alcDestroyContext(context);<br />
alcCloseDevice(device);<br />
return;<br />
}</p>
</td>
</tr></tbody></table><p> </p>