2 #include "../engine/MessageQueue.hxx"
6 #include "../services/ResourceManager.hxx"
7 #include "../services/GameClock.hxx"
8 #include "../services/Randomizer.hxx"
17 template <
typename Type,
size_t N>
using Array = std::array<Type, N>;
24 json config_json = json::parse(jsonFileContent,
nullptr,
false);
27 if (config_json.is_discarded())
31 for (
auto &item : audioConfig.
Music)
32 for (
auto &trigger : item.second.triggers)
34 for (
auto &item : audioConfig.
Sound)
35 for (
auto &trigger : item.second.triggers)
43 LOG(
LOG_WARNING) <<
"Unable to initialize default audio device! " << error_msg;
59 if (err != AL_NO_ERROR)
66 alListener3f(AL_VELOCITY, 0.0f, 0.0f, 0.0f);
76 Array<float, 6> listener_orientation_vector{0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f};
77 alListenerfv(AL_ORIENTATION, listener_orientation_vector.data());
114 if (possibilities.empty())
116 LOG(
LOG_WARNING) <<
"No Soundtracks are triggered by " << trigger._to_string();
143 alSourcef((**it).source[1], AL_GAIN, volume);
153 alSourcef((**it).source[0], AL_GAIN, volume);
163 if (effect == AL_EFFECT_NULL)
175 if (effect == AL_EFFECT_NULL)
188 alSource3f(track->source[0], AL_POSITION,
static_cast<ALfloat
>(position.
x),
static_cast<ALfloat
>(position.
y),
189 static_cast<ALfloat
>(position.
z));
190 alSource3f(track->source[1], AL_POSITION,
static_cast<ALfloat
>(position.
x),
static_cast<ALfloat
>(position.
y),
191 static_cast<ALfloat
>(position.
z));
203 alSource3f(track->source[0], AL_POSITION,
static_cast<ALfloat
>(position.
x),
static_cast<ALfloat
>(position.
y),
204 static_cast<ALfloat
>(position.
z));
205 alSource3f(track->source[1], AL_POSITION,
static_cast<ALfloat
>(position.
x),
static_cast<ALfloat
>(position.
y),
206 static_cast<ALfloat
>(position.
z));
207 play(trigger, effect);
223 alSourceStop((**it)->source[0]);
224 alSourceStop((**it)->source[1]);
225 (**it)->isPlaying =
false;
240 alGetSourcei((**it)->source[(**it)->isMusic], AL_SOURCE_STATE, &state);
241 if (state != AL_PLAYING)
243 (**it)->isPlaying =
false;
267 alSourcePlay(track->source[track->isMusic]);
270 track->isPlaying =
true;
308 #define LOAD_PROC(T, x) ((x) = (T)alGetProcAddress(#x))
340 alEffecti(effect, AL_EFFECT_TYPE, ALEffect);
345 ALenum err = alGetError();
346 if (err != AL_NO_ERROR)
352 fprintf(stderr,
"OpenAL error: %s\n", alGetString(err));
364 assert(alGetError() == AL_NO_ERROR &&
"Failed to set effect slot");
369 alSource3i(track->source[track->isMusic], AL_AUXILIARY_SEND_FILTER, (ALint)(track->effect_slot), 0, AL_FILTER_NULL);
370 assert(alGetError() == AL_NO_ERROR &&
"Failed to setup reverb for sound source send 0.");
373 alSourcePlay(track->source[track->isMusic]);
375 track->isPlaying =
true;
381 [channelID](
const auto trackptr)
383 const auto &track = *trackptr;
384 return track && track->Channel.get() == channelID;
389 track->isPlaying =
false;
400 case AL_INVALID_NAME:
401 return "a bad name (ID) was passed to an OpenAL function";
402 case AL_INVALID_ENUM:
403 return "an invalid enum value was passed to an OpenAL function";
404 case AL_INVALID_VALUE:
405 return "an invalid value was passed to an OpenAL function";
406 case AL_INVALID_OPERATION:
407 return "the requested operation is not valid";
408 case AL_OUT_OF_MEMORY:
409 return "the requested operation resulted in OpenAL running out of memory";
411 return "there is not currently an error";
413 return "Unknown error";