- [CHG] Retocat el mòdul JAudio per a adaptar-se a les necesitats del joc.

- [NEW] audio::getCurrentMusic()
- [NEW] audio::stopAllChannels()
- [FIX] El JAudio i JInput han de inicialitzarse abans de entrar al Init del joc
- Afegides músiques i alguns sons
- Comence a fer que sone cada musica i so en el seu lloc
- [TOFIX] LAG EN EL AUDIO!
This commit is contained in:
2024-10-03 13:09:44 +02:00
parent c92f2a13aa
commit e009aef341
20 changed files with 109 additions and 74 deletions

View File

@@ -3,51 +3,53 @@
#include <SDL2/SDL_mixer.h>
#include <stdio.h>
#include "jfile.h"
#include <vector>
#include "config.h"
namespace audio
{
// Açò son estructures de mentires, per a usar estructures de SDL_Mixer de forma opaca.
// Al final es un punter, així que és irrelevant el tipus del punter,
// però si amague que son estructures de SDL_Mixer, no fa falta ficar el include a SDL_mixer fora de este arxiu
struct sound
{
}; // Dummy structs
struct music
struct sound_cache_t
{
std::string name;
Mix_Chunk *chunk;
};
char *music_buffer = nullptr;
Mix_Music *music = nullptr;
std::vector<sound_cache_t> sounds;
std::string musica_actual = "";
// Inicialitza el sistema de só
void init()
{
int result = Mix_Init(MIX_INIT_OGG | MIX_INIT_WAVPACK);
// Al final he ficat la configuració automàtica i au. Si en el futur necesitem canviar-ho pos se canvia
result = Mix_OpenAudio(48000, AUDIO_S16, 2, 1024);
result = Mix_OpenAudio(48000, AUDIO_S16, 2, 512);
}
// Tanca el sistema de só (no shit, sherlock)
void quit()
{
for (auto sound : sounds) Mix_FreeChunk(sound.chunk);
sounds.clear();
Mix_CloseAudio();
}
// Carrega un arxiu de música en format OGG
const music *loadMusic(const std::string filename)
// Comença a reproduïr la música en questió
void playMusic(const std::string filename, const int loop)
{
int size;
if (!config::isMusicEnabled()) return;
// Si hi havia musica carregada, alliberem memòria
if (music_buffer) free(music_buffer);
if (music) Mix_FreeMusic(music);
int size;
music_buffer = file::getFileBuffer(filename, size);
auto rwops = SDL_RWFromMem(music_buffer, size);
auto mus = Mix_LoadMUS_RW(rwops, 1);
//free(buffer);
return (music *)mus;
}
// Comença a reproduïr la música en questió
void playMusic(const music *mus, const int loop)
{
//free(music_buffer); // [RZC 03/10/2024] Si allibere el buffer, no funciona la música. Porca miseria! Per aixó l'allibere abans de carregar si ja estava usat.
Mix_PlayMusic((Mix_Music *)mus, loop);
musica_actual = filename;
}
// Pausa la música que està sonant ara
@@ -59,6 +61,7 @@ namespace audio
// Continua la música pausada
void resumeMusic()
{
if (!config::isMusicEnabled()) return;
Mix_ResumeMusic();
}
@@ -66,6 +69,7 @@ namespace audio
void stopMusic()
{
Mix_HaltMusic();
musica_actual = "";
}
// Obté el estat actual de la música
@@ -85,50 +89,63 @@ namespace audio
}
}
// Allibera una música
void deleteMusic(music *mus)
// Obté el nom de la música actual
const std::string getCurrentMusic()
{
Mix_FreeMusic((Mix_Music *)mus);
return musica_actual;
}
// Carrega un só des d'un arxiu WAV
sound *loadSound(const std::string filename)
void loadSound(const std::string filename)
{
int size;
char *buffer = file::getFileBuffer(filename, size);
return (sound *)Mix_LoadWAV_RW(SDL_RWFromMem(buffer, size), 1);
auto chunk = Mix_LoadWAV_RW(SDL_RWFromMem(buffer, size), 1);
if (!chunk) printf("ERROR: %s\n", SDL_GetError());
sound_cache_t sound = { filename, chunk };
sounds.push_back(sound);
}
// Comença a reproduïr el só especificat
const int playSound(sound *snd, const int loop)
const int playSound(const std::string name, const int priority, const int loop)
{
return Mix_PlayChannel(-1, (Mix_Chunk *)snd, loop);
}
// Allibera un só
void deleteSound(sound *snd)
{
Mix_FreeChunk((Mix_Chunk *)snd);
if (priority < config::getSoundMode()) return -1;
for (auto sound : sounds)
{
if (sound.name == name) return Mix_PlayChannel(-1, sound.chunk, loop);
}
return -1;
}
// Pausa un canal en el que s'estava reproduïnt un só
void pauseChannel(const int channel)
{
if (channel == -1) return;
Mix_Pause(channel);
}
// Continua un canal pausat
void resumeChannel(const int channel)
{
if (channel == -1) return;
Mix_Resume(channel);
}
// Para un canal que estava reproduïnt un só
void stopChannel(const int channel)
{
if (channel == -1) return;
Mix_HaltChannel(channel);
}
// Para tots els canals
void stopAllChannel()
{
Mix_HaltChannel(-1);
}
// Obté l'estat d'un canal
const channel_state getChannelState(const int channel)
{