Enumerate audio devices, add multi-audio rendering

This commit is contained in:
Doyle Thai 2016-07-27 16:52:10 +10:00
parent 9c3df0c488
commit 54dd5c84fa
3 changed files with 60 additions and 3 deletions

View File

@ -5,12 +5,12 @@
#include "Dengine/Assets.h" #include "Dengine/Assets.h"
#include "Dengine/Audio.h" #include "Dengine/Audio.h"
#include "Dengine/Common.h"
#include "Dengine/Debug.h" #include "Dengine/Debug.h"
#define AL_CHECK_ERROR() alCheckError_(__FILE__, __LINE__); #define AL_CHECK_ERROR() alCheckError_(__FILE__, __LINE__);
void alCheckError_(const char *file, int line) void alCheckError_(const char *file, int line)
{ {
// NOTE(doyle): OpenAL error stack is 1 deep
ALenum errorCode; ALenum errorCode;
while ((errorCode = alGetError()) != AL_NO_ERROR) while ((errorCode = alGetError()) != AL_NO_ERROR)
{ {
@ -40,16 +40,50 @@ void alCheckError_(const char *file, int line)
} }
}; };
const i32 audio_rendererInit(AudioRenderer *audioRenderer) const i32 audio_init()
{ {
/* Clear error stack */
alGetError(); alGetError();
ALCdevice *deviceAL = alcOpenDevice(NULL);
ALboolean enumerateAudioDevice =
alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT");
const ALCchar *device = NULL;
if (enumerateAudioDevice == AL_TRUE)
{
// TODO(doyle): Actually allow users to choose device to output
/*
The OpenAL specification says that the list of devices is organized as
a string devices are separated with a NULL character and the list is
terminated by two NULL characters.
alcGetString with NULL = get all device spcifiers not a particular one
*/
device = alcGetString(NULL, ALC_DEVICE_SPECIFIER);
const ALCchar *next = device + 1;
size_t len = 0;
printf("Devices list:\n");
printf("----------\n");
while (device && *device != '\0' && next && *next != '\0')
{
printf("%s\n", device);
len = common_strlen(device);
device += (len + 1);
next += (len + 2);
}
printf("----------\n");
}
/* Get audio device */
ALCdevice *deviceAL = alcOpenDevice(device);
if (!deviceAL) if (!deviceAL)
{ {
printf("alcOpenDevice() failed: Failed to init OpenAL device.\n"); printf("alcOpenDevice() failed: Failed to init OpenAL device.\n");
return -1; return -1;
} }
/* Set device context */
ALCcontext *contextAL = alcCreateContext(deviceAL, NULL); ALCcontext *contextAL = alcCreateContext(deviceAL, NULL);
alcMakeContextCurrent(contextAL); alcMakeContextCurrent(contextAL);
if (!contextAL) if (!contextAL)
@ -59,6 +93,11 @@ const i32 audio_rendererInit(AudioRenderer *audioRenderer)
} }
AL_CHECK_ERROR(); AL_CHECK_ERROR();
return 0;
}
const i32 audio_rendererInit(AudioRenderer *audioRenderer)
{
/* Generate number of concurrent audio file listeners */ /* Generate number of concurrent audio file listeners */
alGenSources(ARRAY_COUNT(audioRenderer->sourceId), audioRenderer->sourceId); alGenSources(ARRAY_COUNT(audioRenderer->sourceId), audioRenderer->sourceId);
AL_CHECK_ERROR(); AL_CHECK_ERROR();

View File

@ -113,6 +113,14 @@ int main()
* INITIALISE AUDIO * INITIALISE AUDIO
******************* *******************
*/ */
i32 result = audio_init();
if (result)
{
#ifdef DENGINE_DEBUG
ASSERT(INVALID_CODE_PATH);
#endif
}
AudioRenderer audioRenderer = {0}; AudioRenderer audioRenderer = {0};
audio_rendererInit(&audioRenderer); audio_rendererInit(&audioRenderer);
@ -128,6 +136,12 @@ int main()
audio_streamVorbis(&audioRenderer, audio); audio_streamVorbis(&audioRenderer, audio);
AudioRenderer overworldAudioRenderer = {0};
audio_rendererInit(&overworldAudioRenderer);
AudioVorbis *overworldAudio =
asset_getVorbis(&worldTraveller.assetManager, audiolist_overworld);
audio_streamVorbis(&overworldAudioRenderer, overworldAudio);
/* /*
******************* *******************
* GAME LOOP * GAME LOOP
@ -159,6 +173,7 @@ int main()
worldTraveller_gameUpdateAndRender(&worldTraveller, secondsElapsed); worldTraveller_gameUpdateAndRender(&worldTraveller, secondsElapsed);
GL_CHECK_ERROR(); GL_CHECK_ERROR();
audio_updateAndPlay(&audioRenderer); audio_updateAndPlay(&audioRenderer);
//audio_updateAndPlay(&overworldAudioRenderer);
/* Swap the buffers */ /* Swap the buffers */
glfwSwapBuffers(window); glfwSwapBuffers(window);

View File

@ -3,6 +3,8 @@
#include <OpenAL/al.h> #include <OpenAL/al.h>
#include "Dengine/Common.h"
typedef struct AudioRenderer typedef struct AudioRenderer
{ {
ALuint sourceId[1]; ALuint sourceId[1];
@ -12,6 +14,7 @@ typedef struct AudioRenderer
ALuint format; ALuint format;
} AudioRenderer; } AudioRenderer;
const i32 audio_init();
const i32 audio_rendererInit(AudioRenderer *audioRenderer); const i32 audio_rendererInit(AudioRenderer *audioRenderer);
void audio_streamVorbis(AudioRenderer *audioRenderer, AudioVorbis *vorbis); void audio_streamVorbis(AudioRenderer *audioRenderer, AudioVorbis *vorbis);
void audio_updateAndPlay(AudioRenderer *audioRenderer); void audio_updateAndPlay(AudioRenderer *audioRenderer);