mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-13 12:31:25 +00:00
Simplify OpenAL code
This commit is contained in:
parent
7f395edc11
commit
13d17af838
@ -87,183 +87,6 @@ void CloseAL(void)
|
|||||||
alcCloseDevice(device);
|
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)
|
const char *ChannelsName(ALenum chans)
|
||||||
{
|
{
|
||||||
switch(chans)
|
switch(chans)
|
||||||
|
@ -21,13 +21,6 @@ const char *FormatName(ALenum format);
|
|||||||
ALsizei FramesToBytes(ALsizei size, ALenum channels, ALenum type);
|
ALsizei FramesToBytes(ALsizei size, ALenum channels, ALenum type);
|
||||||
ALsizei BytesToFrames(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
|
/* Loads samples into a buffer using the standard alBufferData call, but with a
|
||||||
* LPALBUFFERSAMPLESSOFT-compatible prototype. Assumes internalformat is valid
|
* LPALBUFFERSAMPLESSOFT-compatible prototype. Assumes internalformat is valid
|
||||||
* for alBufferData, and that channels and type match it. */
|
* for alBufferData, and that channels and type match it. */
|
||||||
|
@ -18,9 +18,6 @@
|
|||||||
#include "audio/soundcore-openal.h"
|
#include "audio/soundcore-openal.h"
|
||||||
#include "audio/alhelpers.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 OpenALCreateSoundBuffer(ALBufferParamsStruct *params, ALSoundBufferStruct **soundbuf_struct, void *extra_data);
|
||||||
static long OpenALDestroySoundBuffer(ALSoundBufferStruct **soundbuf_struct);
|
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"))
|
if (alIsExtensionPresent("AL_SOFT_buffer_samples"))
|
||||||
{
|
{
|
||||||
LOG("AL_SOFT_buffer_samples supported, good!");
|
LOG("AL_SOFT_buffer_samples supported, good!");
|
||||||
alBufferSamplesSOFT = alGetProcAddress("alBufferSamplesSOFT");
|
|
||||||
alIsBufferFormatSupportedSOFT = alGetProcAddress("alIsBufferFormatSupportedSOFT");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -340,22 +335,14 @@ static ALVoice *NewVoice(ALBufferParamsStruct *params)
|
|||||||
// Emulator supports only mono and stereo
|
// Emulator supports only mono and stereo
|
||||||
if (params->lpwfxFormat->nChannels == 2)
|
if (params->lpwfxFormat->nChannels == 2)
|
||||||
{
|
{
|
||||||
voice->channels = AL_STEREO_SOFT;
|
voice->format = AL_FORMAT_STEREO16;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
voice->channels = AL_MONO_SOFT;
|
voice->format = AL_FORMAT_MONO16;
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate enough space for the temp buffer, given the format */
|
/* Allocate enough space for the temp buffer, given the format */
|
||||||
//voice->buffersize = FramesToBytes(params->dwBufferBytes, voice->channels, voice->type);
|
|
||||||
voice->buffersize = params->dwBufferBytes;
|
voice->buffersize = params->dwBufferBytes;
|
||||||
voice->data = malloc(voice->buffersize);
|
voice->data = malloc(voice->buffersize);
|
||||||
if (voice->data == NULL)
|
if (voice->data == NULL)
|
||||||
@ -364,12 +351,9 @@ static ALVoice *NewVoice(ALBufferParamsStruct *params)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("\tType : 0x%08x", voice->type);
|
|
||||||
LOG("\tRate : 0x%08x", voice->rate);
|
LOG("\tRate : 0x%08x", voice->rate);
|
||||||
LOG("\tChannels : 0x%08x", voice->channels);
|
|
||||||
LOG("\tFormat : 0x%08x", voice->format);
|
LOG("\tFormat : 0x%08x", voice->format);
|
||||||
LOG("\tbuffersize : %d", voice->buffersize);
|
LOG("\tbuffersize : %d", voice->buffersize);
|
||||||
LOG("\tSOFT : %s", alIsBufferFormatSupportedSOFT ? "YES" : "NO");
|
|
||||||
|
|
||||||
return voice;
|
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)
|
static long ALPlay(void *_this, unsigned long reserved1, unsigned long reserved2, unsigned long flags)
|
||||||
{
|
{
|
||||||
LOG("ALPlay ...");
|
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; i<half_buffers; i++)
|
|
||||||
{
|
|
||||||
alBufferSamplesSOFT(voice->buffers[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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -616,13 +547,12 @@ static long _ALSubmitBufferToOpenAL(ALVoice *voice)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
//LOG("Enqueing OpenAL buffer %u (%u bytes)", node->bufid, node->bytes);
|
//LOG("Enqueing OpenAL buffer %u (%u bytes)", node->bufid, node->bytes);
|
||||||
alBufferSamplesSOFT(node->bufid, voice->rate, voice->format,
|
alBufferData(node->bufid, voice->format, voice->data, node->bytes, voice->rate);
|
||||||
BytesToFrames(node->bytes, voice->channels, voice->type),
|
|
||||||
voice->channels, voice->type, voice->data);
|
|
||||||
if ((err = alGetError()) != AL_NO_ERROR)
|
if ((err = alGetError()) != AL_NO_ERROR)
|
||||||
{
|
{
|
||||||
PlaylistDequeue(voice, node);
|
PlaylistDequeue(voice, node);
|
||||||
ERRLOG("OOPS, Error alBufferSamplesSOFT : 0x%08x", err);
|
ERRLOG("OOPS, Error alBufferData : 0x%08x", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user