mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 18:45:23 -04:00
Simplify sound context code, split up CC_BUILD_NOAUDIO into CC_BUILD_NOSOUND/NOMUSIC
This commit is contained in:
parent
faf01b1eea
commit
bf2d34dc34
101
src/Audio.c
101
src/Audio.c
@ -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 */
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user