From 8d1e044eda854e21425dfde5641633cf7209b788 Mon Sep 17 00:00:00 2001 From: ihatecompvir Date: Thu, 26 Sep 2024 17:42:08 -0700 Subject: [PATCH] Lots of MasterAudio, TrackData stuff --- src/system/beatmatch/MasterAudio.cpp | 308 +++++++++++++++++++-------- src/system/beatmatch/MasterAudio.h | 17 +- 2 files changed, 239 insertions(+), 86 deletions(-) diff --git a/src/system/beatmatch/MasterAudio.cpp b/src/system/beatmatch/MasterAudio.cpp index 3928ba2c..d0e3a819 100644 --- a/src/system/beatmatch/MasterAudio.cpp +++ b/src/system/beatmatch/MasterAudio.cpp @@ -8,13 +8,24 @@ namespace { int kMaxSlots = 8; } -MasterAudio::MasterAudio(DataArray* da, int num_players, BeatMaster* master, SongData* data) : mNumPlayers(num_players), mSongStream(0), mSongData(data), mStreamEnabled(0), - mMasterFader(Hmx::Object::New()), mForegroundFader(Hmx::Object::New()), mMultiplayerFader(Hmx::Object::New()), - mBackgroundFader(Hmx::Object::New()), mBackgroundAttenFader(Hmx::Object::New()), mCommonFader(Hmx::Object::New()), - mRemoteFader(Hmx::Object::New()), mPracticeFader(Hmx::Object::New()), mVocalDuckFader(Hmx::Object::New()), - mVocalCueFader(Hmx::Object::New()), mVocalFailFader(Hmx::Object::New()), mCrowdFader(Hmx::Object::New()), mBaseCrowdFader(Hmx::Object::New()), - mPlayingInCommon(0), mMuteVolume(-96.0f), mVocalMuteVolume(-96.0f), mUnplayedVolume(-96.0f), mCueVolume(-12.0f), mPracticeVolume(0), mRemoteVolume(0), mMuteMaster(0), mMuckWithPitch(1), - mPitchMucker(0), mWhammyEnabled(1), mTimeOffset(0) { +MasterAudio::MasterAudio( + DataArray *da, int num_players, BeatMaster *master, SongData *data +) + : mNumPlayers(num_players), mSongStream(0), mSongData(data), mStreamEnabled(0), + mMasterFader(Hmx::Object::New()), + mForegroundFader(Hmx::Object::New()), + mMultiplayerFader(Hmx::Object::New()), + mBackgroundFader(Hmx::Object::New()), + mBackgroundAttenFader(Hmx::Object::New()), + mCommonFader(Hmx::Object::New()), mRemoteFader(Hmx::Object::New()), + mPracticeFader(Hmx::Object::New()), + mVocalDuckFader(Hmx::Object::New()), + mVocalCueFader(Hmx::Object::New()), + mVocalFailFader(Hmx::Object::New()), mCrowdFader(Hmx::Object::New()), + mBaseCrowdFader(Hmx::Object::New()), mPlayingInCommon(0), + mMuteVolume(-96.0f), mVocalMuteVolume(-96.0f), mUnplayedVolume(-96.0f), + mCueVolume(-12.0f), mPracticeVolume(0), mRemoteVolume(0), mMuteMaster(0), + mMuckWithPitch(1), mPitchMucker(0), mWhammyEnabled(1), mTimeOffset(0) { mMasterFader->SetName("MasterFader", ObjectDir::Main()); mForegroundFader->SetName("ForegroundFader", ObjectDir::Main()); mMultiplayerFader->SetName("MultiplayerFader", ObjectDir::Main()); @@ -37,16 +48,21 @@ MasterAudio::MasterAudio(DataArray* da, int num_players, BeatMaster* master, Son mMultiplayerCommonVolume = -da->FindFloat("multiplayer_common_attenuation"); mBackgroundVolume = -da->FindFloat("background_attenuation"); - if(DataVariable("no_background_atten").Int(0)) mBackgroundVolume = 0; + if (DataVariable("no_background_atten").Int(0)) + mBackgroundVolume = 0; float practice; - if(da->FindData("practice_attenuation", practice, false)) mPracticeVolume = -practice; + if (da->FindData("practice_attenuation", practice, false)) + mPracticeVolume = -practice; float unplayed; - if(da->FindData("unplayed_attenuation", unplayed, false)) mUnplayedVolume = -unplayed; + if (da->FindData("unplayed_attenuation", unplayed, false)) + mUnplayedVolume = -unplayed; float cue; - if(da->FindData("cue_attenuation", cue, false)) mCueVolume = -cue; + if (da->FindData("cue_attenuation", cue, false)) + mCueVolume = -cue; float remote; - if(da->FindData("remote_attenuation", remote, false)) mRemoteVolume = -remote; + if (da->FindData("remote_attenuation", remote, false)) + mRemoteVolume = -remote; da->FindData("mute_volume", mMuteVolume, false); mPassVolume = mMuteVolume; @@ -60,15 +76,19 @@ MasterAudio::MasterAudio(DataArray* da, int num_players, BeatMaster* master, Son mPitchMucker = new PitchMucker(); } -MasterAudio::~MasterAudio(){ - for(std::vector::iterator it = mChannelData.begin(); it != mChannelData.end(); it++){ +MasterAudio::~MasterAudio() { + for (std::vector::iterator it = mChannelData.begin(); + it != mChannelData.end(); + it++) { RELEASE(*it); } - for(std::vector::iterator it = mTrackData.mTrackData.begin(); it != mTrackData.mTrackData.end(); it++){ + for (std::vector::iterator it = mTrackData.mTrackData.begin(); + it != mTrackData.mTrackData.end(); + it++) { RELEASE(*it); } - if(mSongStream){ - for(int i = 0; i < 2; i++){ + if (mSongStream) { + for (int i = 0; i < 2; i++) { mSongStream->SetFX(i, false); } } @@ -91,7 +111,7 @@ MasterAudio::~MasterAudio(){ RELEASE(mPitchMucker); } -void MasterAudio::Load(SongInfo* info, PlayerTrackConfigList* player_track_config_list){ +void MasterAudio::Load(SongInfo *info, PlayerTrackConfigList *player_track_config_list) { MILO_ASSERT(mSongData, 0x186); MILO_ASSERT(player_track_config_list, 0x187); mSongStream = TheSynth->NewStream(info->GetBaseFileName(), 0, 0, false); @@ -106,54 +126,56 @@ void MasterAudio::Load(SongInfo* info, PlayerTrackConfigList* player_track_confi SetupChannels(info); SetupTracks(info, player_track_config_list); - if(player_track_config_list->UseVocalHarmony()){ + if (player_track_config_list->UseVocalHarmony()) { count = info->GetNumVocalParts(); } - for(int i = 1; i < count; i++){ + for (int i = 1; i < count; i++) { mTrackData.mTrackData.push_back(new TrackData()); } } -bool MasterAudio::IsLoaded(){ +bool MasterAudio::IsLoaded() { return mSongStream->IsReady(); } -void MasterAudio::SetupChannels(SongInfo* info){ +void MasterAudio::SetupChannels(SongInfo *info) { info->GetTracks(); - const std::vector& pans = info->GetPans(); - const std::vector& vols = info->GetVols(); - const std::vector& cores = info->GetCores(); - const std::vector& crowd_channels = info->GetCrowdChannels(); + const std::vector &pans = info->GetPans(); + const std::vector &vols = info->GetVols(); + const std::vector &cores = info->GetCores(); + const std::vector &crowd_channels = info->GetCrowdChannels(); MILO_ASSERT(pans.size() == vols.size(), 0x1BE); MILO_ASSERT(cores.size() == vols.size(), 0x1BF); - - int i9 = 0; - for(int i = 0; i < vols.size(); i++){ - if(!info->IsPlayTrackChannel(i)){ + int i9 = 0; + for (int i = 0; i < vols.size(); i++) { + if (!info->IsPlayTrackChannel(i)) { } float voltouse = vols[i]; - if(voltouse < -40.0f){ + if (voltouse < -40.0f) { i9++; - if(3 < i9) voltouse = -40.0f; + if (3 < i9) + voltouse = -40.0f; } - mChannelData.push_back(new ChannelData(mSongStream, i, voltouse, (float)pans[i], (FXCore)cores[i])); + mChannelData.push_back( + new ChannelData(mSongStream, i, voltouse, (float)pans[i], (FXCore)cores[i]) + ); } } -void MasterAudio::ResetTrack(int i, bool b){ +void MasterAudio::ResetTrack(int i, bool b) { ResetTrack(mSongData->GetAudioTrackNum(i), b); } -void MasterAudio::ResetTrack(AudioTrackNum num, bool b){ +void MasterAudio::ResetTrack(AudioTrackNum num, bool b) { std::list iList; mTrackData.mTrackData[num.mVal]->FillChannelList(iList); mTrackData.mTrackData[num.mVal]->Reset(); SetAutoOn(num, 0); - for(std::list::iterator it = iList.begin(); it != iList.end(); it++){ + for (std::list::iterator it = iList.begin(); it != iList.end(); it++) { int idx = *it; - FaderGroup* grp = mSongStream->ChannelFaders(idx); + FaderGroup *grp = mSongStream->ChannelFaders(idx); grp->Remove(mBackgroundAttenFader); grp->Remove(mBackgroundFader); grp->Remove(mCommonFader); @@ -165,51 +187,132 @@ void MasterAudio::ResetTrack(AudioTrackNum num, bool b){ bool b3 = false; bool b1 = mTrackData.mTrackData[num.mVal]->mVocals; - if(b1 && b) b3 = true; + if (b1 && b) + b3 = true; float f2 = b3 ? mCueVolume : 0; - if(b) SetupTrackChannel(idx, b1, f2, b3, false); - else SetupBackgroundChannel(idx, b1, f2, b3, false); + if (b) + SetupTrackChannel(idx, b1, f2, b3, false); + else + SetupBackgroundChannel(idx, b1, f2, b3, false); } } -void MasterAudio::ConfigureVocalFaders(int i, bool b){ - FaderGroup* grp = mSongStream->ChannelFaders(i); - if(b) grp->Add(mVocalDuckFader); - else grp->Add(mVocalFailFader); +void MasterAudio::ConfigureVocalFaders(int i, bool b) { + FaderGroup *grp = mSongStream->ChannelFaders(i); + if (b) + grp->Add(mVocalDuckFader); + else + grp->Add(mVocalFailFader); +} + +void MasterAudio::FadeOutDrums(int trackNum) { + // this is very close to being right not quite, can't figure out what is wrong + /* AudioTrackNum audioTrackNum = mSongData->GetAudioTrackNum(trackNum); + mTrackData.mTrackData[audioTrackNum.mVal]->mInFill = 1; + Symbol drum_fill = Symbol("drum_fill"); + SetTrackFader(audioTrackNum, -1, drum_fill, -96.0f, 1000.0f); + */ +} + +bool MasterAudio::Fail() { + if (mSongStream) + return mSongStream->Fail(); + else + return true; } -bool MasterAudio::Fail(){ - if(mSongStream) return mSongStream->Fail(); - else return true; +float MasterAudio::GetTime() const { + float time; + if (mSongStream != 0) { + time = mSongStream->GetTime(); + } else { + time = 0.0f; + } + return time + mTimeOffset; } -bool MasterAudio::IsReady(){ +bool MasterAudio::IsReady() { bool b = false; - if(mSongStream && mSongStream->IsReady()) b = true; + if (mSongStream && mSongStream->IsReady()) + b = true; mStreamEnabled = b; return b; } bool MasterAudio::IsFinished() const { bool b = false; - if(mSongStream && mSongStream->IsFinished()) b = true; + if (mSongStream && mSongStream->IsFinished()) + b = true; return b; } -void MasterAudio::Play(){ +void MasterAudio::SetBackgroundVolume(float volume) { + mBackgroundFader->SetVal(volume); +} + +void MasterAudio::SetForegroundVolume(float volume) { + mForegroundFader->SetVal(volume); +} + +void MasterAudio::SetMasterVolume(float volume) { + mMasterVolume = volume; + UpdateMasterFader(); +} + +void MasterAudio::SetMuckWithPitch(bool enabled) { + mMuckWithPitch = enabled; +} + +void MasterAudio::SetMuteMaster(bool muted) { + mMuteMaster = muted; + UpdateMasterFader(); +} + +void MasterAudio::SetPracticeMode(bool enabled) { + mPracticeFader->SetVal(enabled ? mPracticeVolume : 0.0f); +} + +void MasterAudio::SetStereo(bool b) { + for (int i = 0; i < mChannelData.size(); i++) { + mChannelData[i]->SetStereo(b); + } +} + +void MasterAudio::SetTimeOffset(float offset) { + mTimeOffset = offset; +} + +void MasterAudio::ToggleMuteMaster() { + bool b = mMuteMaster; + SetMuteMaster(!b); + return; +} + +void MasterAudio::UpdateMasterFader() { + float masterVolume; + if (mMuteMaster != 0) { + masterVolume = -96.0f; + } else { + masterVolume = mMasterVolume; + } + mMasterFader->SetVal(masterVolume); + return; +} + +void MasterAudio::Play() { MILO_ASSERT(mSongStream, 0x334); mSongStream->Play(); - for(int i = 0; i < mChannelData.size(); i++){ + for (int i = 0; i < mChannelData.size(); i++) { mChannelData[i]->ForceOn(); } } -void MasterAudio::Jump(float f){ +void MasterAudio::Jump(float f) { mSongStream->Stop(); mStreamEnabled = false; mSongStream->Resync(f); UnmuteAllTracks(); - for(int i = 0; i < mTrackData.mTrackData.size(); i++){ + for (int i = 0; i < mTrackData.mTrackData.size(); i++) { mTrackData.mTrackData[i]->Reset(); AudioTrackNum num; num.mVal = i; @@ -217,86 +320,123 @@ void MasterAudio::Jump(float f){ } } -ChannelData::ChannelData(Stream* stream, int chan, float vol, float pan, FXCore core) : mStream(stream), mChannel(chan), mSlipTrack(0), mIsTrackChannel(0), - mPan(pan), mOriginalPan(pan), mCore(core), mOverallSpeed(1.0f), mSpeed(1.0f), mDirty(0), mVolume(vol) { +ChannelData::ChannelData(Stream *stream, int chan, float vol, float pan, FXCore core) + : mStream(stream), mChannel(chan), mSlipTrack(0), mIsTrackChannel(0), mPan(pan), + mOriginalPan(pan), mCore(core), mOverallSpeed(1.0f), mSpeed(1.0f), mDirty(0), + mVolume(vol) { mBaseFader = stream->ChannelFaders(chan)->AddLocal("base"); mBaseFader->SetVal(vol); stream->SetPan(chan, mPan); stream->SetFXCore(chan, mCore); } -ChannelData::~ChannelData(){ +ChannelData::~ChannelData() { RELEASE(mSlipTrack); } -void ChannelData::SetSlippable(bool b){ - if(b){ - if(!mSlipTrack){ +void ChannelData::SetSlippable(bool b) { + if (b) { + if (!mSlipTrack) { mSlipTrack = new SlipTrack(mStream, mChannel); } - } - else if(mSlipTrack) RELEASE(mSlipTrack); + } else if (mSlipTrack) + RELEASE(mSlipTrack); } -void ChannelData::ForceOn(){ - if(mSlipTrack) mSlipTrack->ForceOn(); +void ChannelData::ForceOn() { + if (mSlipTrack) + mSlipTrack->ForceOn(); } -void ChannelData::Reset(bool b){ - if(mOverallSpeed != 1.0f || mDirty || b){ +void ChannelData::Reset(bool b) { + if (mOverallSpeed != 1.0f || mDirty || b) { mSlipTrack->SetOffset(0); SetSlipTrackSpeed(1.0f); mDirty = false; } } -void ChannelData::Poll(){ - if(mSlipTrack) mSlipTrack->Poll(); +void ChannelData::Poll() { + if (mSlipTrack) + mSlipTrack->Poll(); } -void ChannelData::SetSlipTrackSpeed(float f){ - if(mSlipTrack){ - if(mSlipTrack->mMaxSlip * 0.9f < __fabs(mSlipTrack->GetCurrentOffset())){ - f = 1.0f; +void ChannelData::SetSlipTrackSpeed(float trackSpeed) { + if (mSlipTrack) { + if (mSlipTrack->mMaxSlip * 0.9f < __fabs(mSlipTrack->GetCurrentOffset())) { + trackSpeed = 1.0f; } - if(mSpeed != f || mOverallSpeed != 1.0f){ - mSlipTrack->SetSpeed(f * mOverallSpeed); - mSpeed = f; + if (mSpeed != trackSpeed || mOverallSpeed != 1.0f) { + mSlipTrack->SetSpeed(trackSpeed * mOverallSpeed); + mSpeed = trackSpeed; mDirty = true; } } } -void ChannelData::SetFX(FXCore core, bool b){ - if(mCore == core){ +void ChannelData::SetFX(FXCore core, bool b) { + if (mCore == core) { mStream->SetFX(mChannel, b); } } -void ChannelData::SetStereo(bool b){ - mStream->SetPan(mChannel, b ? mPan : 0); +void ChannelData::SetStereo(bool enabled) { + mStream->SetPan(mChannel, enabled ? mPan : 0); } -void ChannelData::SetFaderVal(float val){ +void ChannelData::SetFaderVal(float val) { mBaseFader->SetVal(val); } -void ChannelData::SetPan(float pan){ +void ChannelData::SetPan(float pan) { mPan = pan; mStream->SetPan(mChannel, mPan); } -TrackData::TrackData(){ +TrackData::TrackData() { Init(0, false); } -TrackData::TrackData(SubmixCollection* submixes, const std::vector& vec, bool b1, bool b2){ +TrackData::TrackData( + SubmixCollection *submixes, const std::vector &vec, bool b1, bool b2 +) { Init(submixes, b1); SetMapping(vec); mVocals = b2; } -void TrackData::Init(SubmixCollection* submixes, bool b){ +void TrackData::Miss(int i, float f) { + SetSucceeding(false, i, f); +} + +void TrackData::SetNonmutable(bool nonmutable) { + mNonmutable = nonmutable; +} + +void TrackData::SetSucceeding(bool succeeding, int gemId, float lastGemTime) { + if (mMultiSlot != 0) { + if (gemId == -1) { + int var = 0; + for (int j = 0; j < mSucceedingVec.size(); j++) { + mSucceedingVec[j] = succeeding; + mLastGemTimes[var] = lastGemTime; + var++; + } + return; + } + mSucceedingVec[gemId] = succeeding; + mLastGemTimes[gemId] = lastGemTime; + } else { + mSucceeding = succeeding; + return; + } +} + +void TrackData::SetUserGuid(const UserGuid &guid) { + mUserGuid = guid; +} + +void TrackData::Init(SubmixCollection *submixes, bool b) { mSubmixes = submixes; mMultiSlot = false; mSucceeding = false; diff --git a/src/system/beatmatch/MasterAudio.h b/src/system/beatmatch/MasterAudio.h index 8b95ee20..47b249c3 100644 --- a/src/system/beatmatch/MasterAudio.h +++ b/src/system/beatmatch/MasterAudio.h @@ -50,14 +50,17 @@ class TrackData { TrackData(SubmixCollection*, const std::vector&, bool, bool); ~TrackData(); void Init(SubmixCollection*, bool); + void Miss(int, float); void SetMapping(const std::vector&); void SetSucceeding(bool, int, float); void SetMapping(const char*); + void SetNonmutable(bool); + void SetUserGuid(const UserGuid&); void FillChannelList(std::list&) const; void Reset(); bool mSucceeding; // 0x0 - std::vector mSucceedingVec; // 0x4 - needs to be bool but errors out for some reason + std::vector mSucceedingVec; // 0x4 std::vector mLastGemTimes; // 0xc bool mMultiSlot; // 0x14 int mLastPlayedGem; // 0x18 @@ -115,7 +118,7 @@ class MasterAudio : public BeatMasterSink, public BeatMatchSink, public Hmx::Obj virtual void FilteredWhammyBar(float){} virtual void SwingAtHopo(int, float, int){} virtual void Hopo(int, float, int){} - virtual void SetCurrentPhrase(int, const PhraseInfo&){} + virtual void SetCurrentPhrase(int, const PhraseInfo&){ return;} virtual void NoCurrentPhrase(int){} virtual void FillReset(){} virtual void FillComplete(int, int){} @@ -124,17 +127,27 @@ class MasterAudio : public BeatMasterSink, public BeatMatchSink, public Hmx::Obj void SetupChannels(SongInfo*); void SetupTracks(SongInfo*, PlayerTrackConfigList*); bool IsLoaded(); + void FadeOutDrums(int); void ResetTrack(int, bool); void ResetTrack(AudioTrackNum, bool); void SetAutoOn(AudioTrackNum, int); void SetupTrackChannel(int, bool, float, bool, bool); void SetupBackgroundChannel(int, bool, float, bool, bool); + void SetBackgroundVolume(float); + void SetForegroundVolume(float); + void SetMuckWithPitch(bool); + void SetMuteMaster(bool); + void SetPracticeMode(bool); + void SetStereo(bool); + void SetTrackFader(AudioTrackNum, int, Symbol, float, float); + void ToggleMuteMaster(); void ConfigureVocalFaders(int, bool); bool Fail(); bool IsFinished() const; void Play(); void Jump(float); void UnmuteAllTracks(); + void UpdateMasterFader(); void ResetSlipTrack(AudioTrackNum, bool); void SetTimeOffset(float);