2020-01-01 21:29:24 +01:00
|
|
|
#include "SoundSystem.h"
|
2020-07-19 21:43:29 +02:00
|
|
|
|
|
|
|
#include <SDL.h>
|
2021-03-21 22:15:36 +01:00
|
|
|
#include <stdio.h>
|
2020-07-19 21:43:29 +02:00
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
#include "FileSystemUtils.h"
|
|
|
|
|
|
|
|
MusicTrack::MusicTrack(const char* fileName)
|
|
|
|
{
|
|
|
|
m_music = Mix_LoadMUS(fileName);
|
|
|
|
m_isValid = true;
|
|
|
|
if(m_music == NULL)
|
|
|
|
{
|
2020-07-01 02:57:22 +02:00
|
|
|
fprintf(stderr, "Unable to load Ogg Music file: %s\n", Mix_GetError());
|
2020-01-01 21:29:24 +01:00
|
|
|
m_isValid = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
MusicTrack::MusicTrack(SDL_RWops *rw)
|
|
|
|
{
|
2021-02-16 04:09:51 +01:00
|
|
|
m_music = Mix_LoadMUS_RW(rw, 1);
|
2020-01-01 21:29:24 +01:00
|
|
|
m_isValid = true;
|
|
|
|
if(m_music == NULL)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Unable to load Magic Binary Music file: %s\n", Mix_GetError());
|
|
|
|
m_isValid = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SoundTrack::SoundTrack(const char* fileName)
|
|
|
|
{
|
|
|
|
unsigned char *mem;
|
Transfer param init responsibility to loadFileToMemory
So, the codebase was kind of undecided about who is responsible for
initializing the parameters passed to FILESYSTEM_loadFileToMemory() - is
it the caller? Is it FILESYSTEM_loadFileToMemory()? Sometimes callers
would initialize one variable but not the other, and it was always a
toss-up whether or not FILESYSTEM_loadFileToMemory() would end up
initializing everything in the end.
All of this is to say that the game dereferences an uninitialized
pointer if it can't load a sound effect. Which is bad. Now, I could
either fix that single case, or fix every case. Judging by the title of
this commit, you can infer that I decided to fix every case - fixing
every case means not just all cases that currently exist (which, as far
as I know, is only the sound effect one), but all cases that could exist
in the future.
So, FILESYSTEM_loadFileToMemory() is now guaranteed to initialize its
parameters even if the file fails to be loaded. This is better than
passing the responsibility to the caller anyway, because if the caller
initialized it, then that would be wasted work if the file succeeds
anyway because FILESYSTEM_loadFileToMemory() will overwrite it, and if
the file fails to load, well that's when the variables get initialized
anyway.
2021-04-18 19:35:36 +02:00
|
|
|
size_t length;
|
2021-04-18 19:22:06 +02:00
|
|
|
|
|
|
|
sound = NULL;
|
|
|
|
|
2021-04-05 09:54:32 +02:00
|
|
|
FILESYSTEM_loadAssetToMemory(fileName, &mem, &length, false);
|
2021-02-16 04:07:32 +01:00
|
|
|
if (mem == NULL)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Unable to load WAV file %s\n", fileName);
|
2021-04-18 19:58:28 +02:00
|
|
|
SDL_assert(0 && "WAV file missing!");
|
2021-02-16 04:07:32 +01:00
|
|
|
return;
|
|
|
|
}
|
2021-02-23 05:21:12 +01:00
|
|
|
SDL_RWops *fileIn = SDL_RWFromConstMem(mem, length);
|
2020-01-01 21:29:24 +01:00
|
|
|
sound = Mix_LoadWAV_RW(fileIn, 1);
|
2021-02-16 04:05:01 +01:00
|
|
|
FILESYSTEM_freeMemory(&mem);
|
2020-01-01 21:29:24 +01:00
|
|
|
|
2020-06-07 21:49:18 +02:00
|
|
|
if (sound == NULL)
|
|
|
|
{
|
2020-01-01 21:29:24 +01:00
|
|
|
fprintf(stderr, "Unable to load WAV file: %s\n", Mix_GetError());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Explicitly declare void for all void parameter functions (#628)
Apparently in C, if you have `void test();`, it's completely okay to do
`test(2);`. The function will take in the argument, but just discard it
and throw it away. It's like a trash can, and a rude one at that. If you
declare it like `void test(void);`, this is prevented.
This is not a problem in C++ - doing `void test();` and `test(2);` is
guaranteed to result in a compile error (this also means that right now,
at least in all `.cpp` files, nobody is ever calling a void parameter
function with arguments and having their arguments be thrown away).
However, we may not be using C++ in the future, so I just want to lay
down the precedent that if a function takes in no arguments, you must
explicitly declare it as such.
I would've added `-Wstrict-prototypes`, but it produces an annoying
warning message saying it doesn't work in C++ mode if you're compiling
in C++ mode. So it can be added later.
2021-02-25 23:23:59 +01:00
|
|
|
SoundSystem::SoundSystem(void)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
|
|
|
int audio_rate = 44100;
|
|
|
|
Uint16 audio_format = AUDIO_S16SYS;
|
|
|
|
int audio_channels = 2;
|
|
|
|
int audio_buffers = 1024;
|
|
|
|
|
|
|
|
if (Mix_OpenAudio(audio_rate, audio_format, audio_channels, audio_buffers) != 0)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "Unable to initialize audio: %s\n", Mix_GetError());
|
|
|
|
SDL_assert(0 && "Unable to initialize audio!");
|
|
|
|
}
|
|
|
|
}
|