Simplify sound context code, split up CC_BUILD_NOAUDIO into CC_BUILD_NOSOUND/NOMUSIC

This commit is contained in:
UnknownShadow200 2021-08-08 17:12:12 +10:00
parent faf01b1eea
commit bf2d34dc34
2 changed files with 53 additions and 51 deletions

View File

@ -17,22 +17,6 @@
#include "Window.h" #include "Window.h"
#endif #endif
int Audio_SoundsVolume, Audio_MusicVolume; int Audio_SoundsVolume, Audio_MusicVolume;
#if defined CC_BUILD_NOAUDIO
/* Can't use mojang's sounds or music assets, so just stub everything out */
static void OnInit(void) { }
static void OnFree(void) { }
void Audio_SetMusic(int volume) {
if (volume) Chat_AddRaw("&cMusic is not supported currently");
}
void Audio_SetSounds(int volume) {
if (volume) Chat_AddRaw("&cSounds are not supported currently");
}
void Audio_PlayDigSound(cc_uint8 type) { }
void Audio_PlayStepSound(cc_uint8 type) { }
#else
static const cc_string audio_dir = String_FromConst("audio"); static const cc_string audio_dir = String_FromConst("audio");
static void ApplyVolume(cc_int16* samples, int count, int volume) { static void ApplyVolume(cc_int16* samples, int count, int volume) {
@ -66,9 +50,6 @@ static int GetVolume(const char* volKey, const char* boolKey) {
} }
/*########################################################################################################################*
*------------------------------------------------Native implementation----------------------------------------------------*
*#########################################################################################################################*/
#if defined CC_BUILD_OPENAL #if defined CC_BUILD_OPENAL
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------OpenAL backend-----------------------------------------------------* *------------------------------------------------------OpenAL backend-----------------------------------------------------*
@ -126,6 +107,7 @@ struct AudioContext {
}; };
static void* audio_device; static void* audio_device;
static void* audio_context; static void* audio_context;
#define AUDIO_HAS_BACKEND
#if defined CC_BUILD_WIN #if defined CC_BUILD_WIN
static const cc_string alLib = String_FromConst("openal32.dll"); static const cc_string alLib = String_FromConst("openal32.dll");
@ -352,6 +334,7 @@ struct AudioContext {
}; };
static cc_bool AudioBackend_Init(void) { return true; } static cc_bool AudioBackend_Init(void) { return true; }
static void AudioBackend_Free(void) { } static void AudioBackend_Free(void) { }
#define AUDIO_HAS_BACKEND
void Audio_Init(struct AudioContext* ctx, int buffers) { void Audio_Init(struct AudioContext* ctx, int buffers) {
int i; int i;
@ -440,6 +423,7 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
static SLObjectItf slEngineObject; static SLObjectItf slEngineObject;
static SLEngineItf slEngineEngine; static SLEngineItf slEngineEngine;
static SLObjectItf slOutputObject; static SLObjectItf slOutputObject;
#define AUDIO_HAS_BACKEND
struct AudioContext { struct AudioContext {
int count, channels, sampleRate; int count, channels, sampleRate;
@ -608,6 +592,9 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
/*########################################################################################################################* /*########################################################################################################################*
*---------------------------------------------------Common backend code---------------------------------------------------* *---------------------------------------------------Common backend code---------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
#ifndef AUDIO_HAS_BACKEND
static void AudioBackend_Free(void) { }
#else
int Audio_GetChannels(struct AudioContext* ctx) { return ctx->channels; } int Audio_GetChannels(struct AudioContext* ctx) { return ctx->channels; }
int Audio_GetSampleRate(struct AudioContext* ctx) { return ctx->sampleRate; } int Audio_GetSampleRate(struct AudioContext* ctx) { return ctx->sampleRate; }
@ -664,18 +651,38 @@ cc_result Audio_PlaySound(struct AudioContext* ctx, struct Sound* snd, int volum
if ((res = Audio_Play(ctx))) return res; if ((res = Audio_Play(ctx))) return res;
return 0; return 0;
} }
#endif
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------Soundboard---------------------------------------------------------* *--------------------------------------------------------Sounds-----------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
#ifdef CC_BUILD_NOSOUNDS
/* Can't use mojang's sound assets, so just stub everything out */
static void Sounds_Init(void) { }
static void Sounds_Free(void) { }
static void Sounds_Stop(void) { }
static void Sounds_Start(void) {
Chat_AddRaw("&cSounds are not supported currently");
Audio_SoundsVolume = 0;
}
void Audio_PlayDigSound(cc_uint8 type) { }
void Audio_PlayStepSound(cc_uint8 type) { }
#else
#define AUDIO_MAX_SOUNDS 10 #define AUDIO_MAX_SOUNDS 10
#define SOUND_MAX_CONTEXTS 8
struct SoundGroup { struct SoundGroup {
int count; int count;
struct Sound sounds[AUDIO_MAX_SOUNDS]; struct Sound sounds[AUDIO_MAX_SOUNDS];
}; };
struct Soundboard { struct SoundGroup groups[SOUND_COUNT]; }; struct Soundboard { struct SoundGroup groups[SOUND_COUNT]; };
static struct Soundboard digBoard, stepBoard;
static struct AudioContext sound_contexts[SOUND_MAX_CONTEXTS];
static RNGState sounds_rnd;
#define WAV_FourCC(a, b, c, d) (((cc_uint32)a << 24) | ((cc_uint32)b << 16) | ((cc_uint32)c << 8) | (cc_uint32)d) #define WAV_FourCC(a, b, c, d) (((cc_uint32)a << 24) | ((cc_uint32)b << 16) | ((cc_uint32)c << 8) | (cc_uint32)d)
#define WAV_FMT_SIZE 16 #define WAV_FMT_SIZE 16
@ -779,7 +786,6 @@ static void Soundboard_Load(struct Soundboard* board, const cc_string* boardName
} else { group->count++; } } else { group->count++; }
} }
static RNGState sounds_rnd;
static const struct Sound* Soundboard_PickRandom(struct Soundboard* board, cc_uint8 type) { static const struct Sound* Soundboard_PickRandom(struct Soundboard* board, cc_uint8 type) {
struct SoundGroup* group; struct SoundGroup* group;
int idx; int idx;
@ -795,15 +801,6 @@ static const struct Sound* Soundboard_PickRandom(struct Soundboard* board, cc_ui
} }
/*########################################################################################################################*
*--------------------------------------------------------Sounds-----------------------------------------------------------*
*#########################################################################################################################*/
static struct Soundboard digBoard, stepBoard;
#define AUDIO_MAX_HANDLES 6
static struct AudioContext monoOutputs[AUDIO_MAX_HANDLES];
static struct AudioContext stereoOutputs[AUDIO_MAX_HANDLES];
CC_NOINLINE static void Sounds_Fail(cc_result res) { CC_NOINLINE static void Sounds_Fail(cc_result res) {
Logger_SimpleWarn(res, "playing sounds"); Logger_SimpleWarn(res, "playing sounds");
Chat_AddRaw("&cDisabling sounds"); Chat_AddRaw("&cDisabling sounds");
@ -813,7 +810,6 @@ CC_NOINLINE static void Sounds_Fail(cc_result res) {
static void Sounds_Play(cc_uint8 type, struct Soundboard* board) { static void Sounds_Play(cc_uint8 type, struct Soundboard* board) {
const struct Sound* snd_; const struct Sound* snd_;
struct Sound snd; struct Sound snd;
struct AudioContext* outputs;
struct AudioContext* ctx; struct AudioContext* ctx;
int chans, freq; int chans, freq;
int inUse, i, volume; int inUse, i, volume;
@ -829,9 +825,8 @@ static void Sounds_Play(cc_uint8 type, struct Soundboard* board) {
return; return;
} }
snd = *snd_; snd = *snd_;
volume = Audio_SoundsVolume; volume = Audio_SoundsVolume;
outputs = snd.channels == 1 ? monoOutputs : stereoOutputs;
if (board == &digBoard) { if (board == &digBoard) {
if (type == SOUND_METAL) snd.sampleRate = (snd.sampleRate * 6) / 5; if (type == SOUND_METAL) snd.sampleRate = (snd.sampleRate * 6) / 5;
@ -842,8 +837,8 @@ static void Sounds_Play(cc_uint8 type, struct Soundboard* board) {
} }
/* Try to play on fresh device, or device with same data format */ /* Try to play on fresh device, or device with same data format */
for (i = 0; i < AUDIO_MAX_HANDLES; i++) { for (i = 0; i < SOUND_MAX_CONTEXTS; i++) {
ctx = &outputs[i]; ctx = &sound_contexts[i];
if (!ctx->count) { if (!ctx->count) {
Audio_Init(ctx, 1); Audio_Init(ctx, 1);
} else { } else {
@ -863,9 +858,9 @@ static void Sounds_Play(cc_uint8 type, struct Soundboard* board) {
} }
} }
/* Try again with all devices, even if need to recreate one (expensive) */ /* Try again with all contexts, even if need to recreate one (expensive) */
for (i = 0; i < AUDIO_MAX_HANDLES; i++) { for (i = 0; i < SOUND_MAX_CONTEXTS; i++) {
ctx = &outputs[i]; ctx = &sound_contexts[i];
res = Audio_Poll(ctx, &inUse); res = Audio_Poll(ctx, &inUse);
if (res) { Sounds_Fail(res); return; } if (res) { Sounds_Fail(res); return; }
@ -887,14 +882,6 @@ static void Audio_PlayBlockSound(void* obj, IVec3 coords, BlockID old, BlockID n
} }
} }
static void Sounds_FreeOutputs(struct AudioContext* outputs) {
int i;
for (i = 0; i < AUDIO_MAX_HANDLES; i++) {
if (!outputs[i].count) continue;
Audio_Close(&outputs[i]);
}
}
static void Sounds_LoadFile(const cc_string* path, void* obj) { static void Sounds_LoadFile(const cc_string* path, void* obj) {
static const cc_string dig = String_FromConst("dig_"); static const cc_string dig = String_FromConst("dig_");
static const cc_string step = String_FromConst("step_"); static const cc_string step = String_FromConst("step_");
@ -910,8 +897,11 @@ static void Sounds_Start(void) {
} }
static void Sounds_Stop(void) { static void Sounds_Stop(void) {
Sounds_FreeOutputs(monoOutputs); int i;
Sounds_FreeOutputs(stereoOutputs); for (i = 0; i < SOUND_MAX_CONTEXTS; i++) {
if (!sound_contexts[i].count) continue;
Audio_Close(&sound_contexts[i]);
}
} }
static void Sounds_Init(void) { static void Sounds_Init(void) {
@ -923,11 +913,22 @@ static void Sounds_Free(void) { Sounds_Stop(); }
void Audio_PlayDigSound(cc_uint8 type) { Sounds_Play(type, &digBoard); } void Audio_PlayDigSound(cc_uint8 type) { Sounds_Play(type, &digBoard); }
void Audio_PlayStepSound(cc_uint8 type) { Sounds_Play(type, &stepBoard); } void Audio_PlayStepSound(cc_uint8 type) { Sounds_Play(type, &stepBoard); }
#endif
/*########################################################################################################################* /*########################################################################################################################*
*--------------------------------------------------------Music------------------------------------------------------------* *--------------------------------------------------------Music------------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
#ifdef CC_BUILD_NOMUSIC
/* Can't use mojang's music assets, so just stub everything out */
static void Music_Init(void) { }
static void Music_Free(void) { }
static void Music_Stop(void) { }
static void Music_Start(void) {
Chat_AddRaw("&cMusic is not supported currently");
Audio_MusicVolume = 0;
}
#else
static struct AudioContext music_ctx; static struct AudioContext music_ctx;
static void* music_thread; static void* music_thread;
static void* music_waitable; static void* music_waitable;
@ -1129,6 +1130,7 @@ static void Music_Free(void) {
Music_Stop(); Music_Stop();
Waitable_Free(music_waitable); Waitable_Free(music_waitable);
} }
#endif
/*########################################################################################################################* /*########################################################################################################################*
@ -1156,7 +1158,6 @@ static void OnFree(void) {
Music_Free(); Music_Free();
AudioBackend_Free(); AudioBackend_Free();
} }
#endif
struct IGameComponent Audio_Component = { struct IGameComponent Audio_Component = {
OnInit, /* Init */ OnInit, /* Init */

View File

@ -239,7 +239,8 @@ Thus it is **NOT SAFE** to allocate a string on the stack. */
#define CC_BUILD_GLMODERN #define CC_BUILD_GLMODERN
#define CC_BUILD_GLES #define CC_BUILD_GLES
#define CC_BUILD_TOUCH #define CC_BUILD_TOUCH
#define CC_BUILD_NOAUDIO #define CC_BUILD_NOSOUNDS
#defome CC_BUILD_NOMUSIC
#define CC_BUILD_MINFILES #define CC_BUILD_MINFILES
#endif #endif
#endif #endif