diff --git a/jail_audio.cpp b/jail_audio.cpp index fc23241..2bfbeed 100644 --- a/jail_audio.cpp +++ b/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 = NULL; void audioCallback(void * userdata, uint8_t * stream, int len) { SDL_memset(stream, 0, len); @@ -74,10 +75,17 @@ 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 != NULL) SDL_CloseAudioDevice(sdlAudioDevice); + sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0); SDL_PauseAudioDevice(sdlAudioDevice, 0); } +void JA_Quit() { + SDL_PauseAudioDevice(sdlAudioDevice, 1); + if (sdlAudioDevice != NULL) SDL_CloseAudioDevice(sdlAudioDevice); + sdlAudioDevice = NULL; +} + JA_Music JA_LoadMusic(const char* filename) { int chan, samplerate; JA_Music music = new JA_Music_t(); @@ -90,6 +98,7 @@ JA_Music JA_LoadMusic(const char* filename) { Uint8 *buffer = (Uint8*)malloc(fsize + 1); fread(buffer, fsize, 1, f); fclose(f); + 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 +106,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; diff --git a/jail_audio.h b/jail_audio.h index 2a2fc9f..7d03400 100644 --- a/jail_audio.h +++ b/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);