diff --git a/source/jaudio.cpp b/source/jaudio.cpp index 6921d1b..296a915 100644 --- a/source/jaudio.cpp +++ b/source/jaudio.cpp @@ -15,9 +15,11 @@ namespace audio }; //char *music_buffer = nullptr; - JA_Music_t *music = nullptr; + //JA_Music_t *music = nullptr; std::vector sounds; + std::vector songs; std::string musica_actual = ""; + int musica = -1; // Inicialitza el sistema de só void init() @@ -30,49 +32,71 @@ namespace audio // Tanca el sistema de só (no shit, sherlock) void quit() { - if (music) JA_DeleteMusic(music); + //if (music) JA_DeleteMusic(music); + for (auto sound : songs) JA_DeleteSound(sound.chunk); + songs.clear(); for (auto sound : sounds) JA_DeleteSound(sound.chunk); // Mix_FreeChunk(sound.chunk); sounds.clear(); JA_Quit(); // Mix_CloseAudio(); } + void loadMusic(const std::string filename) + { + int size; + char *buffer = file::getFileBuffer(filename, size); + auto chunk = JA_LoadSound((uint8_t *)buffer, size); + free(buffer); + + //auto chunk = Mix_LoadWAV_RW(SDL_RWFromMem(buffer, size), 1); + //if (!chunk) printf("ERROR: %s\n", SDL_GetError()); + sound_cache_t sound = { filename, chunk }; + songs.push_back(sound); + } + // Comença a reproduïr la música en questió void playMusic(const std::string filename, const int loop) { if (!config::isMusicEnabled()) return; // Si hi havia musica carregada, alliberem memòria - //if (music_buffer) free(music_buffer); - if (music) JA_DeleteMusic(music); //Mix_FreeMusic(music); + //if (music) JA_DeleteMusic(music); //Mix_FreeMusic(music); + stopMusic(); + //int size; + //char *buffer = file::getFileBuffer(filename, size); + //music = JA_LoadMusic((uint8_t*)buffer, size); + //free(buffer); + //JA_PlayMusic(music, loop); - int size; - char *buffer = file::getFileBuffer(filename, size); - music = JA_LoadMusic((uint8_t*)buffer, size); - free(buffer); - //auto rwops = SDL_RWFromMem(music_buffer, size); - //auto mus = Mix_LoadMUS_RW(rwops, 1); - //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); - JA_PlayMusic(music, loop); - musica_actual = filename; + for (auto song : songs) + { + if (song.name == filename) { + musica = JA_PlaySound(song.chunk, loop); + musica_actual = filename; + return; + } + } } // Pausa la música que està sonant ara void pauseMusic() { - JA_PauseMusic(); //Mix_PauseMusic(); + //JA_PauseMusic(); //Mix_PauseMusic(); + if (musica != -1) JA_PauseChannel(musica); } // Continua la música pausada void resumeMusic() { if (!config::isMusicEnabled()) return; - JA_ResumeMusic(); //Mix_ResumeMusic(); + //JA_ResumeMusic(); //Mix_ResumeMusic(); + if (musica != -1) JA_ResumeChannel(musica); } // Para la música que estava sonant void stopMusic() { - JA_StopMusic(); //Mix_HaltMusic(); + //JA_StopMusic(); //Mix_HaltMusic(); + if (musica != -1) JA_StopChannel(musica); + musica = -1; musica_actual = ""; } diff --git a/source/jaudio.h b/source/jaudio.h index 2c6ea01..48f2193 100644 --- a/source/jaudio.h +++ b/source/jaudio.h @@ -27,6 +27,8 @@ namespace audio /// @brief Tanca el sistema de só void quit(); + void loadMusic(const std::string filename); + /// @brief Comença a reproduïr la música des d'un arxiu /// @param filename nom de l'arxiu /// @param loop quants bucles farà (-1=infinit, 0=no repeteix, 1=repeteix 1 vegada...) diff --git a/source/main.cpp b/source/main.cpp index e491e92..2ace35c 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -112,6 +112,14 @@ void game::init() draw::init("The Pool", 320, 240, zoom, fullscreen); console::init(); + printf("Carregant mus_menu.ogg..."); + audio::loadMusic("mus_menu.ogg"); + printf("Carregant mus_ingame.ogg..."); + audio::loadMusic("mus_ingame.ogg"); + printf("Carregant mus_gameover.ogg..."); + audio::loadMusic("mus_gameover.ogg"); + + printf("Carregant arxius de só..."); audio::loadSound("snd_logo.wav"); audio::loadSound("snd_walk.wav"); audio::loadSound("snd_push.wav"); @@ -132,8 +140,11 @@ void game::init() current_module = M_GAME; modules::game::init(); - } else + } else { + //current_module = M_GAME; + //modules::game::init(); modules::logo::init(); + } } bool game::loop()