#include "gtk_s9x.h" #include "gtk_sound_driver_openal.h" #include #include #include 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; }