rendered paste body#include "gtk_s9x.h"
#include "gtk_sound_driver_openal.h"
#include <cmath>
#include <assert.h>
#include <AL/alut.h>
bool ingame = false;
S9xOpenALSoundDriver::S9xOpenALSoundDriver()
{
device = NULL;
context = NULL;
source = 0;
snd_buffer_size = 0;
thread_die = 0;
thread = NULL;
return;
}
void
S9xOpenALSoundDriver::init()
{
device = alcOpenDevice(NULL);
assert( device != NULL );
context = alcCreateContext(device, NULL);
assert( context != NULL );
alcMakeContextCurrent(context);
alGenBuffers(5, buffers);
alGenSources(1, &source);
alSourcei(source, AL_BUFFER, 0);
return;
}
void
S9xOpenALSoundDriver::terminate()
{
ingame = false;
alSourceStop(source);
//alSourcei(source, AL_BUFFER, 0);
{
int queued;
alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
while(queued--)
{
ALuint buffer;
alSourceUnqueueBuffers(source, 1, &buffer);
}
}
alDeleteSources(1, &source);
fprintf(stderr, "Deleting sources\n");
alDeleteBuffers(1, buffers);
fprintf(stderr, "Deleting buffers\n");
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
fprintf(stderr, "Deleting context\n");
alcCloseDevice(device);
return;
}
void
S9xOpenALSoundDriver::start()
{
ingame = true;
if (!(gui_config->mute_sound))
{
ALint sourceState = 0;
alSourceQueueBuffers(source, 5, buffers);
alGetSourcei(source, AL_SOURCE_STATE, &sourceState);
if(sourceState != AL_PLAYING)
{
alSourcePlay(source);
}
}
return;
}
void
S9xOpenALSoundDriver::stop()
{
ALint sourceState = 0;
alGetSourcei( source, AL_SOURCE_STATE, &sourceState );
if( sourceState != AL_STOPPED ) {
alSourceStop( source );
}
return;
}
bool
S9xOpenALSoundDriver::open_device(int mode, bool stereo, int buffer_size)
{
ALenum snd_format;
if (Settings.Stereo == true)
{
if (Settings.SixteenBitSound == true)
{snd_format=AL_FORMAT_STEREO16;} else {snd_format=AL_FORMAT_STEREO8;}
}
else
{
if (Settings.SixteenBitSound == true)
{snd_format=AL_FORMAT_MONO16;} else {snd_format=AL_FORMAT_MONO8;}
}
format = snd_format;
snd_buffer_size = buffer_size * (stereo ? 2 : 1);
//fprintf(stderr, "snd_buffer_size %d\n", snd_buffer_size);
snd_buffer = g_malloc0(snd_buffer_size*2);
for (int i = 0; i<5; i++)
{
alBufferData(buffers[i], format, (const ALvoid*) snd_buffer, snd_buffer_size, playback_rates[Settings.SoundPlaybackRate]);
}
return true;
}
void
S9xOpenALSoundDriver::mix()
{
if (ingame)
{
ALint processed;
alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
while(processed--)
{
ALuint buffer;
alSourceUnqueueBuffers(source, 1, &buffer);
S9xMixSamples ((uint8 *)snd_buffer, snd_buffer_size*2);
alBufferData(buffer, format, (const ALvoid*) snd_buffer, snd_buffer_size, playback_rates[Settings.SoundPlaybackRate]);
//fprintf(stderr, "BufferData error %d\n", alGetError());
alSourceQueueBuffers(source, 1, &buffer);
}
}
//usleep(5000);
{
ALint sourceState = 0;
alGetSourcei(source, AL_SOURCE_STATE, &sourceState);
if(sourceState == AL_PLAYING)
{
//fprintf(stderr, "Playing\n");
}
}
return;
}