diff --git a/jail_audio.cpp b/jail_audio.cpp index 55ab056..be7031b 100644 --- a/jail_audio.cpp +++ b/jail_audio.cpp @@ -38,15 +38,34 @@ bool JA_musicEnabled = true; bool JA_soundEnabled = true; SDL_AudioDeviceID sdlAudioDevice = 0; +bool fading = false; +int fade_start_time; +int fade_duration; +int fade_initial_volume; + void audioCallback(void * userdata, uint8_t * stream, int len) { SDL_memset(stream, 0, len); if (current_music != NULL && current_music->state == JA_MUSIC_PLAYING) { + int volume = JA_musicVolume; + if (fading) { + int time = SDL_GetTicks(); + if (time > (fade_start_time+fade_duration)) { + fading = false; + current_music->pos = 0; + current_music->state = JA_MUSIC_STOPPED; + volume = 0; + } else { + const int time_passed = time - fade_start_time; + const float percent = (float)time_passed / (float)fade_duration; + volume = JA_musicVolume * (1.0 - percent); + } + } const int size = SDL_min(len, (current_music->samples-current_music->pos)*2); - SDL_MixAudioFormat(stream, (Uint8*)(current_music->output+current_music->pos), AUDIO_S16, size, JA_musicVolume); + SDL_MixAudioFormat(stream, (Uint8*)(current_music->output+current_music->pos), AUDIO_S16, size, volume); current_music->pos += size/2; if (size < len) { if (current_music->times != 0) { - SDL_MixAudioFormat(stream+size, (Uint8*)current_music->output, AUDIO_S16, len-size, JA_musicVolume); + SDL_MixAudioFormat(stream+size, (Uint8*)current_music->output, AUDIO_S16, len-size, volume); current_music->pos = (len-size)/2; if (current_music->times > 0) current_music->times--; } else { @@ -186,6 +205,17 @@ void JA_StopMusic() current_music->state = JA_MUSIC_STOPPED; } +void JA_FadeOutMusic(const int milliseconds) +{ + if (!JA_musicEnabled) return; + if (current_music == NULL || current_music->state == JA_MUSIC_INVALID) return; + + fading = true; + fade_start_time = SDL_GetTicks(); + fade_duration = milliseconds; + fade_initial_volume = JA_musicVolume; +} + JA_Music_state JA_GetMusicState() { if (!JA_musicEnabled) return JA_MUSIC_DISABLED; diff --git a/jail_audio.h b/jail_audio.h index c04b6a9..d4d8772 100644 --- a/jail_audio.h +++ b/jail_audio.h @@ -16,6 +16,7 @@ void JA_PlayMusic(JA_Music_t *music, const int loop = -1); void JA_PauseMusic(); void JA_ResumeMusic(); void JA_StopMusic(); +void JA_FadeOutMusic(const int milliseconds); JA_Music_state JA_GetMusicState(); void JA_DeleteMusic(JA_Music_t *music); int JA_SetMusicVolume(int volume); diff --git a/main.cpp b/main.cpp index 8c37c1a..abf71cd 100644 --- a/main.cpp +++ b/main.cpp @@ -12,8 +12,8 @@ int main(int argc, char **argv) { sdlWindow = SDL_CreateWindow("JailAudio", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 240, SDL_WINDOW_SHOWN); JA_Init(48000, AUDIO_S16, 2); - JA_Music music = JA_LoadMusic("intro2.ogg"); - JA_Sound peiv = JA_LoadSound("menu_select.wav"); + JA_Music_t *music = JA_LoadMusic("intro2.ogg"); + JA_Sound_t *peiv = JA_LoadSound("menu_select.wav"); int channel = -1; JA_PlayMusic(music, true); @@ -42,6 +42,9 @@ int main(int argc, char **argv) { case SDL_SCANCODE_6: // Si pulsem la tecla '6' stopem definitivament el wav infinit JA_StopChannel(channel); break; + case SDL_SCANCODE_0: // Si pulsem la tecla '1' pausem o despausem la música + JA_FadeOutMusic(1000); + break; case SDL_SCANCODE_UP: volume = JA_SetVolume(volume+16); break;