Correct a bug in olcPGEX_MiniAudio: GetCursorMilliseconds() was not returning properly. Added loop repeating start point capabilities to the audio engine and bgm config file. Release Build 10936.

mac-build
sigonasr2 4 months ago
parent 2667cc526e
commit a6b4caad02
  1. 56
      Adventures in Lestoria/Audio.cpp
  2. 4
      Adventures in Lestoria/Audio.h
  3. 2
      Adventures in Lestoria/Version.h
  4. 14
      Adventures in Lestoria/assets/config/audio/bgm.txt
  5. 4
      Adventures in Lestoria/olcPGEX_MiniAudio.h
  6. BIN
      x64/Release/Adventures in Lestoria.exe

@ -83,6 +83,9 @@ void Audio::Initialize(){
bgm.SetFadeTime(defaultFadeTime); bgm.SetFadeTime(defaultFadeTime);
} }
if(data.HasProperty("Loop Repeat Start Point")){
bgm.SetLoopStartTime(data["Loop Repeat Start Point"].GetReal());
}
if(data.HasProperty("Events")){ if(data.HasProperty("Events")){
for(auto&eventName:Self().events){ for(auto&eventName:Self().events){
@ -175,6 +178,7 @@ void Audio::BGM::Load(){
} }
Self().currentBGM=songFileName; Self().currentBGM=songFileName;
Self().currentLoopIndex=0; Self().currentLoopIndex=0;
Self().lastTimestamp=0.f;
BGM&newBgm=Self().bgm[songFileName]; BGM&newBgm=Self().bgm[songFileName];
if(newBgm.channels.size()>0)ERR(std::format("WARNING! The size of the channels list is greater than zero! Size: {}",newBgm.channels.size())); if(newBgm.channels.size()>0)ERR(std::format("WARNING! The size of the channels list is greater than zero! Size: {}",newBgm.channels.size()));
}else{ }else{
@ -323,26 +327,38 @@ void Audio::PlayBGM(const std::string_view sound,const bool loop){
} }
void Audio::Update(){ void Audio::Update(){
if(Self().fadeToTargetVolumeTime==0.f&&Self().playBGMWaitTime>0.f){ if(Self().BGMFullyLoaded()&&Self().BGMIsPlaying()){
Self().playBGMWaitTime=std::max(Self().playBGMWaitTime-game->GetElapsedTime(),0.f); Audio::BGM&track=Self().bgm[Self().GetTrackName()];
if(Self().playBGMWaitTime==0.f&&Self().immediatelyLoadAudio){ float currentTimestamp{Engine().GetCursorMilliseconds(track.GetChannelIDs()[0])/1000.f};
while(!Self().BGMFullyLoaded()){ if(Self().lastTimestamp>currentTimestamp){
UpdateLoop(); //We immediately load the file. In a loading screen setting we would defer UpdateLoop() such that we have extra time to update the screen, UpdateLoop() is divided into many parts of the music loading process. for(int trackID:track.GetChannelIDs()){
Engine().Seek(trackID,unsigned long long(track.GetLoopStartTime())*1000);
} }
currentTimestamp=Engine().GetCursorMilliseconds(track.GetChannelIDs()[0])/1000.f; //Update to new timestamp now that it's been shifted over.
}
Self().lastTimestamp=currentTimestamp;
}else{
if(Self().fadeToTargetVolumeTime==0.f&&Self().playBGMWaitTime>0.f){
Self().playBGMWaitTime=std::max(Self().playBGMWaitTime-game->GetElapsedTime(),0.f);
if(Self().playBGMWaitTime==0.f&&Self().immediatelyLoadAudio){
while(!Self().BGMFullyLoaded()){
UpdateLoop(); //We immediately load the file. In a loading screen setting we would defer UpdateLoop() such that we have extra time to update the screen, UpdateLoop() is divided into many parts of the music loading process.
}
//Start playing the tracks. //Start playing the tracks and setup a callback to repeat at looped time.
Audio::BGM&track=Self().bgm[Self().GetTrackName()]; Audio::BGM&track=Self().bgm[Self().GetTrackName()];
for(int trackID:track.GetChannelIDs()){ for(int trackID:track.GetChannelIDs()){
Engine().Play(trackID,true); Engine().Play(trackID,true);
}
} }
} }
} if(Self().fadeToTargetVolumeTime>0.f){
if(Self().fadeToTargetVolumeTime>0.f){ Self().fadeToTargetVolumeTime=std::max(0.f,Self().fadeToTargetVolumeTime-game->GetElapsedTime());
Self().fadeToTargetVolumeTime=std::max(0.f,Self().fadeToTargetVolumeTime-game->GetElapsedTime()); for(int counter=0;float&vol:Self().prevVolumes){
for(int counter=0;float&vol:Self().prevVolumes){ const BGM&currentBgm=Self().bgm[Self().currentBGM];
const BGM&currentBgm=Self().bgm[Self().currentBGM]; Engine().SetVolume(currentBgm.GetChannelIDs()[counter],util::lerp(Self().GetCalculatedBGMVolume(vol),Self().GetCalculatedBGMVolume(Self().targetVolumes[counter]),1-(Self().fadeToTargetVolumeTime/currentBgm.GetFadeTime())));
Engine().SetVolume(currentBgm.GetChannelIDs()[counter],util::lerp(Self().GetCalculatedBGMVolume(vol),Self().GetCalculatedBGMVolume(Self().targetVolumes[counter]),1-(Self().fadeToTargetVolumeTime/currentBgm.GetFadeTime()))); counter++;
counter++; }
} }
} }
} }
@ -355,6 +371,10 @@ const float&Audio::BGM::GetFadeTime()const{
return fadeTime; return fadeTime;
} }
const float&Audio::BGM::GetLoopStartTime()const{
return loopStartTime;
}
void Audio::SetBGMVolume(float vol){ void Audio::SetBGMVolume(float vol){
bgmVol=vol; bgmVol=vol;
UpdateBGMVolume(); UpdateBGMVolume();
@ -402,4 +422,8 @@ float Audio::GetMuteMult(){
int Audio::GetPrepareBGMLoopIterations(std::string_view sound){ int Audio::GetPrepareBGMLoopIterations(std::string_view sound){
BGM&newBgm=Self().bgm[std::string(sound)]; BGM&newBgm=Self().bgm[std::string(sound)];
return newBgm.GetChannels().size()*2+2; //The channels list gets populated by calling newBgm.Load(), which then provides the list of channels that need to be loaded and played. This is why we multiply by 2. Each of the loading phases also consist of an initialization phase, so we add 2 as well. return newBgm.GetChannels().size()*2+2; //The channels list gets populated by calling newBgm.Load(), which then provides the list of channels that need to be loaded and played. This is why we multiply by 2. Each of the loading phases also consist of an initialization phase, so we add 2 as well.
}
void Audio::BGM::SetLoopStartTime(const float loopStartTime){
this->loopStartTime=loopStartTime;
} }

@ -118,12 +118,15 @@ private:
const ChannelID&GetChannelID(const int index); const ChannelID&GetChannelID(const int index);
const ChannelIDList&GetChannelIDs()const; const ChannelIDList&GetChannelIDs()const;
const float&GetFadeTime()const; const float&GetFadeTime()const;
const float&GetLoopStartTime()const;
void SetLoopStartTime(const float loopStartTime);
private: private:
std::string songName; //Name of the track. std::string songName; //Name of the track.
std::string songFileName; //Name of the key in bgm. std::string songFileName; //Name of the key in bgm.
ChannelIDList channels; ChannelIDList channels;
std::vector<ChannelName>channelNames; std::vector<ChannelName>channelNames;
EventData eventVolumes; EventData eventVolumes;
float loopStartTime{0.f};
float fadeTime="BGM.Default Fade Time"_F; float fadeTime="BGM.Default Fade Time"_F;
void Unload(); void Unload();
}; };
@ -141,6 +144,7 @@ private:
float playBGMWaitTime=0.0f; float playBGMWaitTime=0.0f;
BGMPlayParams playParams; BGMPlayParams playParams;
static bool muted; static bool muted;
float lastTimestamp{0.f};
}; };
std::string operator""_SFX(const char*key,size_t length); std::string operator""_SFX(const char*key,size_t length);

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 3 #define VERSION_PATCH 3
#define VERSION_BUILD 10918 #define VERSION_BUILD 10936
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

@ -12,6 +12,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 70% Default Volume = 70%
@ -28,6 +30,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 70% Default Volume = 70%
@ -44,6 +48,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 70% Default Volume = 70%
@ -65,6 +71,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 0%,0%,0%,0%,50%,0% Default Volume = 0%,0%,0%,0%,50%,0%
@ -91,6 +99,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 0%,60%,0%,0%,0%,0%,0%,0%,60%,60% Default Volume = 0%,60%,0%,0%,0%,0%,0%,0%,60%,60%
@ -112,6 +122,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 20%,50%,20%,70% Default Volume = 20%,50%,20%,70%
@ -128,6 +140,8 @@ BGM
# Transition time between one phase to the next. # Transition time between one phase to the next.
Fade Time = 2.0 Fade Time = 2.0
Loop Repeat Start Point = 0.0s
Events Events
{ {
Default Volume = 70% Default Volume = 70%

@ -432,9 +432,9 @@ namespace olc
{ {
unsigned long long cursor; unsigned long long cursor;
ma_sound_get_cursor_in_pcm_frames(vecSounds.at(id), &cursor); ma_sound_get_cursor_in_pcm_frames(vecSounds.at(id), &cursor);
cursor *= 1000;
cursor /= sampleRate; cursor /= sampleRate;
cursor /= 1000;
return cursor; return cursor;
} }

Loading…
Cancel
Save