mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2025-01-08 18:09:45 +01:00
Fix resumemusic/musicfadein not working
It seems like they were unfinished. This commit makes them properly work. When a track is stopped with stopmusic() or musicfadeout(), resumemusic() will resume from where the track stopped. musicfadein() does the same but does it with a gradual fade instead of suddenly playing it at full volume. I changed several interfaces around for this. First, setting currentsong to -1 when music is stopped is handled in the hook callback that gets called by SDL_mixer whenever the music stops. Otherwise, it'd be problematic if currentsong was set to -1 when the song starts fading out instead of when the song actually ends. Also, music.play() has a few optional arguments now, to reduce the copying-and-pasting of music code. Lastly, we have to roll our own tracker of music length by using SDL_GetPerformanceCounter(), because there's no way to get the music position if a song fades out. (We could implicitly keep the music position if we abruptly stopped the song using Mix_PauseMusic(), and resume it using Mix_ResumeMusic(), but ignoring the fact that those two functions are also used on the unfocus-pause (which, as it turns out, is basically a non-issue because the unfocus-pause can use some other functions), there's no equivalent for fading out, i.e. there's no "fade out and pause when it fully fades out" function in SDL_mixer.) And then we have to account for the unfocus-pause in our manual tracker. Other than that, these commands are now fully functional.
This commit is contained in:
parent
2662cd4d06
commit
facb079b35
5 changed files with 56 additions and 11 deletions
|
@ -1,5 +1,6 @@
|
||||||
#include "KeyPoll.h"
|
#include "KeyPoll.h"
|
||||||
#include "Graphics.h"
|
#include "Graphics.h"
|
||||||
|
#include "Music.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <utf8/unchecked.h>
|
#include <utf8/unchecked.h>
|
||||||
|
@ -54,6 +55,8 @@ KeyPoll::KeyPoll()
|
||||||
}
|
}
|
||||||
|
|
||||||
linealreadyemptykludge = false;
|
linealreadyemptykludge = false;
|
||||||
|
|
||||||
|
pauseStart = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyPoll::enabletextentry()
|
void KeyPoll::enabletextentry()
|
||||||
|
@ -254,6 +257,11 @@ void KeyPoll::Poll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SDL_DisableScreenSaver();
|
SDL_DisableScreenSaver();
|
||||||
|
if (Mix_PlayingMusic())
|
||||||
|
{
|
||||||
|
// Correct songStart for how long we were paused
|
||||||
|
music.songStart += SDL_GetPerformanceCounter() - pauseStart;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||||
isActive = false;
|
isActive = false;
|
||||||
|
@ -267,6 +275,7 @@ void KeyPoll::Poll()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
SDL_EnableScreenSaver();
|
SDL_EnableScreenSaver();
|
||||||
|
pauseStart = SDL_GetPerformanceCounter();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Mouse Focus */
|
/* Mouse Focus */
|
||||||
|
|
|
@ -76,6 +76,8 @@ public:
|
||||||
|
|
||||||
bool linealreadyemptykludge;
|
bool linealreadyemptykludge;
|
||||||
|
|
||||||
|
Uint64 pauseStart;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<SDL_JoystickID, SDL_GameController*> controllers;
|
std::map<SDL_JoystickID, SDL_GameController*> controllers;
|
||||||
std::map<SDL_GameControllerButton, bool> buttonmap;
|
std::map<SDL_GameControllerButton, bool> buttonmap;
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include "BinaryBlob.h"
|
#include "BinaryBlob.h"
|
||||||
#include "Map.h"
|
#include "Map.h"
|
||||||
|
|
||||||
|
void songend();
|
||||||
|
|
||||||
void musicclass::init()
|
void musicclass::init()
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < soundTracks.size(); ++i) {
|
for (size_t i = 0; i < soundTracks.size(); ++i) {
|
||||||
|
@ -227,9 +229,20 @@ void musicclass::init()
|
||||||
volume = 0.0f;
|
volume = 0.0f;
|
||||||
fadeoutqueuesong = -1;
|
fadeoutqueuesong = -1;
|
||||||
dontquickfade = false;
|
dontquickfade = false;
|
||||||
|
|
||||||
|
songStart = 0;
|
||||||
|
songEnd = 0;
|
||||||
|
|
||||||
|
Mix_HookMusicFinished(&songend);
|
||||||
}
|
}
|
||||||
|
|
||||||
void musicclass::play(int t)
|
void songend()
|
||||||
|
{
|
||||||
|
music.songEnd = SDL_GetPerformanceCounter();
|
||||||
|
music.currentsong = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void musicclass::play(int t, const double position_sec /*= 0.0*/, const int fadein_ms /*= 3000*/)
|
||||||
{
|
{
|
||||||
t = (t % 16);
|
t = (t % 16);
|
||||||
|
|
||||||
|
@ -250,9 +263,9 @@ void musicclass::play(int t)
|
||||||
if (currentsong == 0 || currentsong == 7 || (!map.custommode && (currentsong == 16 || currentsong == 23)))
|
if (currentsong == 0 || currentsong == 7 || (!map.custommode && (currentsong == 16 || currentsong == 23)))
|
||||||
{
|
{
|
||||||
// Level Complete theme, no fade in or repeat
|
// Level Complete theme, no fade in or repeat
|
||||||
if(Mix_FadeInMusic(musicTracks[t].m_music, 0, 0)==-1)
|
if(Mix_FadeInMusicPos(musicTracks[t].m_music, 0, 0, position_sec)==-1)
|
||||||
{
|
{
|
||||||
printf("Mix_PlayMusic: %s\n", Mix_GetError());
|
printf("Mix_FadeInMusicPos: %s\n", Mix_GetError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -266,11 +279,13 @@ void musicclass::play(int t)
|
||||||
else
|
else
|
||||||
dontquickfade = false;
|
dontquickfade = false;
|
||||||
}
|
}
|
||||||
else if(Mix_FadeInMusic(musicTracks[t].m_music, -1, 3000)==-1)
|
else if(Mix_FadeInMusicPos(musicTracks[t].m_music, -1, fadein_ms, position_sec)==-1)
|
||||||
{
|
{
|
||||||
printf("Mix_FadeInMusic: %s\n", Mix_GetError());
|
printf("Mix_FadeInMusicPos: %s\n", Mix_GetError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
songStart = SDL_GetPerformanceCounter();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -279,10 +294,25 @@ void musicclass::play(int t)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void musicclass::resume(const int fadein_ms /*= 0*/)
|
||||||
|
{
|
||||||
|
const double offset = static_cast<double>(songEnd - songStart);
|
||||||
|
const double frequency = static_cast<double>(SDL_GetPerformanceFrequency());
|
||||||
|
|
||||||
|
const double position_sec = offset / frequency;
|
||||||
|
|
||||||
|
play(resumesong, position_sec, fadein_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void musicclass::fadein()
|
||||||
|
{
|
||||||
|
resume(3000); // 3000 ms fadein
|
||||||
|
}
|
||||||
|
|
||||||
void musicclass::haltdasmusik()
|
void musicclass::haltdasmusik()
|
||||||
{
|
{
|
||||||
Mix_HaltMusic();
|
Mix_HaltMusic();
|
||||||
currentsong = -1;
|
resumesong = currentsong;
|
||||||
}
|
}
|
||||||
|
|
||||||
void musicclass::silencedasmusik()
|
void musicclass::silencedasmusik()
|
||||||
|
@ -300,7 +330,7 @@ void musicclass::fadeMusicVolumeIn(int ms)
|
||||||
void musicclass::fadeout()
|
void musicclass::fadeout()
|
||||||
{
|
{
|
||||||
Mix_FadeOutMusic(2000);
|
Mix_FadeOutMusic(2000);
|
||||||
currentsong = -1;
|
resumesong = currentsong;
|
||||||
}
|
}
|
||||||
|
|
||||||
void musicclass::processmusicfadein()
|
void musicclass::processmusicfadein()
|
||||||
|
|
|
@ -13,11 +13,13 @@ class musicclass
|
||||||
public:
|
public:
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
void play(int t);
|
void play(int t, const double position_sec = 0.0, const int fadein_ms = 3000);
|
||||||
|
void resume(const int fadein_ms = 0);
|
||||||
void haltdasmusik();
|
void haltdasmusik();
|
||||||
void silencedasmusik();
|
void silencedasmusik();
|
||||||
void fadeMusicVolumeIn(int ms);
|
void fadeMusicVolumeIn(int ms);
|
||||||
void fadeout();
|
void fadeout();
|
||||||
|
void fadein();
|
||||||
void processmusicfadein();
|
void processmusicfadein();
|
||||||
void processmusic();
|
void processmusic();
|
||||||
void niceplay(int t);
|
void niceplay(int t);
|
||||||
|
@ -53,6 +55,9 @@ public:
|
||||||
bool usingmmmmmm;
|
bool usingmmmmmm;
|
||||||
|
|
||||||
binaryBlob musicReadBlob;
|
binaryBlob musicReadBlob;
|
||||||
|
|
||||||
|
Uint64 songStart;
|
||||||
|
Uint64 songEnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern musicclass music;
|
extern musicclass music;
|
||||||
|
|
|
@ -260,7 +260,7 @@ void scriptclass::run()
|
||||||
}
|
}
|
||||||
if (words[0] == "resumemusic")
|
if (words[0] == "resumemusic")
|
||||||
{
|
{
|
||||||
music.play(music.resumesong);
|
music.resume();
|
||||||
}
|
}
|
||||||
if (words[0] == "musicfadeout")
|
if (words[0] == "musicfadeout")
|
||||||
{
|
{
|
||||||
|
@ -269,8 +269,7 @@ void scriptclass::run()
|
||||||
}
|
}
|
||||||
if (words[0] == "musicfadein")
|
if (words[0] == "musicfadein")
|
||||||
{
|
{
|
||||||
music.musicfadein = 90;
|
music.fadein();
|
||||||
//if(!game.muted) music.fadeMusicVolumeIn(3000);
|
|
||||||
}
|
}
|
||||||
if (words[0] == "trinketscriptmusic")
|
if (words[0] == "trinketscriptmusic")
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue