diff --git a/source/common/jail_audio.cpp b/source/common/jail_audio.cpp index fc23241..7ce9aec 100644 --- a/source/common/jail_audio.cpp +++ b/source/common/jail_audio.cpp @@ -32,6 +32,7 @@ int JA_freq {48000}; SDL_AudioFormat JA_format {AUDIO_S16}; Uint8 JA_channels {2}; int JA_volume = 128; +SDL_AudioDeviceID sdlAudioDevice = 0; void audioCallback(void * userdata, uint8_t * stream, int len) { SDL_memset(stream, 0, len); @@ -74,13 +75,19 @@ void JA_Init(const int freq, const SDL_AudioFormat format, const int channels) { JA_format = format; JA_channels = channels; SDL_AudioSpec audioSpec{JA_freq, JA_format, JA_channels, 0, 1024, 0, 0, audioCallback, NULL}; - SDL_AudioDeviceID sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0); + if (sdlAudioDevice != 0) SDL_CloseAudioDevice(sdlAudioDevice); + sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0); SDL_PauseAudioDevice(sdlAudioDevice, 0); } +void JA_Quit() { + SDL_PauseAudioDevice(sdlAudioDevice, 1); + if (sdlAudioDevice != 0) SDL_CloseAudioDevice(sdlAudioDevice); + sdlAudioDevice = 0; +} + JA_Music JA_LoadMusic(const char* filename) { int chan, samplerate; - JA_Music music = new JA_Music_t(); // [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid. FILE *f = fopen(filename, "rb"); @@ -88,8 +95,11 @@ JA_Music JA_LoadMusic(const char* filename) { long fsize = ftell(f); fseek(f, 0, SEEK_SET); Uint8 *buffer = (Uint8*)malloc(fsize + 1); - fread(buffer, fsize, 1, f); + if (fread(buffer, fsize, 1, f)!=1) return NULL; fclose(f); + + JA_Music music = new JA_Music_t(); + music->samples = stb_vorbis_decode_memory(buffer, fsize, &chan, &samplerate, &music->output); free(buffer); // [RZC 28/08/22] Abans el descomprimiem mentre el teniem obert @@ -97,13 +107,14 @@ JA_Music JA_LoadMusic(const char* filename) { SDL_AudioCVT cvt; SDL_BuildAudioCVT(&cvt, AUDIO_S16, chan, samplerate, JA_format, JA_channels, JA_freq); - cvt.len = music->samples * chan * 2; - cvt.buf = (Uint8 *) SDL_malloc(cvt.len * cvt.len_mult); - SDL_memcpy(cvt.buf, music->output, cvt.len); - SDL_ConvertAudio(&cvt); - free(music->output); - music->output = (short*)cvt.buf; - + if (cvt.needed) { + cvt.len = music->samples * chan * 2; + cvt.buf = (Uint8 *) SDL_malloc(cvt.len * cvt.len_mult); + SDL_memcpy(cvt.buf, music->output, cvt.len); + SDL_ConvertAudio(&cvt); + free(music->output); + music->output = (short*)cvt.buf; + } music->pos = 0; music->state = JA_MUSIC_STOPPED; @@ -144,7 +155,7 @@ JA_Music_state JA_GetMusicState() { void JA_DeleteMusic(JA_Music music) { if (current_music == music) current_music = NULL; - SDL_free(music->output); + free(music->output); delete music; } diff --git a/source/common/jail_audio.h b/source/common/jail_audio.h index 2a2fc9f..7d03400 100644 --- a/source/common/jail_audio.h +++ b/source/common/jail_audio.h @@ -8,6 +8,7 @@ typedef struct JA_Sound_t *JA_Sound; typedef struct JA_Music_t *JA_Music; void JA_Init(const int freq, const SDL_AudioFormat format, const int channels); +void JA_Quit(); JA_Music JA_LoadMusic(const char* filename); void JA_PlayMusic(JA_Music music, const int loop = -1);