.ogg再生(OpenAL)

「.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 &lt;windows.h&gt;</p> <p>#include &lt;al.h&gt;<br /> #include &lt;alc.h&gt;<br /> #include &lt;stdio.h&gt;<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, &amp;source);<br />     FILE *fp;<br />  fopen_s(&amp;fp,"sample.ogg", "rb");<br />     OggVorbis_File vf;<br />     int current = 0;<br />     ov_open(fp, &amp;vf, NULL, 0);<br />     while(1) {<br />   char data[BUFFER_SIZE];<br />         long size = ov_read(&amp;vf, data, sizeof(data), 0, 2, 1, &amp;current);<br />         vorbis_info *info = ov_info(&amp;vf, -1);<br />         ALenum format = info-&gt;channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;<br />         if (size &lt;= 0) {<br />             break;<br />         }<br />         alGetSourcei(source, AL_BUFFERS_QUEUED, &amp;num);<br />         if (num &lt; NUM_BUFFERS) {<br />             alGenBuffers(1, &amp;buffer);<br />         } else {<br />             alGetSourcei(source, AL_SOURCE_STATE, &amp;state);<br />             if (state != AL_PLAYING) {<br />                 alSourcePlay(source);<br />             }<br />             while (alGetSourcei(source, AL_BUFFERS_PROCESSED, &amp;num), num == 0) {<br />                 Sleep(100);<br />             }<br />             alSourceUnqueueBuffers(source, 1, &amp;buffer);<br />         }<br />         alBufferData(buffer, format, data, size, info-&gt;rate);<br />         alSourceQueueBuffers(source, 1, &amp;buffer);<br />     }<br />     ov_clear(&amp;vf);<br />     alGetSourcei(source, AL_SOURCE_STATE, &amp;state);<br />     if (state != AL_PLAYING) {<br />         alSourcePlay(source);<br />     }<br />     while (alGetSourcei(source, AL_SOURCE_STATE, &amp;state), state == AL_PLAYING) {<br />         Sleep(100);<br />     }<br />     while (alGetSourcei(source, AL_BUFFERS_PROCESSED, &amp;num), num &gt; 0) {<br />         alSourceUnqueueBuffers(source, 1, &amp;buffer);<br />         alDeleteBuffers(1, &amp;buffer);<br />     }<br />     alDeleteSources(1, &amp;source);<br />     alcMakeContextCurrent(NULL);<br />     alcDestroyContext(context);<br />     alcCloseDevice(device);<br />     return;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: