From 13d17af838f020629f4f64677bf1687b68616074 Mon Sep 17 00:00:00 2001 From: Aaron Culliney Date: Sun, 12 Oct 2014 10:31:10 -0700 Subject: [PATCH] Simplify OpenAL code --- src/audio/alhelpers.c | 177 ----------------------------------- src/audio/alhelpers.h | 7 -- src/audio/soundcore-openal.c | 80 +--------------- 3 files changed, 5 insertions(+), 259 deletions(-) diff --git a/src/audio/alhelpers.c b/src/audio/alhelpers.c index cdaec2c1..254ea47c 100644 --- a/src/audio/alhelpers.c +++ b/src/audio/alhelpers.c @@ -87,183 +87,6 @@ void CloseAL(void) alcCloseDevice(device); } - -/* GetFormat retrieves a compatible buffer format given the channel config and - * sample type. If an alIsBufferFormatSupportedSOFT-compatible function is - * provided, it will be called to find the closest-matching format from - * AL_SOFT_buffer_samples. Returns AL_NONE (0) if no supported format can be - * found. */ -ALenum GetFormat(ALenum channels, ALenum type, LPALISBUFFERFORMATSUPPORTEDSOFT palIsBufferFormatSupportedSOFT) -{ - ALenum format = AL_NONE; - - /* If using AL_SOFT_buffer_samples, try looking through its formats */ - if(palIsBufferFormatSupportedSOFT) - { - /* AL_SOFT_buffer_samples is more lenient with matching formats. The - * specified sample type does not need to match the returned format, - * but it is nice to try to get something close. */ - if(type == AL_UNSIGNED_BYTE_SOFT || type == AL_BYTE_SOFT) - { - if(channels == AL_MONO_SOFT) format = AL_MONO8_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO8_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD8_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_8_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_8_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_8_SOFT; - } - else if(type == AL_UNSIGNED_SHORT_SOFT || type == AL_SHORT_SOFT) - { - if(channels == AL_MONO_SOFT) format = AL_MONO16_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO16_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD16_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_16_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_16_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_16_SOFT; - } - else if(type == AL_UNSIGNED_BYTE3_SOFT || type == AL_BYTE3_SOFT || - type == AL_UNSIGNED_INT_SOFT || type == AL_INT_SOFT || - type == AL_FLOAT_SOFT || type == AL_DOUBLE_SOFT) - { - if(channels == AL_MONO_SOFT) format = AL_MONO32F_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO32F_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD32F_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_32F_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_32F_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_32F_SOFT; - } - - if(format != AL_NONE && !palIsBufferFormatSupportedSOFT(format)) - format = AL_NONE; - - /* A matching format was not found or supported. Try 32-bit float. */ - if(format == AL_NONE) - { - if(channels == AL_MONO_SOFT) format = AL_MONO32F_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO32F_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD32F_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_32F_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_32F_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_32F_SOFT; - - if(format != AL_NONE && !palIsBufferFormatSupportedSOFT(format)) - format = AL_NONE; - } - /* 32-bit float not supported. Try 16-bit int. */ - if(format == AL_NONE) - { - if(channels == AL_MONO_SOFT) format = AL_MONO16_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO16_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD16_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_16_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_16_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_16_SOFT; - - if(format != AL_NONE && !palIsBufferFormatSupportedSOFT(format)) - format = AL_NONE; - } - /* 16-bit int not supported. Try 8-bit int. */ - if(format == AL_NONE) - { - if(channels == AL_MONO_SOFT) format = AL_MONO8_SOFT; - else if(channels == AL_STEREO_SOFT) format = AL_STEREO8_SOFT; - else if(channels == AL_QUAD_SOFT) format = AL_QUAD8_SOFT; - else if(channels == AL_5POINT1_SOFT) format = AL_5POINT1_8_SOFT; - else if(channels == AL_6POINT1_SOFT) format = AL_6POINT1_8_SOFT; - else if(channels == AL_7POINT1_SOFT) format = AL_7POINT1_8_SOFT; - - if(format != AL_NONE && !palIsBufferFormatSupportedSOFT(format)) - format = AL_NONE; - } - - return format; - } - - /* We use the AL_EXT_MCFORMATS extension to provide output of Quad, 5.1, - * and 7.1 channel configs, AL_EXT_FLOAT32 for 32-bit float samples, and - * AL_EXT_DOUBLE for 64-bit float samples. */ - if(type == AL_UNSIGNED_BYTE_SOFT) - { - if(channels == AL_MONO_SOFT) - format = AL_FORMAT_MONO8; - else if(channels == AL_STEREO_SOFT) - format = AL_FORMAT_STEREO8; - else if(alIsExtensionPresent("AL_EXT_MCFORMATS")) - { - if(channels == AL_QUAD_SOFT) - format = alGetEnumValue("AL_FORMAT_QUAD8"); - else if(channels == AL_5POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_51CHN8"); - else if(channels == AL_6POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_61CHN8"); - else if(channels == AL_7POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_71CHN8"); - } - } - else if(type == AL_SHORT_SOFT) - { - if(channels == AL_MONO_SOFT) - format = AL_FORMAT_MONO16; - else if(channels == AL_STEREO_SOFT) - format = AL_FORMAT_STEREO16; - else if(alIsExtensionPresent("AL_EXT_MCFORMATS")) - { - if(channels == AL_QUAD_SOFT) - format = alGetEnumValue("AL_FORMAT_QUAD16"); - else if(channels == AL_5POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_51CHN16"); - else if(channels == AL_6POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_61CHN16"); - else if(channels == AL_7POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_71CHN16"); - } - } - else if(type == AL_FLOAT_SOFT && alIsExtensionPresent("AL_EXT_FLOAT32")) - { - if(channels == AL_MONO_SOFT) - format = alGetEnumValue("AL_FORMAT_MONO_FLOAT32"); - else if(channels == AL_STEREO_SOFT) - format = alGetEnumValue("AL_FORMAT_STEREO_FLOAT32"); - else if(alIsExtensionPresent("AL_EXT_MCFORMATS")) - { - if(channels == AL_QUAD_SOFT) - format = alGetEnumValue("AL_FORMAT_QUAD32"); - else if(channels == AL_5POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_51CHN32"); - else if(channels == AL_6POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_61CHN32"); - else if(channels == AL_7POINT1_SOFT) - format = alGetEnumValue("AL_FORMAT_71CHN32"); - } - } - else if(type == AL_DOUBLE_SOFT && alIsExtensionPresent("AL_EXT_DOUBLE")) - { - if(channels == AL_MONO_SOFT) - format = alGetEnumValue("AL_FORMAT_MONO_DOUBLE"); - else if(channels == AL_STEREO_SOFT) - format = alGetEnumValue("AL_FORMAT_STEREO_DOUBLE"); - } - - /* NOTE: It seems OSX returns -1 from alGetEnumValue for unknown enums, as - * opposed to 0. Correct it. */ - if(format == -1) - format = 0; - - return format; -} - - -void AL_APIENTRY wrap_BufferSamples(ALuint buffer, ALuint samplerate, - ALenum internalformat, ALsizei samples, - ALenum channels, ALenum type, - const ALvoid *data) -{ - alBufferData(buffer, internalformat, data, - FramesToBytes(samples, channels, type), - samplerate); -} - - const char *ChannelsName(ALenum chans) { switch(chans) diff --git a/src/audio/alhelpers.h b/src/audio/alhelpers.h index bd3471f6..47caa7b8 100644 --- a/src/audio/alhelpers.h +++ b/src/audio/alhelpers.h @@ -21,13 +21,6 @@ const char *FormatName(ALenum format); ALsizei FramesToBytes(ALsizei size, ALenum channels, ALenum type); ALsizei BytesToFrames(ALsizei size, ALenum channels, ALenum type); -/* Retrieves a compatible buffer format given the channel configuration and - * sample type. If an alIsBufferFormatSupportedSOFT-compatible function is - * provided, it will be called to find the closest-matching format from - * AL_SOFT_buffer_samples. Returns AL_NONE (0) if no supported format can be - * found. */ -ALenum GetFormat(ALenum channels, ALenum type, LPALISBUFFERFORMATSUPPORTEDSOFT palIsBufferFormatSupportedSOFT); - /* Loads samples into a buffer using the standard alBufferData call, but with a * LPALBUFFERSAMPLESSOFT-compatible prototype. Assumes internalformat is valid * for alBufferData, and that channels and type match it. */ diff --git a/src/audio/soundcore-openal.c b/src/audio/soundcore-openal.c index d21ef401..795da468 100644 --- a/src/audio/soundcore-openal.c +++ b/src/audio/soundcore-openal.c @@ -18,9 +18,6 @@ #include "audio/soundcore-openal.h" #include "audio/alhelpers.h" -LPALBUFFERSAMPLESSOFT alBufferSamplesSOFT = wrap_BufferSamples; -LPALISBUFFERFORMATSUPPORTEDSOFT alIsBufferFormatSupportedSOFT = NULL; - static long OpenALCreateSoundBuffer(ALBufferParamsStruct *params, ALSoundBufferStruct **soundbuf_struct, void *extra_data); static long OpenALDestroySoundBuffer(ALSoundBufferStruct **soundbuf_struct); @@ -128,8 +125,6 @@ long SoundSystemCreate(const char *sound_device, SoundSystemStruct **sound_struc if (alIsExtensionPresent("AL_SOFT_buffer_samples")) { LOG("AL_SOFT_buffer_samples supported, good!"); - alBufferSamplesSOFT = alGetProcAddress("alBufferSamplesSOFT"); - alIsBufferFormatSupportedSOFT = alGetProcAddress("alIsBufferFormatSupportedSOFT"); } else { @@ -340,22 +335,14 @@ static ALVoice *NewVoice(ALBufferParamsStruct *params) // Emulator supports only mono and stereo if (params->lpwfxFormat->nChannels == 2) { - voice->channels = AL_STEREO_SOFT; + voice->format = AL_FORMAT_STEREO16; } else { - voice->channels = AL_MONO_SOFT; - } - voice->type = AL_SHORT_SOFT; // signed 16bit - voice->format = GetFormat(voice->channels, voice->type, alIsBufferFormatSupportedSOFT); - if (voice->format == 0) - { - ERRLOG("OOPS, Unsupported format (%s, %s)", ChannelsName(voice->channels), TypeName(voice->type)); - break; + voice->format = AL_FORMAT_MONO16; } /* Allocate enough space for the temp buffer, given the format */ - //voice->buffersize = FramesToBytes(params->dwBufferBytes, voice->channels, voice->type); voice->buffersize = params->dwBufferBytes; voice->data = malloc(voice->buffersize); if (voice->data == NULL) @@ -364,12 +351,9 @@ static ALVoice *NewVoice(ALBufferParamsStruct *params) break; } - LOG("\tType : 0x%08x", voice->type); LOG("\tRate : 0x%08x", voice->rate); - LOG("\tChannels : 0x%08x", voice->channels); LOG("\tFormat : 0x%08x", voice->format); LOG("\tbuffersize : %d", voice->buffersize); - LOG("\tSOFT : %s", alIsBufferFormatSupportedSOFT ? "YES" : "NO"); return voice; @@ -417,59 +401,6 @@ static long ALRestore(void *_this) static long ALPlay(void *_this, unsigned long reserved1, unsigned long reserved2, unsigned long flags) { LOG("ALPlay ..."); -#if 0 - ALVoice *voice = (ALVoice*)_this; - int err = 0; - - // Rewind the source position and clear the buffer queue - alSourceRewind(voice->source); - if((err = alGetError()) != AL_NO_ERROR) - { - ERRLOG("OOPS, alSourceRewind : 0x%08x", err); - return err; - } - - alSourcei(voice->source, AL_BUFFER, 0); - if((err = alGetError()) != AL_NO_ERROR) - { - ERRLOG("OOPS, alSourcei : 0x%08x", err); - return err; - } - -if (false) { - // fill buffer queue with quiet - memset(voice->data, 0x0, voice->buffersize); - int half_buffers = (OPENAL_NUM_BUFFERS>>1); - for (size_t i=0; ibuffers[i], voice->rate, voice->format, - BytesToFrames(voice->buffersize, voice->channels, voice->type), - voice->channels, voice->type, voice->data); - err = alGetError(); - if (err != AL_NO_ERROR) - { - LOG("Error buffering initial samples : 0x%08x", err); - return err; - } - } - - alSourceQueueBuffers(voice->source, OPENAL_NUM_BUFFERS, voice->buffers); - err = alGetError(); - if (err != AL_NO_ERROR) - { - LOG("Error queueing initial buffers : 0x%08x", err); - return err; - } - - alSourcePlay(voice->source); - err = alGetError(); - if (err != AL_NO_ERROR) - { - LOG("Error starting playback : 0x%08x", err); - return err; - } -} -#endif return 0; } @@ -616,13 +547,12 @@ static long _ALSubmitBufferToOpenAL(ALVoice *voice) return -1; } //LOG("Enqueing OpenAL buffer %u (%u bytes)", node->bufid, node->bytes); - alBufferSamplesSOFT(node->bufid, voice->rate, voice->format, - BytesToFrames(node->bytes, voice->channels, voice->type), - voice->channels, voice->type, voice->data); + alBufferData(node->bufid, voice->format, voice->data, node->bytes, voice->rate); + if ((err = alGetError()) != AL_NO_ERROR) { PlaylistDequeue(voice, node); - ERRLOG("OOPS, Error alBufferSamplesSOFT : 0x%08x", err); + ERRLOG("OOPS, Error alBufferData : 0x%08x", err); return err; }