- [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
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+15 -8
View File
@@ -30,8 +30,8 @@ namespace actor
int current_tag = 0; int current_tag = 0;
bool floating_editing = false; bool floating_editing = false;
audio::sound *walk = nullptr;
int walk_channel = -1; int walk_channel = -1;
int falling_sound = -1;
void resetTag() void resetTag()
{ {
@@ -811,6 +811,8 @@ namespace actor
actor::actor_t *future_below = any_below_me(act); actor::actor_t *future_below = any_below_me(act);
if ((input::keyDown(SDL_SCANCODE_SPACE) || input::keyDown(config::getKey(KEY_JUMP))) && (hero::getSkills() & SKILL_SHOES) && (act->pos.y + act->size.y) <= max.y && act->pos.y >= min.y && (act->pos.x + act->size.x) <= max.x && act->pos.x >= min.x && act->react_mask == 0 && ((act->pos.z == 0 && room::getFloor() != 11) || (act->below || future_below))) if ((input::keyDown(SDL_SCANCODE_SPACE) || input::keyDown(config::getKey(KEY_JUMP))) && (hero::getSkills() & SKILL_SHOES) && (act->pos.y + act->size.y) <= max.y && act->pos.y >= min.y && (act->pos.x + act->size.x) <= max.x && act->pos.x >= min.x && act->react_mask == 0 && ((act->pos.z == 0 && room::getFloor() != 11) || (act->below || future_below)))
{ {
audio::pauseChannel(walk_channel);
audio::playSound("snd_jump.wav", SOUND_ALL);
// [RZC 01/10/2024] Hack per a que al aterrar sobre els que desapareixen puga botar sobre ells, i a més ells desapareguen // [RZC 01/10/2024] Hack per a que al aterrar sobre els que desapareixen puga botar sobre ells, i a més ells desapareguen
if (!act->below && future_below && future_below->flags & FLAG_DISAPPEAR) if (!act->below && future_below && future_below->flags & FLAG_DISAPPEAR)
actor::push(act, future_below, PUSH_ZN); actor::push(act, future_below, PUSH_ZN);
@@ -852,6 +854,9 @@ namespace actor
{ {
act->react_mask = 0; // desactivem la guarda (react_mask=0) act->react_mask = 0; // desactivem la guarda (react_mask=0)
act->flags |= FLAG_GRAVITY; // i reactivem el flag de gravetat act->flags |= FLAG_GRAVITY; // i reactivem el flag de gravetat
if (falling_sound!=-1) { audio::stopChannel(falling_sound); falling_sound = -1; }
falling_sound = audio::playSound("snd_fall.wav", SOUND_ALL, -1);
} }
} }
@@ -859,13 +864,12 @@ namespace actor
if (moving) if (moving)
{ {
act->flags |= FLAG_ANIMATED; act->flags |= FLAG_ANIMATED;
//if (audio::getChannelState(walk_channel) == audio::CHANNEL_PAUSED) audio::resumeChannel(walk_channel); if (act->react_mask==0 && !(act->flags&FLAG_GRAVITY)) audio::resumeChannel(walk_channel);
if ( (config::getSoundMode()==SOUND_ALL) && (act->anim_frame==0)) walk_channel = audio::playSound(walk, 0);
} }
else else
{ {
act->flags &= uint8_t(~FLAG_ANIMATED); act->flags &= uint8_t(~FLAG_ANIMATED);
//if (audio::getChannelState(walk_channel) == audio::CHANNEL_PLAYING) audio::pauseChannel(walk_channel); audio::pauseChannel(walk_channel);
} }
} }
@@ -1252,6 +1256,8 @@ namespace actor
// Si estic sobre el piso, no faig res // Si estic sobre el piso, no faig res
if (act->pos.z == 0) if (act->pos.z == 0)
{ {
if (act->flags&FLAG_HERO && falling_sound!=-1) { audio::stopChannel(falling_sound); falling_sound = -1; }
if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z)) if ((act->flags & FLAG_MOVING) && (act->movement == MOV_Z))
changeMoving(act); changeMoving(act);
act->push &= ~PUSH_ZN; act->push &= ~PUSH_ZN;
@@ -1292,6 +1298,7 @@ namespace actor
// Si sí que hi ha... // Si sí que hi ha...
if (below) if (below)
{ {
if (act->flags&FLAG_HERO && falling_sound!=-1) { audio::stopChannel(falling_sound); falling_sound = -1; }
// ...el asociem... // ...el asociem...
act->below = below; act->below = below;
below->above = act; below->above = act;
@@ -1889,10 +1896,10 @@ namespace actor
for (int i = 0; i < 100; ++i) for (int i = 0; i < 100; ++i)
boosters_collected[i] = false; boosters_collected[i] = false;
brilli = draw::getSurface("objectes.gif"); brilli = draw::getSurface("objectes.gif");
if ( (config::getSoundMode()==SOUND_ALL) ) {
if (config::getSoundMode()==SOUND_ALL) walk = audio::loadSound("walk.wav"); walk_channel = audio::playSound("snd_walk.wav", SOUND_ALL, -1);
//walk_channel = audio::playSound(walk, -1); audio::pauseChannel(walk_channel);
//audio::pauseChannel(walk_channel); }
} }
else else
{ {
+1
View File
@@ -5,6 +5,7 @@ namespace config
#define SOUND_ALL 0 #define SOUND_ALL 0
#define SOUND_BASIC 1 #define SOUND_BASIC 1
#define SOUND_NONE 2 #define SOUND_NONE 2
#define SOUND_MUSIC 2
#define KEY_UP 0 #define KEY_UP 0
#define KEY_DOWN 1 #define KEY_DOWN 1
+48 -31
View File
@@ -3,51 +3,53 @@
#include <SDL2/SDL_mixer.h> #include <SDL2/SDL_mixer.h>
#include <stdio.h> #include <stdio.h>
#include "jfile.h" #include "jfile.h"
#include <vector>
#include "config.h"
namespace audio namespace audio
{ {
// Açò son estructures de mentires, per a usar estructures de SDL_Mixer de forma opaca. struct sound_cache_t
// 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
{ {
std::string name;
Mix_Chunk *chunk;
}; };
char *music_buffer = nullptr; char *music_buffer = nullptr;
Mix_Music *music = nullptr;
std::vector<sound_cache_t> sounds;
std::string musica_actual = "";
// Inicialitza el sistema de só // Inicialitza el sistema de só
void init() void init()
{ {
int result = Mix_Init(MIX_INIT_OGG | MIX_INIT_WAVPACK); 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 // 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) // Tanca el sistema de só (no shit, sherlock)
void quit() void quit()
{ {
for (auto sound : sounds) Mix_FreeChunk(sound.chunk);
sounds.clear();
Mix_CloseAudio(); Mix_CloseAudio();
} }
// Carrega un arxiu de música en format OGG // Comença a reproduïr la música en questió
const music *loadMusic(const std::string filename) 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_buffer) free(music_buffer);
if (music) Mix_FreeMusic(music);
int size;
music_buffer = file::getFileBuffer(filename, size); music_buffer = file::getFileBuffer(filename, size);
auto rwops = SDL_RWFromMem(music_buffer, size); auto rwops = SDL_RWFromMem(music_buffer, size);
auto mus = Mix_LoadMUS_RW(rwops, 1); auto mus = Mix_LoadMUS_RW(rwops, 1);
//free(buffer); //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.
return (music *)mus;
}
// Comença a reproduïr la música en questió
void playMusic(const music *mus, const int loop)
{
Mix_PlayMusic((Mix_Music *)mus, loop); Mix_PlayMusic((Mix_Music *)mus, loop);
musica_actual = filename;
} }
// Pausa la música que està sonant ara // Pausa la música que està sonant ara
@@ -59,6 +61,7 @@ namespace audio
// Continua la música pausada // Continua la música pausada
void resumeMusic() void resumeMusic()
{ {
if (!config::isMusicEnabled()) return;
Mix_ResumeMusic(); Mix_ResumeMusic();
} }
@@ -66,6 +69,7 @@ namespace audio
void stopMusic() void stopMusic()
{ {
Mix_HaltMusic(); Mix_HaltMusic();
musica_actual = "";
} }
// Obté el estat actual de la música // Obté el estat actual de la música
@@ -85,50 +89,63 @@ namespace audio
} }
} }
// Allibera una música // Obté el nom de la música actual
void deleteMusic(music *mus) const std::string getCurrentMusic()
{ {
Mix_FreeMusic((Mix_Music *)mus); return musica_actual;
} }
// Carrega un só des d'un arxiu WAV // Carrega un só des d'un arxiu WAV
sound *loadSound(const std::string filename) void loadSound(const std::string filename)
{ {
int size; int size;
char *buffer = file::getFileBuffer(filename, 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 // 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); if (priority < config::getSoundMode()) return -1;
} for (auto sound : sounds)
{
// Allibera un só if (sound.name == name) return Mix_PlayChannel(-1, sound.chunk, loop);
void deleteSound(sound *snd) }
{ return -1;
Mix_FreeChunk((Mix_Chunk *)snd);
} }
// Pausa un canal en el que s'estava reproduïnt un só // Pausa un canal en el que s'estava reproduïnt un só
void pauseChannel(const int channel) void pauseChannel(const int channel)
{ {
if (channel == -1) return;
Mix_Pause(channel); Mix_Pause(channel);
} }
// Continua un canal pausat // Continua un canal pausat
void resumeChannel(const int channel) void resumeChannel(const int channel)
{ {
if (channel == -1) return;
Mix_Resume(channel); Mix_Resume(channel);
} }
// Para un canal que estava reproduïnt un só // Para un canal que estava reproduïnt un só
void stopChannel(const int channel) void stopChannel(const int channel)
{ {
if (channel == -1) return;
Mix_HaltChannel(channel); Mix_HaltChannel(channel);
} }
// Para tots els canals
void stopAllChannel()
{
Mix_HaltChannel(-1);
}
// Obté l'estat d'un canal // Obté l'estat d'un canal
const channel_state getChannelState(const int channel) const channel_state getChannelState(const int channel)
{ {
+11 -22
View File
@@ -21,25 +21,16 @@ namespace audio
MUSIC_STOPPED MUSIC_STOPPED
}; };
// Estructures per a gestionar música i só
struct sound;
struct music;
/// @brief Inicialitza el sistema de só /// @brief Inicialitza el sistema de só
void init(); void init();
/// @brief Tanca el sistema de só /// @brief Tanca el sistema de só
void quit(); void quit();
/// @brief Carrega un arxiu de música en format OGG /// @brief Comença a reproduïr la música des d'un arxiu
/// @param filename nom de l'arxiu /// @param filename nom de l'arxiu
/// @return punter a la música
const music *loadMusic(const std::string filename);
/// @brief Comença a reproduïr la música en questió
/// @param mus punter a la música
/// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...) /// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
void playMusic(const music *mus, const int loop = -1); void playMusic(const std::string filename, const int loop = -1);
/// @brief Pausa la música que està sonant ara /// @brief Pausa la música que està sonant ara
void pauseMusic(); void pauseMusic();
@@ -54,20 +45,19 @@ namespace audio
/// @return estat actual de la música (MUSIC_INVALID, MUSIC_PLAYING, MUSIC_PAUSED o MUSIC_STOPPED) /// @return estat actual de la música (MUSIC_INVALID, MUSIC_PLAYING, MUSIC_PAUSED o MUSIC_STOPPED)
const music_state getMusicState(); const music_state getMusicState();
/// @brief Allibera una música /// @brief Obté el nom de la música actual
/// @param mus punter a la música a alliberar /// @return nom de la cançò
void deleteMusic(music *mus); const std::string getCurrentMusic();
/// @brief Carrega un só des d'un arxiu WAV /// @brief Precarrega un só des d'un arxiu WAV
/// @param filename nom de l'arxiu /// @param filename nom de l'arxiu
/// @return un punter al só void loadSound(const std::string filename);
sound *loadSound(const std::string filename);
/// @brief Comença a reproduïr el só especificat /// @brief Comença a reproduïr el só especificat
/// @param snd punter al só a reproduïr /// @param snd punter al só a reproduïr
/// @param loop si es fa bucle (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...) /// @param loop si es fa bucle (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...)
/// @return número del canal en que està sonant el só /// @return número del canal en que està sonant el só
const int playSound(sound *snd, const int loop = 0); const int playSound(const std::string name, const int priority, const int loop = 0);
/// @brief Pausa un canal en el que s'estava reproduïnt un só /// @brief Pausa un canal en el que s'estava reproduïnt un só
/// @param channel número del canal a pausar /// @param channel número del canal a pausar
@@ -81,15 +71,14 @@ namespace audio
/// @param channel número del canal a parar /// @param channel número del canal a parar
void stopChannel(const int channel); void stopChannel(const int channel);
/// @brief Para tots els canals
void stopAllChannel();
/// @brief Obté l'estat d'un canal /// @brief Obté l'estat d'un canal
/// @param channel canal del que es vol obtindre l'estat /// @param channel canal del que es vol obtindre l'estat
/// @return estat del canal (CHANNEL_INVALID, CHANNEL_FREE, CHANNEL_PLAYING o CHANNEL_PAUSED) /// @return estat del canal (CHANNEL_INVALID, CHANNEL_FREE, CHANNEL_PLAYING o CHANNEL_PAUSED)
const channel_state getChannelState(const int channel); const channel_state getChannelState(const int channel);
/// @brief Allibera un só
/// @param snd punter al só
void deleteSound(sound *snd);
/// @brief Estableix el volum general /// @brief Estableix el volum general
/// @param volume valor a establir com a volum (128 màxim) /// @param volume valor a establir com a volum (128 màxim)
/// @return el volum anterior /// @return el volum anterior
+1 -1
View File
@@ -34,9 +34,9 @@ int main(int argc, char *argv[])
game::param_count = argc; game::param_count = argc;
game::params = argv; game::params = argv;
game::init();
input::init(); input::init();
audio::init(); audio::init();
game::init();
static unsigned int current_ticks = SDL_GetTicks(); static unsigned int current_ticks = SDL_GetTicks();
+2
View File
@@ -2,6 +2,7 @@
#include "jgame.h" #include "jgame.h"
#include "jinput.h" #include "jinput.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include "actor.h" #include "actor.h"
#include "room.h" #include "room.h"
#include "config.h" #include "config.h"
@@ -15,6 +16,7 @@ namespace modules
void init() void init()
{ {
audio::playMusic("mus_gameover.ogg");
if (gat == nullptr) gat = actor::createFromTemplate("GAT-NEGRE"); if (gat == nullptr) gat = actor::createFromTemplate("GAT-NEGRE");
} }
+1 -5
View File
@@ -42,11 +42,7 @@ namespace modules
} }
fclose(f); fclose(f);
} else { } else {
if (config::isMusicEnabled()) audio::playMusic("ingame.ogg");
{
auto musica = audio::loadMusic("ingame.ogg");
audio::playMusic(musica);
}
} }
actor::hero::init(); actor::hero::init();
+3
View File
@@ -2,6 +2,7 @@
#include "jgame.h" #include "jgame.h"
#include "jinput.h" #include "jinput.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include "actor.h" #include "actor.h"
#include "room.h" #include "room.h"
#include "config.h" #include "config.h"
@@ -16,6 +17,8 @@ namespace modules
void init() void init()
{ {
audio::playMusic("mus_gameover.ogg");
if (heroi == nullptr) heroi = actor::create("HERO", {16,32,8}, {6,6,12}, "test.gif", {0,32,20,32}, {-6,38}); if (heroi == nullptr) heroi = actor::create("HERO", {16,32,8}, {6,6,12}, "test.gif", {0,32,20,32}, {-6,38});
heroi->flags = FLAG_ANIMATED; heroi->flags = FLAG_ANIMATED;
+3
View File
@@ -1,6 +1,7 @@
#include "m_logo.h" #include "m_logo.h"
#include "jdraw.h" #include "jdraw.h"
#include "jinput.h" #include "jinput.h"
#include "jaudio.h"
#include "config.h" #include "config.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
@@ -49,6 +50,8 @@ namespace modules
} }
num_pixels++; num_pixels++;
} }
audio::playMusic("mus_logo.ogg");
} }
int steps=0; int steps=0;
+1 -4
View File
@@ -17,10 +17,7 @@ namespace modules
void init() void init()
{ {
if (config::isMusicEnabled()) if (audio::getCurrentMusic() != "mus_menu.ogg") audio::playMusic("mus_menu.ogg");
{
audio::stopMusic();
}
selected_option = OPTION_JUGAR; selected_option = OPTION_JUGAR;
::game::setUpdateTicks(64); ::game::setUpdateTicks(64);
draw::loadPalette("test.gif"); draw::loadPalette("test.gif");
+15 -3
View File
@@ -2,6 +2,7 @@
#include "jgame.h" #include "jgame.h"
#include "jinput.h" #include "jinput.h"
#include "jdraw.h" #include "jdraw.h"
#include "jaudio.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "config.h" #include "config.h"
@@ -22,16 +23,27 @@ namespace modules
return MENU_AUDIO_TORNAR; return MENU_AUDIO_TORNAR;
} }
if (input::keyPressed(SDL_SCANCODE_DOWN) || input::keyPressed(config::getKey(KEY_DOWN))) if (input::keyPressed(SDL_SCANCODE_DOWN) || input::keyPressed(config::getKey(KEY_DOWN)))
{
selected_option = (selected_option==2)?0:selected_option+1; selected_option = (selected_option==2)?0:selected_option+1;
audio::playSound("snd_push.wav", SOUND_BASIC);
}
if (input::keyPressed(SDL_SCANCODE_UP) || input::keyPressed(config::getKey(KEY_UP))) if (input::keyPressed(SDL_SCANCODE_UP) || input::keyPressed(config::getKey(KEY_UP)))
{
selected_option = (selected_option==0)?2:selected_option-1; selected_option = (selected_option==0)?2:selected_option-1;
audio::playSound("snd_push.wav", SOUND_BASIC);
}
if (input::keyPressed(SDL_SCANCODE_SPACE) || input::keyPressed(SDL_SCANCODE_RETURN) || if (input::keyPressed(SDL_SCANCODE_SPACE) || input::keyPressed(SDL_SCANCODE_RETURN) ||
input::keyPressed(config::getKey(KEY_JUMP)) || input::keyPressed(config::getKey(KEY_PICK))) { input::keyPressed(config::getKey(KEY_JUMP)) || input::keyPressed(config::getKey(KEY_PICK))) {
if (selected_option==MENU_AUDIO_MUSICA) config::toggleMusic(); if (selected_option==MENU_AUDIO_MUSICA) {
config::toggleMusic();
if (config::isMusicEnabled())
audio::playMusic("mus_menu.ogg");
else
audio::stopMusic();
}
if (selected_option==MENU_AUDIO_SO) config::toggleSound(); if (selected_option==MENU_AUDIO_SO) config::toggleSound();
if (selected_option==MENU_AUDIO_TORNAR) return MENU_AUDIO_TORNAR; if (selected_option==MENU_AUDIO_TORNAR) return MENU_AUDIO_TORNAR;
audio::playSound("snd_push.wav", SOUND_BASIC);
} }
draw::cls(2); draw::cls(2);
+8
View File
@@ -2,6 +2,7 @@
#include "jdraw.h" #include "jdraw.h"
#include "jfile.h" #include "jfile.h"
#include "jinput.h" #include "jinput.h"
#include "jaudio.h"
#include "editor.h" #include "editor.h"
#include "console.h" #include "console.h"
#include <string.h> #include <string.h>
@@ -90,6 +91,13 @@ void game::init()
loadConfig(); loadConfig();
draw::init("The Pool", 320, 240, zoom, fullscreen); draw::init("The Pool", 320, 240, zoom, fullscreen);
console::init(); console::init();
audio::loadSound("snd_walk.wav");
audio::loadSound("snd_push.wav");
audio::loadSound("snd_pick.wav");
audio::loadSound("snd_jump.wav");
audio::loadSound("snd_disappear.wav");
audio::loadSound("snd_fall.wav");
} }
draw::loadPalette("test.gif"); draw::loadPalette("test.gif");