From a3e5ccde474297ab7c3fb509dcb08c4fc2f9c7be Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Thu, 6 Feb 2020 19:35:24 +0200 Subject: cMusicManager --- src/audio/AudioManager.h | 1 + src/audio/DMAudio.cpp | 2 +- src/audio/DMAudio.h | 2 +- src/audio/MusicManager.cpp | 831 ++++++++++++++++++++++++++++++++++++++++---- src/audio/MusicManager.h | 64 ++-- src/audio/audio_enums.h | 400 ++++++++++----------- src/core/Camera.h | 1 + src/core/ControllerConfig.h | 2 + src/core/World.cpp | 5 +- src/skel/win/win.cpp | 2 +- 10 files changed, 1006 insertions(+), 304 deletions(-) (limited to 'src') diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index f48a0b38..bd34c800 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -337,6 +337,7 @@ public: uint32 GetFrameCounter() const { return m_nTimeOfRecentCrime; } float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } int32 GetRandomNumber(int32 idx) const { return m_anRandomTable[idx]; } + bool IsMissionAudioPlaying() const { return m_sMissionAudio.m_bPlayStatus == 1; } // "Should" be in alphabetic order, except "getXTalkSfx" void AddDetailsToRequestedOrderList(uint8 sample); /// ok (check once more) diff --git a/src/audio/DMAudio.cpp b/src/audio/DMAudio.cpp index 25b20179..a01c85ae 100644 --- a/src/audio/DMAudio.cpp +++ b/src/audio/DMAudio.cpp @@ -301,7 +301,7 @@ cDMAudio::ClearMissionAudio(void) AudioManager.ClearMissionAudio(); } -int32 +uint8 cDMAudio::GetRadioInCar(void) { return MusicManager.GetRadioInCar(); diff --git a/src/audio/DMAudio.h b/src/audio/DMAudio.h index a6910b58..125263f0 100644 --- a/src/audio/DMAudio.h +++ b/src/audio/DMAudio.h @@ -253,7 +253,7 @@ public: bool IsMissionAudioSampleFinished(void); void ClearMissionAudio(void); - int32 GetRadioInCar(void); + uint8 GetRadioInCar(void); void SetRadioInCar(uint32 radio); void SetRadioChannel(int8 radio, int32 pos); }; diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 1d059a46..5b94514b 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -1,5 +1,8 @@ #include "common.h" +#include #include "MusicManager.h" +#include "AudioManager.h" +#include "ControllerConfig.h" #include "Camera.h" #include "Font.h" #include "Hud.h" @@ -15,35 +18,51 @@ cMusicManager &MusicManager = *(cMusicManager *)0x8F3964; int32 &gNumRetunePresses = *(int32 *)0x650B80; wchar *pCurrentStation = (wchar *)0x650B9C; uint8 &cDisplay = *(uint8 *)0x650BA1; +int32 &gRetuneCounter = *(int32*)0x650B84; +bool& bHasStarted = *(bool*)0x650B7C; + +cMusicManager::cMusicManager() +{ + m_bIsInitialised = false; + m_bDisabled = false; + m_nMusicMode = MUSICMODE_DISABLED; + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + m_bFrontendTrackFinished = false; + m_bPlayInFrontend = false; + m_bSetNextStation = false; + m_nAnnouncement = NO_STREAMED_SOUND; + m_bPreviousPlayerInCar = false; + m_bPlayerInCar = false; + m_bAnnouncementInProgress = false; + m_bDontServiceAmbienceTrack = false; + bHasStarted = false; +} bool cMusicManager::PlayerInCar() { if(!FindPlayerVehicle()) return false; - else { - int32 State = CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_nPedState; - if(State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED) - return false; + int32 State = FindPlayerPed()->m_nPedState; - switch(FindPlayerVehicle()->m_modelIndex) { - case MI_FIRETRUCK: - case MI_AMBULAN: - case MI_MRWHOOP: - case MI_PREDATOR: - case MI_TRAIN: - case MI_SPEEDER: - case MI_REEFER: - case MI_GHOST: return false; - default: return true; - } + if(State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED) + return false; + + switch(FindPlayerVehicle()->m_modelIndex) { + case MI_FIRETRUCK: + case MI_AMBULAN: + case MI_MRWHOOP: + case MI_PREDATOR: + case MI_TRAIN: + case MI_SPEEDER: + case MI_REEFER: + case MI_GHOST: return false; + default: return true; } } -#if 0 -WRAPPER void cMusicManager::DisplayRadioStationName(void) { EAXJMP(0x57E6D0); } -#else void cMusicManager::DisplayRadioStationName() { @@ -51,13 +70,13 @@ cMusicManager::DisplayRadioStationName() int8 gStreamedSound; int8 gRetuneCounter; - if(!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && cMusicManager::PlayerInCar() && + if(!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && PlayerInCar() && !CReplay::IsPlayingBack()) { - if(MusicManager.m_bPlayerInCar && !MusicManager.m_bPreviousPlayerInCar) + if(m_bPlayerInCar && !m_bPreviousPlayerInCar) pCurrentStation = nil; if(SampleManager.IsMP3RadioChannelAvailable()) { - gStreamedSound = MusicManager.m_nCurrentStreamedSound; + gStreamedSound = m_nCurrentStreamedSound; if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { @@ -74,15 +93,15 @@ cMusicManager::DisplayRadioStationName() if(pRetune == POLICE_RADIO) { pRetune = RADIO_OFF; } else if(pRetune > POLICE_RADIO) { - pRetune = pRetune - 11; + pRetune = pRetune - RADIO_OFF; } } else { - gStreamedSound = MusicManager.m_nCurrentStreamedSound; + gStreamedSound = m_nCurrentStreamedSound; pRetune = gNumRetunePresses + gStreamedSound; if(pRetune >= USERTRACK) { gRetuneCounter = gNumRetunePresses; - pRetune = MusicManager.m_nCurrentStreamedSound; + pRetune = m_nCurrentStreamedSound; if(gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) pRetune = RADIO_OFF; @@ -119,13 +138,13 @@ cMusicManager::DisplayRadioStationName() if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; } if(string && pCurrentStation != string || - MusicManager.m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER && - MusicManager.m_nPreviousStreamedSound != STREAMED_SOUND_RADIO_MP3_PLAYER) { + m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER && + m_nPreviousStreamedSound != STREAMED_SOUND_RADIO_MP3_PLAYER) { pCurrentStation = string; cDisplay = 60; } else { - if(!cDisplay) return; - --cDisplay; + if(cDisplay == 0) return; + cDisplay--; } CFont::SetJustifyOff(); @@ -147,97 +166,769 @@ cMusicManager::DisplayRadioStationName() CFont::DrawFonts(); } } -#endif -WRAPPER -void +bool cMusicManager::Initialise() { - EAXJMP(0x57CF70); + int pos; + + if (!IsInitialised()) { + time_t timevalue = time(0); + if (timevalue == -1) { + pos = AudioManager.GetRandomNumber(0); + } else { + tm *pTm = localtime(&timevalue); + if (pTm->tm_sec == 0) + pTm->tm_sec = AudioManager.GetRandomNumber(0); + if (pTm->tm_min == 0) + pTm->tm_min = AudioManager.GetRandomNumber(1); + if (pTm->tm_hour == 0) + pTm->tm_hour = AudioManager.GetRandomNumber(2); + if (pTm->tm_mday == 0) + pTm->tm_mday = AudioManager.GetRandomNumber(3); + if (pTm->tm_mon == 0) + pTm->tm_mon = AudioManager.GetRandomNumber(4); + if (pTm->tm_year == 0) + pTm->tm_year = AudioManager.GetRandomNumber(3); + if (pTm->tm_wday == 0) + pTm->tm_wday = AudioManager.GetRandomNumber(2); + pos = pTm->tm_yday + * pTm->tm_wday + * pTm->tm_year + * pTm->tm_mon + * pTm->tm_mday + * pTm->tm_hour * pTm->tm_hour + * pTm->tm_min * pTm->tm_min + * pTm->tm_sec * pTm->tm_sec * pTm->tm_sec * pTm->tm_sec; + } + + for (int i = 0; i < TOTAL_STREAMED_SOUNDS; i++) { + m_aTracks[i].m_nLength = SampleManager.GetStreamedFileLength(i); + m_aTracks[i].m_nPosition = pos * AudioManager.GetRandomNumber(i % 5) % m_aTracks[i].m_nLength; + m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } + + m_bResetTimers = false; + m_nResetTime = 0; + m_nTimer = m_nLastTrackServiceTime = CTimer::GetTimeInMillisecondsPauseMode(); + m_bDoTrackService = false; + m_bIgnoreTimeDelay = false; + m_bRadioSetByScript = false; + m_nRadioStation = HEAD_RADIO; + m_nRadioPosition = -1; + m_nRadioInCar = NO_STREAMED_SOUND; + gNumRetunePresses = 0; + gRetuneCounter = 0; + m_bIsInitialised = true; + } + return m_bIsInitialised; } -WRAPPER void cMusicManager::Terminate() { - EAXJMP(0x57D140); + if (!IsInitialised()) return; + + if (SampleManager.IsStreamPlaying(0)) { + SampleManager.StopStreamedFile(0); + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + } + m_bIsInitialised = false; +} + +void +cMusicManager::ChangeMusicMode(uint8 mode) +{ + if (!IsInitialised()) return; + + uint8 mode2; + switch (mode) + { + case MUSICMODE_FRONTEND: mode2 = MUSICMODE_FRONTEND; break; + case MUSICMODE_GAME: mode2 = MUSICMODE_GAME; break; + case MUSICMODE_CUTSCENE: mode2 = MUSICMODE_CUTSCENE; break; + case MUSICMODE_DISABLE: mode2 = MUSICMODE_DISABLED; break; + default: return; + } + + if (mode2 != m_nMusicMode || mode == MUSICMODE_FRONTEND && mode2 == MUSICMODE_FRONTEND) { + switch (mode) + { + case MUSICMODE_FRONTEND: + case MUSICMODE_GAME: + case MUSICMODE_CUTSCENE: + case MUSICMODE_DISABLED: + if (SampleManager.IsStreamPlaying(0)) { + if (m_nCurrentStreamedSound < TOTAL_STREAMED_SOUNDS) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } + SampleManager.StopStreamedFile(0); + } + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + m_bFrontendTrackFinished = false; + m_bPlayInFrontend = false; + m_bSetNextStation = false; + m_bPreviousPlayerInCar = false; + m_bPlayerInCar = false; + m_bAnnouncementInProgress = false; + m_nTimer = m_nLastTrackServiceTime = CTimer::GetTimeInMillisecondsPauseMode(); + m_bDoTrackService = false; + m_bIgnoreTimeDelay = true; + m_bDontServiceAmbienceTrack = false; + m_nMusicMode = mode2; + break; + default: return; + } + } +} + +uint8 +cMusicManager::GetRadioInCar(void) +{ + if (!m_bIsInitialised) return HEAD_RADIO; + if (PlayerInCar()) { + CVehicle *veh = FindPlayerVehicle(); + if (veh != nil){ + if (UsesPoliceRadio(veh)) { + if (m_nRadioInCar == NO_STREAMED_SOUND || CReplay::IsPlayingBack() && AudioManager.m_bUserPause) + return POLICE_RADIO; + return m_nRadioInCar; + } else return veh->m_nRadioStation; + } + } + + if (m_nRadioInCar == NO_STREAMED_SOUND || CReplay::IsPlayingBack() && AudioManager.m_bUserPause) + return RADIO_OFF; + return m_nRadioInCar; } -WRAPPER void -cMusicManager::ChangeMusicMode(int32 mode) +cMusicManager::SetRadioInCar(uint32 station) { - EAXJMP(0x57D310); + if (m_bIsInitialised) { + if (!PlayerInCar()) { + m_nRadioInCar = station; + return; + } + CVehicle *veh = FindPlayerVehicle(); + if (veh == nil) return; + if (UsesPoliceRadio(veh)) + m_nRadioInCar = station; + else + veh->m_nRadioStation = station; + } +} + +void +cMusicManager::SetRadioChannelByScript(uint8 station, int32 pos) +{ + if (m_bIsInitialised && station < RADIO_OFF) { + m_bRadioSetByScript = true; + m_nRadioStation = station; + m_nRadioPosition = pos == -1 ? -1 : pos % m_aTracks[station].m_nLength; + } +} + + +void +cMusicManager::ResetMusicAfterReload() +{ + m_bRadioSetByScript = false; + m_nRadioStation = 0; + m_nRadioPosition = -1; + m_nAnnouncement = NO_STREAMED_SOUND; + m_bAnnouncementInProgress = false; + m_bSetNextStation = false; + gRetuneCounter = 0; + gNumRetunePresses = 0; +} + + +void +cMusicManager::ResetTimers(int32 time) +{ + m_bResetTimers = true; + m_nResetTime = time; +} + +void +cMusicManager::Service() +{ + if (m_bResetTimers) { + m_bResetTimers = false; + m_nLastTrackServiceTime = m_nResetTime; + } + + if (!m_bIsInitialised || m_bDisabled) return; + + if (m_nMusicMode == MUSICMODE_CUTSCENE) { + SampleManager.SetStreamedVolumeAndPan(AudioManager.maxVolume, 63, 1, 0); + return; + } + + m_nTimer = CTimer::GetTimeInMillisecondsPauseMode(); + if (m_nTimer > (m_nLastTrackServiceTime + 2000) || m_bIgnoreTimeDelay) { + m_bIgnoreTimeDelay = false; + m_bDoTrackService = true; + m_nLastTrackServiceTime = m_nTimer; + } else m_bDoTrackService = false; + + if (m_nCurrentStreamedSound == NO_STREAMED_SOUND && SampleManager.IsStreamPlaying(0)) + SampleManager.StopStreamedFile(0); + else switch (m_nMusicMode) { + case MUSICMODE_FRONTEND: ServiceFrontEndMode(); break; + case MUSICMODE_GAME: ServiceGameMode(); break; + } +} + +void +cMusicManager::ServiceFrontEndMode() +{ + if (m_nCurrentStreamedSound < TOTAL_STREAMED_SOUNDS) { + if (m_bFrontendTrackFinished) { + if (!SampleManager.IsStreamPlaying(0)) { + switch (m_nCurrentStreamedSound) + { + case STREAMED_SOUND_MISSION_COMPLETED: + if (!AudioManager.m_bUserPause) + ChangeMusicMode(MUSICMODE_GAME); + break; + case STREAMED_SOUND_GAME_COMPLETED: + ChangeMusicMode(MUSICMODE_GAME); + break; + default: + break; + } + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + } + } else if (bHasStarted) { + if (!SampleManager.IsStreamPlaying(0)) + SampleManager.StartStreamedFile(m_nCurrentStreamedSound, 0, 0); + } else { + SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); + if (!SampleManager.StartStreamedFile(m_nCurrentStreamedSound, m_nCurrentStreamedSound < STREAMED_SOUND_RADIO_POLICE ? GetTrackStartPos(m_nCurrentStreamedSound) : 0, 0)) + return; + SampleManager.SetStreamedVolumeAndPan(100, 63, 0, 0); + if (m_bPlayInFrontend) bHasStarted = true; + else m_bFrontendTrackFinished = true; + } + } + if (SampleManager.IsStreamPlaying(0)) + SampleManager.SetStreamedVolumeAndPan((CPad::GetPad(0)->bDisplayNoControllerMessage || CPad::GetPad(0)->bObsoleteControllerMessage) ? 0 : 100, 63, 0, 0); +} + +void +cMusicManager::ServiceGameMode() +{ + bool bRadioOff = false; + static int8 nFramesSinceCutsceneEnded = -1; + + m_bPreviousPlayerInCar = m_bPlayerInCar; + m_bPlayerInCar = PlayerInCar(); + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + if (m_bPlayerInCar) { + if (FindPlayerPed() != nil + && !FindPlayerPed()->DyingOrDead() + && CPad::GetPad(0)->ChangeStationJustDown() + && !CReplay::IsPlayingBack() + && FindPlayerVehicle() != nil + && !UsesPoliceRadio(FindPlayerVehicle())) { + gRetuneCounter = 30; + gNumRetunePresses++; + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f); + if (SampleManager.IsMP3RadioChannelAvailable()) { + if (gNumRetunePresses > RADIO_OFF) + gNumRetunePresses -= RADIO_OFF; + } + } + } else { + nFramesSinceCutsceneEnded = -1; + } + + if (AudioManager.m_bPreviousUserPause) + m_bPreviousPlayerInCar = false; + if (!m_bPlayerInCar) { + if (m_bPreviousPlayerInCar) { + if (m_nCurrentStreamedSound != STREAMED_SOUND_RADIO_POLICE) + m_nRadioInCar = m_nCurrentStreamedSound; + } + ServiceAmbience(); + return; + } + + if (m_bPreviousPlayerInCar) { + if (m_nAnnouncement < TOTAL_STREAMED_SOUNDS + && (m_nCurrentStreamedSound < STREAMED_SOUND_CITY_AMBIENT || m_bAnnouncementInProgress) + && ServiceAnnouncement()) + { + if (m_bAnnouncementInProgress) { + m_bSetNextStation = false; + return; + } + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = GetCarTuning(); + } + if (SampleManager.IsMP3RadioChannelAvailable() + && m_nCurrentStreamedSound != STREAMED_SOUND_RADIO_MP3_PLAYER + && ControlsManager.GetIsKeyboardKeyJustDown(rsF9)) + { + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = STREAMED_SOUND_RADIO_MP3_PLAYER; + if (FindPlayerVehicle() != nil) + FindPlayerVehicle()->m_nRadioStation = STREAMED_SOUND_RADIO_MP3_PLAYER; + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f); + gRetuneCounter = 0; + gNumRetunePresses = 0; + m_bSetNextStation = false; + } + if (gNumRetunePresses) { + if (gRetuneCounter != 0) gRetuneCounter--; + else m_bSetNextStation = true; + } + if (gRetuneCounter) + AudioManager.DoPoliceRadioCrackle(); + if (m_bSetNextStation) { + m_bSetNextStation = false; + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = GetNextCarTuning(); + if (m_nCurrentStreamedSound == STREAMED_SOUND_CITY_AMBIENT || m_nCurrentStreamedSound == STREAMED_SOUND_WATER_AMBIENT) + bRadioOff = true; + + if (m_nPreviousStreamedSound == STREAMED_SOUND_CITY_AMBIENT || m_nPreviousStreamedSound == STREAMED_SOUND_WATER_AMBIENT) + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 0.0f); + } + if (m_nCurrentStreamedSound < STREAMED_SOUND_CITY_AMBIENT) { + if (ChangeRadioChannel()) { + ServiceTrack(); + } else { + m_bPlayerInCar = false; + if (FindPlayerVehicle()) + FindPlayerVehicle()->m_nRadioStation = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + } + if (CTimer::GetIsSlowMotionActive()) { + if (TheCamera.pTargetEntity != nil) { + float dist = (TheCamera.pTargetEntity->GetPosition() - TheCamera.GetPosition()).MagnitudeSqr(); + if (dist >= 3025.0f) { + SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); + } else if (dist >= 100.0f) { + int8 volume = ((45.0f - (Sqrt(dist) - 10.0f)) / 45.0f * 100.0f); + int8 pan; + if (AudioManager.IsMissionAudioPlaying()) + volume /= 4; + if (volume != 0) { + CVector trVec; + AudioManager.TranslateEntity(&TheCamera.pTargetEntity->GetPosition(), &trVec); + pan = AudioManager.ComputePan(55.0f, &trVec); + } else { + pan = 0; + } + if (gRetuneCounter) + volume /= 4; + SampleManager.SetStreamedVolumeAndPan(volume, pan, 0, 0); + } else if (AudioManager.IsMissionAudioPlaying()) { + SampleManager.SetStreamedVolumeAndPan(25, 63, 0, 0); + } else if (gRetuneCounter) { + SampleManager.SetStreamedVolumeAndPan(25, 63, 0, 0); + } else { + SampleManager.SetStreamedVolumeAndPan(100, 63, 0, 0); + } + } + } else if (AudioManager.IsMissionAudioPlaying()) { + SampleManager.SetStreamedVolumeAndPan(25, 63, 0, 0); + nFramesSinceCutsceneEnded = 0; + } else { + int8 volume; + if (nFramesSinceCutsceneEnded == -1) { + volume = 100; + } else if (nFramesSinceCutsceneEnded >= 20) { + if (nFramesSinceCutsceneEnded >= 40) { + nFramesSinceCutsceneEnded = -1; + volume = 100; + } else { + volume = 3 * (nFramesSinceCutsceneEnded - 20) + 25; + nFramesSinceCutsceneEnded++; + } + } else { + nFramesSinceCutsceneEnded++; + volume = 25; + } + if (gRetuneCounter) volume /= 4; + SampleManager.SetStreamedVolumeAndPan(volume, 63, 0, 0); + } + return; + } + if (bRadioOff) { + m_nCurrentStreamedSound = m_nPreviousStreamedSound; + if (FindPlayerVehicle() != nil) + FindPlayerVehicle()->m_nRadioStation = RADIO_OFF; + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_NO_RADIO, 0.0f); + } + ServiceAmbience(); + return; + } + if (m_bRadioSetByScript) { + if (UsesPoliceRadio(FindPlayerVehicle())) { + m_nCurrentStreamedSound = STREAMED_SOUND_RADIO_POLICE; + } else { + m_nCurrentStreamedSound = m_nRadioStation; + if (FindPlayerVehicle()->m_nRadioStation == m_nCurrentStreamedSound) { + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); + SampleManager.StopStreamedFile(0); + } + if (m_nRadioPosition != -1) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = m_nRadioPosition; + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } + } + } else { + m_nCurrentStreamedSound = GetCarTuning(); + } + if (m_nCurrentStreamedSound >= RADIO_OFF) { + ServiceAmbience(); + return; + } + if (ChangeRadioChannel()) { + if (m_bRadioSetByScript) { + m_bRadioSetByScript = false; + FindPlayerVehicle()->m_nRadioStation = m_nCurrentStreamedSound; + } + } else { + m_bPlayerInCar = false; + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + } } -WRAPPER void cMusicManager::StopFrontEndTrack() { - EAXJMP(0x57E3D0); + if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_FRONTEND && m_nCurrentStreamedSound != NO_STREAMED_SOUND) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + SampleManager.StopStreamedFile(0); + m_nPreviousStreamedSound = NO_STREAMED_SOUND; + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + } } -WRAPPER void -cMusicManager::PlayAnnouncement(uint8) +void +cMusicManager::PlayAnnouncement(uint8 announcement) { - EAXJMP(0x57E430); + if (IsInitialised() && !m_bDisabled && !m_bAnnouncementInProgress) + m_nAnnouncement = announcement; } -WRAPPER void -cMusicManager::PlayFrontEndTrack(uint8, uint8) +void +cMusicManager::PlayFrontEndTrack(uint8 track, uint8 bPlayInFrontend) { - EAXJMP(0x57E2E0); + if (IsInitialised() && !m_bDisabled && track < TOTAL_STREAMED_SOUNDS) { + if (m_nMusicMode == MUSICMODE_GAME) { + if (m_nCurrentStreamedSound != NO_STREAMED_SOUND) { + if (m_bAnnouncementInProgress) { + m_nAnnouncement = NO_STREAMED_SOUND; + m_bAnnouncementInProgress = false; + } + m_aTracks[m_nCurrentStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } + SampleManager.StopStreamedFile(0); + } else if (m_nMusicMode == MUSICMODE_FRONTEND) { + if (m_nCurrentStreamedSound != NO_STREAMED_SOUND) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } + SampleManager.StopStreamedFile(0); + } + + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = track; + m_bPlayInFrontend = !!bPlayInFrontend; + m_bFrontendTrackFinished = false; + m_bDoTrackService = true; + bHasStarted = false; + if (m_nCurrentStreamedSound < STREAMED_SOUND_RADIO_POLICE) { + gRetuneCounter = 0; + gNumRetunePresses = 0; + } + } } -WRAPPER void -cMusicManager::PreloadCutSceneMusic(uint8) +void +cMusicManager::PreloadCutSceneMusic(uint8 track) { - EAXJMP(0x57E210); + if (IsInitialised() && !m_bDisabled && track < TOTAL_STREAMED_SOUNDS && m_nMusicMode == MUSICMODE_CUTSCENE) { + AudioManager.ResetPoliceRadio(); + while (SampleManager.IsStreamPlaying(0)) + SampleManager.StopStreamedFile(0); + SampleManager.PreloadStreamedFile(track, 0); + SampleManager.SetStreamedVolumeAndPan(AudioManager.maxVolume, 63, 1, 0); + m_nCurrentStreamedSound = track; + } } -WRAPPER void +void cMusicManager::PlayPreloadedCutSceneMusic(void) { - EAXJMP(0x57E290); + if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_CUTSCENE) + SampleManager.StartPreloadedStreamedFile(0); } -WRAPPER void +void cMusicManager::StopCutSceneMusic(void) { - EAXJMP(0x57E2B0); + if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_CUTSCENE) { + SampleManager.StopStreamedFile(0); + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + } } -WRAPPER int32 -cMusicManager::GetRadioInCar(void) +uint32 +cMusicManager::GetTrackStartPos(uint8 track) { - EAXJMP(0x57D1D0); + uint32 result; + uint32 timer = m_aTracks[track].m_nLastPosCheckTimer; + if (CTimer::GetTimeInMillisecondsPauseMode() <= timer) { + result = m_aTracks[track].m_nPosition; + m_aTracks[track].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + } else + result = min(CTimer::GetTimeInMillisecondsPauseMode() - timer, 90000) + m_aTracks[track].m_nPosition; + + if (result > m_aTracks[track].m_nLength) result %= m_aTracks[track].m_nLength; + return result; } -WRAPPER void -cMusicManager::SetRadioInCar(uint32) + +bool +cMusicManager::UsesPoliceRadio(CVehicle *veh) { - EAXJMP(0x57D2C0); + switch (veh->GetModelIndex()) + { + case MI_FBICAR: + case MI_POLICE: + case MI_ENFORCER: + case MI_PREDATOR: + case MI_RHINO: + case MI_BARRACKS: + return true; + } + return false; } -WRAPPER void -cMusicManager::SetRadioChannelByScript(uint8, int32) +void +cMusicManager::ServiceAmbience() { - EAXJMP(0x57D180); + uint8 volume; + + if (m_bAnnouncementInProgress) { + m_nAnnouncement = NO_STREAMED_SOUND; + m_bAnnouncementInProgress = false; + } + if (m_nCurrentStreamedSound < STREAMED_SOUND_CITY_AMBIENT) { + if (SampleManager.IsStreamPlaying(0)) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + SampleManager.StopStreamedFile(0); + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + return; + } + m_nCurrentStreamedSound = STREAMED_SOUND_CITY_AMBIENT; + } + if (CWorld::Players[CWorld::PlayerInFocus].m_WBState != WBSTATE_PLAYING && !SampleManager.IsStreamPlaying(0)) { + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + return; + } + + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = TheCamera.DistanceToWater <= 45.0f ? STREAMED_SOUND_WATER_AMBIENT : STREAMED_SOUND_CITY_AMBIENT; + + if (m_nCurrentStreamedSound == m_nPreviousStreamedSound) { + ComputeAmbienceVol(false, volume); + SampleManager.SetStreamedVolumeAndPan(volume, 63, 1, 0); + if (m_bDontServiceAmbienceTrack) { + if (SampleManager.IsStreamPlaying(0)) + m_bDontServiceAmbienceTrack = false; + } else ServiceTrack(); + } else { + if (m_nPreviousStreamedSound < TOTAL_STREAMED_SOUNDS) { + m_aTracks[m_nPreviousStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nPreviousStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + SampleManager.StopStreamedFile(0); + } + uint32 pos = GetTrackStartPos(m_nCurrentStreamedSound); + SampleManager.SetStreamedVolumeAndPan(0, 63, 1, 0); + if (SampleManager.StartStreamedFile(m_nCurrentStreamedSound, pos, 0)) { + ComputeAmbienceVol(true, volume); + SampleManager.SetStreamedVolumeAndPan(volume, 63, 1, 0); + m_bDontServiceAmbienceTrack = true; + } else + m_nCurrentStreamedSound = NO_STREAMED_SOUND; + } } -WRAPPER void -cMusicManager::ResetMusicAfterReload() +cMusicManager::ComputeAmbienceVol(uint8 reset, uint8 &outVolume) { - EAXJMP(0x57CF30); + static float fVol = 0.0f; + + if (reset) + fVol = 0.0f; + else if (fVol < 60.0f) + fVol += 1.0f; + + if (TheCamera.DistanceToWater > 70.0f) + outVolume = fVol; + else if (TheCamera.DistanceToWater > 45.0f) + outVolume = (TheCamera.DistanceToWater - 45.0f) / 25.0f * fVol; + else if (TheCamera.DistanceToWater > 20.0f) + outVolume = (45.0f - TheCamera.DistanceToWater) / 25.0f * fVol; + else + outVolume = fVol; } -WRAPPER -void cMusicManager::ResetTimers(int32) { EAXJMP(0x57D420); } - -WRAPPER void -cMusicManager::Service() +cMusicManager::ServiceTrack() { - EAXJMP(0x57D440); + if (m_bDoTrackService) { + if (!SampleManager.IsStreamPlaying(0)) + SampleManager.StartStreamedFile(m_nCurrentStreamedSound, 0, 0); + } } + +bool +cMusicManager::ServiceAnnouncement() +{ + static int8 cCheck = 0; + if (m_bAnnouncementInProgress) { + if (!SampleManager.IsStreamPlaying(0)) { + m_nAnnouncement = NO_STREAMED_SOUND; + m_bAnnouncementInProgress = false; + } + return true; + } + + if (++cCheck >= 30) { + cCheck = 0; + int pos = SampleManager.GetStreamedFilePosition(0); + if (SampleManager.IsStreamPlaying(0)) { + if (m_nCurrentStreamedSound != NO_STREAMED_SOUND) { + m_aTracks[m_nCurrentStreamedSound].m_nPosition = pos; + m_aTracks[m_nCurrentStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + SampleManager.StopStreamedFile(0); + } + } + + SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); + if (SampleManager.StartStreamedFile(m_nAnnouncement, 0, 0)) { + SampleManager.SetStreamedVolumeAndPan(AudioManager.IsMissionAudioPlaying() ? 25 : 100, 63, 0, 0); + m_bAnnouncementInProgress = true; + m_nPreviousStreamedSound = m_nCurrentStreamedSound; + m_nCurrentStreamedSound = m_nAnnouncement; + return true; + } + + if (cCheck != 0) cCheck--; + else cCheck = 30; + return false; + } + + return false; +} + +uint8 +cMusicManager::GetCarTuning() +{ + CVehicle *veh = FindPlayerVehicle(); + if (veh == nil) return RADIO_OFF; + if (UsesPoliceRadio(veh)) return POLICE_RADIO; + if (veh->m_nRadioStation == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable()) + veh->m_nRadioStation = AudioManager.GetRandomNumber(2) % USERTRACK; + return veh->m_nRadioStation; +} + +uint8 +cMusicManager::GetNextCarTuning() +{ + CVehicle *veh = FindPlayerVehicle(); + if (veh == nil) return RADIO_OFF; + if (UsesPoliceRadio(veh)) return POLICE_RADIO; + if (gNumRetunePresses != 0) { + if (SampleManager.IsMP3RadioChannelAvailable()) { + if (veh->m_nRadioStation == RADIO_OFF) + veh->m_nRadioStation = POLICE_RADIO; + veh->m_nRadioStation += gNumRetunePresses; + if (veh->m_nRadioStation == POLICE_RADIO) + veh->m_nRadioStation = RADIO_OFF; + else if (veh->m_nRadioStation > POLICE_RADIO) + veh->m_nRadioStation -= RADIO_OFF; + } else if (gNumRetunePresses + veh->m_nRadioStation >= USERTRACK) { + while (gNumRetunePresses) { + if (veh->m_nRadioStation == RADIO_OFF) + veh->m_nRadioStation = HEAD_RADIO; + else if (veh->m_nRadioStation < USERTRACK) + ++veh->m_nRadioStation; + + if (veh->m_nRadioStation == USERTRACK) + veh->m_nRadioStation = RADIO_OFF; + --gNumRetunePresses; + } + } else + veh->m_nRadioStation += gNumRetunePresses; + gNumRetunePresses = 0; + } + return veh->m_nRadioStation; +} + +bool +cMusicManager::ChangeRadioChannel() +{ + if (m_nCurrentStreamedSound != m_nPreviousStreamedSound) { + if (m_nPreviousStreamedSound < TOTAL_STREAMED_SOUNDS) { + m_aTracks[m_nPreviousStreamedSound].m_nPosition = SampleManager.GetStreamedFilePosition(0); + m_aTracks[m_nPreviousStreamedSound].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode(); + SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0); + SampleManager.StopStreamedFile(0); + } + if (SampleManager.IsStreamPlaying(0)) + return false; + if (!SampleManager.StartStreamedFile(m_nCurrentStreamedSound, GetTrackStartPos(m_nCurrentStreamedSound), 0)) + return false; + SampleManager.SetStreamedVolumeAndPan(AudioManager.IsMissionAudioPlaying() ? 25 : 100, 63, 0, 0); + } + return true; +} + +STARTPATCHES +InjectHook(0x57E4B0, &cMusicManager::PlayerInCar, PATCH_JUMP); +InjectHook(0x57E6D0, &cMusicManager::DisplayRadioStationName, PATCH_JUMP); +InjectHook(0x57CF70, &cMusicManager::Initialise, PATCH_JUMP); +InjectHook(0x57D140, &cMusicManager::Terminate, PATCH_JUMP); +InjectHook(0x57D1D0, &cMusicManager::GetRadioInCar, PATCH_JUMP); +InjectHook(0x57D2C0, &cMusicManager::SetRadioInCar, PATCH_JUMP); +InjectHook(0x57D180, &cMusicManager::SetRadioChannelByScript, PATCH_JUMP); +InjectHook(0x57CF30, &cMusicManager::ResetMusicAfterReload, PATCH_JUMP); +InjectHook(0x57E6A0, &cMusicManager::UsesPoliceRadio, PATCH_JUMP); +InjectHook(0x57D310, &cMusicManager::ChangeMusicMode, PATCH_JUMP); +InjectHook(0x57D420, &cMusicManager::ResetTimers, PATCH_JUMP); +InjectHook(0x57D440, &cMusicManager::Service, PATCH_JUMP); +InjectHook(0x57D530, &cMusicManager::ServiceFrontEndMode, PATCH_JUMP); +InjectHook(0x57E3D0, &cMusicManager::StopFrontEndTrack, PATCH_JUMP); +InjectHook(0x57E430, &cMusicManager::PlayAnnouncement, PATCH_JUMP); +InjectHook(0x57E2E0, &cMusicManager::PlayFrontEndTrack, PATCH_JUMP); +InjectHook(0x57E210, &cMusicManager::PreloadCutSceneMusic, PATCH_JUMP); +InjectHook(0x57E290, &cMusicManager::PlayPreloadedCutSceneMusic, PATCH_JUMP); +InjectHook(0x57E2B0, &cMusicManager::StopCutSceneMusic, PATCH_JUMP); +InjectHook(0x57E450, &cMusicManager::GetTrackStartPos, PATCH_JUMP); +InjectHook(0x57D690, &cMusicManager::ServiceGameMode, PATCH_JUMP); +InjectHook(0x57DCB0, &cMusicManager::ServiceAmbience, PATCH_JUMP); +InjectHook(0x57DEA0, &cMusicManager::ComputeAmbienceVol, PATCH_JUMP); +InjectHook(0x57E100, &cMusicManager::ServiceTrack, PATCH_JUMP); +InjectHook(0x57DFC0, &cMusicManager::ServiceAnnouncement, PATCH_JUMP); +InjectHook(0x57E530, &cMusicManager::GetCarTuning, PATCH_JUMP); +InjectHook(0x57E5A0, &cMusicManager::GetNextCarTuning, PATCH_JUMP); +InjectHook(0x57E130, &cMusicManager::ChangeRadioChannel, PATCH_JUMP); +ENDPATCHES \ No newline at end of file diff --git a/src/audio/MusicManager.h b/src/audio/MusicManager.h index 709fe56a..5c255069 100644 --- a/src/audio/MusicManager.h +++ b/src/audio/MusicManager.h @@ -2,7 +2,7 @@ #include "audio_enums.h" -class tMP3Sample +class tStreamedSample { public: uint32 m_nLength; @@ -10,52 +10,46 @@ public: uint32 m_nLastPosCheckTimer; }; +class CVehicle; + class cMusicManager { public: bool m_bIsInitialised; - uint8 field_1; + bool m_bDisabled; uint8 m_nMusicMode; uint8 m_nCurrentStreamedSound; uint8 m_nPreviousStreamedSound; - uint8 field_5; - uint8 field_6; - uint8 field_7; - bool m_bAnnouncement; + bool m_bFrontendTrackFinished; + bool m_bPlayInFrontend; + bool m_bSetNextStation; + uint8 m_nAnnouncement; bool m_bPreviousPlayerInCar; bool m_bPlayerInCar; bool m_bAnnouncementInProgress; - tMP3Sample m_asMP3Samples[TOTAL_STREAMED_SOUNDS]; - uint8 field_2364; - uint8 field_2365; - uint8 field_2366; - uint8 field_2367; - uint32 field_2368; - uint32 field_2372; - uint32 field_2376; - uint8 field_2380; - uint8 field_2381; - uint8 field_2382; + tStreamedSample m_aTracks[TOTAL_STREAMED_SOUNDS]; + bool m_bResetTimers; + uint32 m_nResetTime; + uint32 m_nLastTrackServiceTime; + uint32 m_nTimer; + bool m_bDoTrackService; + bool m_bIgnoreTimeDelay; + bool m_bDontServiceAmbienceTrack; bool m_bRadioSetByScript; uint8 m_nRadioStation; - uint8 field_2385; - uint8 field_2386; - uint8 field_2387; - uint32 m_nRadioPosition; - bool m_bRadioInCar; - uint8 field_2393; - uint8 field_2394; - uint8 field_2395; + int32 m_nRadioPosition; + uint8 m_nRadioInCar; public: + cMusicManager(); bool IsInitialised() { return m_bIsInitialised; } uint32 GetMusicMode() { return m_nMusicMode; } uint8 GetCurrentTrack() { return m_nCurrentStreamedSound; } - void Initialise(); + bool Initialise(); void Terminate(); - void ChangeMusicMode(int32 mode); + void ChangeMusicMode(uint8 mode); void StopFrontEndTrack(); bool PlayerInCar(); @@ -66,7 +60,7 @@ public: void PreloadCutSceneMusic(uint8); void PlayPreloadedCutSceneMusic(void); void StopCutSceneMusic(void); - int32 GetRadioInCar(void); + uint8 GetRadioInCar(void); void SetRadioInCar(uint32); void SetRadioChannelByScript(uint8, int32); @@ -74,6 +68,20 @@ public: void ResetTimers(int32); void Service(); + void ServiceFrontEndMode(); + void ServiceGameMode(); + void ServiceAmbience(); + void ServiceTrack(); + + bool UsesPoliceRadio(CVehicle *veh); + uint32 GetTrackStartPos(uint8); + + void ComputeAmbienceVol(uint8 reset, uint8& outVolume); + bool ServiceAnnouncement(); + + uint8 GetCarTuning(); + uint8 GetNextCarTuning(); + bool ChangeRadioChannel(); }; static_assert(sizeof(cMusicManager) == 0x95C, "cMusicManager: error"); diff --git a/src/audio/audio_enums.h b/src/audio/audio_enums.h index 86f9f87f..8136ff66 100644 --- a/src/audio/audio_enums.h +++ b/src/audio/audio_enums.h @@ -21,210 +21,210 @@ enum eMusicMode MUSICMODE_FRONTEND = 0, MUSICMODE_GAME, MUSICMODE_CUTSCENE, - MUSICMODE_OFF, - MUSICMODE_4, + MUSICMODE_DISABLE, + MUSICMODE_DISABLED, }; enum eStreamedSounds { - STREAMED_SOUND_RADIO_HEAD = 0, - STREAMED_SOUND_RADIO_CLASSIC = 1, - STREAMED_SOUND_RADIO_KJAH = 2, - STREAMED_SOUND_RADIO_RISE = 3, - STREAMED_SOUND_RADIO_LIPS = 4, - STREAMED_SOUND_RADIO_GAME = 5, - STREAMED_SOUND_RADIO_MSX = 6, - STREAMED_SOUND_RADIO_FLASH = 7, - STREAMED_SOUND_RADIO_CHAT = 8, - STREAMED_SOUND_RADIO_MP3_PLAYER = 9, - STREAMED_SOUND_RADIO_POLICE = 10, - STREAMED_SOUND_CITY_AMBIENT = 11, - STREAMED_SOUND_WATER_AMBIENT = 12, - STREAMED_SOUND_ANNOUNCE_COMMERCIAL_OPEN = 13, - STREAMED_SOUND_ANNOUNCE_SUBURBAN_OPEN = 14, - STREAMED_SOUND_NEWS_INTRO = 15, - STREAMED_SOUND_BANK_INTRO = 16, - STREAMED_SOUND_CUTSCENE_LUIGI1_LG = 17, - STREAMED_SOUND_CUTSCENE_LUIGI2_DSB = 18, - STREAMED_SOUND_CUTSCENE_LUIGI3_DM = 19, - STREAMED_SOUND_CUTSCENE_LUIGI4_PAP = 20, - STREAMED_SOUND_CUTSCENE_LUIGI5_TFB = 21, - STREAMED_SOUND_CUTSCENE_JOEY0_DM2 = 22, - STREAMED_SOUND_CUTSCENE_JOEY1_LFL = 23, - STREAMED_SOUND_CUTSCENE_JOEY2_KCL = 24, - STREAMED_SOUND_CUTSCENE_JOEY3_VH = 25, - STREAMED_SOUND_CUTSCENE_JOEY4_ETH = 26, - STREAMED_SOUND_CUTSCENE_JOEY5_DST = 27, - STREAMED_SOUND_CUTSCENE_JOEY6_TBJ = 28, - STREAMED_SOUND_CUTSCENE_TONI1_TOL = 29, - STREAMED_SOUND_CUTSCENE_TONI2_TPU = 30, - STREAMED_SOUND_CUTSCENE_TONI3_MAS = 31, - STREAMED_SOUND_CUTSCENE_TONI4_TAT = 32, - STREAMED_SOUND_CUTSCENE_TONI5_BF = 33, - STREAMED_SOUND_CUTSCENE_SAL0_MAS = 34, - STREAMED_SOUND_CUTSCENE_SAL1_PF = 35, - STREAMED_SOUND_CUTSCENE_SAL2_CTG = 36, - STREAMED_SOUND_CUTSCENE_SAL3_RTC = 37, - STREAMED_SOUND_CUTSCENE_SAL5_LRQ = 38, - STREAMED_SOUND_CUTSCENE_SAL4_BDBA = 39, - STREAMED_SOUND_CUTSCENE_SAL4_BDBB = 40, - STREAMED_SOUND_CUTSCENE_SAL2_CTG2 = 41, - STREAMED_SOUND_CUTSCENE_SAL4_BDBD = 42, - STREAMED_SOUND_CUTSCENE_SAL5_LRQB = 43, - STREAMED_SOUND_CUTSCENE_SAL5_LRQC = 44, - STREAMED_SOUND_CUTSCENE_ASUKA_1_SSO = 45, - STREAMED_SOUND_CUTSCENE_ASUKA_2_PP = 46, - STREAMED_SOUND_CUTSCENE_ASUKA_3_SS = 47, - STREAMED_SOUND_CUTSCENE_ASUKA_4_PDR = 48, - STREAMED_SOUND_CUTSCENE_ASUKA_5_K2FT = 49, - STREAMED_SOUND_CUTSCENE_KENJI1_KBO = 50, - STREAMED_SOUND_CUTSCENE_KENJI2_GIS = 51, - STREAMED_SOUND_CUTSCENE_KENJI3_DS = 52, - STREAMED_SOUND_CUTSCENE_KENJI4_SHI = 53, - STREAMED_SOUND_CUTSCENE_KENJI5_SD = 54, - STREAMED_SOUND_CUTSCENE_RAY0_PDR2 = 55, - STREAMED_SOUND_CUTSCENE_RAY1_SW = 56, - STREAMED_SOUND_CUTSCENE_RAY2_AP = 57, - STREAMED_SOUND_CUTSCENE_RAY3_ED = 58, - STREAMED_SOUND_CUTSCENE_RAY4_GF = 59, - STREAMED_SOUND_CUTSCENE_RAY5_PB = 60, - STREAMED_SOUND_CUTSCENE_RAY6_MM = 61, - STREAMED_SOUND_CUTSCENE_DONALD1_STOG = 62, - STREAMED_SOUND_CUTSCENE_DONALD2_KK = 63, - STREAMED_SOUND_CUTSCENE_DONALD3_ADO = 64, - STREAMED_SOUND_CUTSCENE_DONALD5_ES = 65, - STREAMED_SOUND_CUTSCENE_DONALD7_MLD = 66, - STREAMED_SOUND_CUTSCENE_DONALD4_GTA = 67, - STREAMED_SOUND_CUTSCENE_DONALD4_GTA2 = 68, - STREAMED_SOUND_CUTSCENE_DONALD6_STS = 69, - STREAMED_SOUND_CUTSCENE_ASUKA6_BAIT = 70, - STREAMED_SOUND_CUTSCENE_ASUKA7_ETG = 71, - STREAMED_SOUND_CUTSCENE_ASUKA8_PS = 72, - STREAMED_SOUND_CUTSCENE_ASUKA9_ASD = 73, - STREAMED_SOUND_CUTSCENE_KENJI4_SHI2 = 74, - STREAMED_SOUND_CUTSCENE_CATALINA1_TEX = 75, - STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 = 76, - STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 = 77, - STREAMED_SOUND_CUTSCENE_ELBURRO3_PH3 = 78, - STREAMED_SOUND_CUTSCENE_ELBURRO4_PH4 = 79, - STREAMED_SOUND_CUTSCENE_YARDIE_PH1 = 80, - STREAMED_SOUND_CUTSCENE_YARDIE_PH2 = 81, - STREAMED_SOUND_CUTSCENE_YARDIE_PH3 = 82, - STREAMED_SOUND_CUTSCENE_YARDIE_PH4 = 83, - STREAMED_SOUND_CUTSCENE_HOODS_PH1 = 84, - STREAMED_SOUND_CUTSCENE_HOODS_PH2 = 85, - STREAMED_SOUND_CUTSCENE_HOODS_PH3 = 86, - STREAMED_SOUND_CUTSCENE_HOODS_PH4 = 87, - STREAMED_SOUND_CUTSCENE_HOODS_PH5 = 88, - STREAMED_SOUND_CUTSCENE_MARTY_PH1 = 89, - STREAMED_SOUND_CUTSCENE_MARTY_PH2 = 90, - STREAMED_SOUND_CUTSCENE_MARTY_PH3 = 91, - STREAMED_SOUND_CUTSCENE_MARTY_PH4 = 92, - STREAMED_SOUND_MISSION_COMPLETED = 93, - STREAMED_SOUND_GAME_COMPLETED = 94, - STREAMED_SOUND_MISSION_LIB_A1 = 95, - STREAMED_SOUND_MISSION_LIB_A2 = 96, - STREAMED_SOUND_MISSION_LIB_A = 97, - STREAMED_SOUND_MISSION_LIB_B = 98, - STREAMED_SOUND_MISSION_LIB_C = 99, - STREAMED_SOUND_MISSION_LIB_D = 100, - STREAMED_SOUND_MISSION_L2_A = 101, - STREAMED_SOUND_MISSION_J4T_1 = 102, - STREAMED_SOUND_MISSION_J4T_2 = 103, - STREAMED_SOUND_MISSION_J4T_3 = 104, - STREAMED_SOUND_MISSION_J4T_4 = 105, - STREAMED_SOUND_MISSION_J4_A = 106, - STREAMED_SOUND_MISSION_J4_B = 107, - STREAMED_SOUND_MISSION_J4_C = 108, - STREAMED_SOUND_MISSION_J4_D = 109, - STREAMED_SOUND_MISSION_J4_E = 110, - STREAMED_SOUND_MISSION_J4_F = 111, - STREAMED_SOUND_MISSION_J6_1 = 112, - STREAMED_SOUND_MISSION_J6_A = 113, - STREAMED_SOUND_MISSION_J6_B = 114, - STREAMED_SOUND_MISSION_J6_C = 115, - STREAMED_SOUND_MISSION_J6_D = 116, - STREAMED_SOUND_MISSION_T4_A = 117, - STREAMED_SOUND_MISSION_S1_A = 118, - STREAMED_SOUND_MISSION_S1_A1 = 119, - STREAMED_SOUND_MISSION_S1_B = 120, - STREAMED_SOUND_MISSION_S1_C = 121, - STREAMED_SOUND_MISSION_S1_C1 = 122, - STREAMED_SOUND_MISSION_S1_D = 123, - STREAMED_SOUND_MISSION_S1_E = 124, - STREAMED_SOUND_MISSION_S1_F = 125, - STREAMED_SOUND_MISSION_S1_G = 126, - STREAMED_SOUND_MISSION_S1_H = 127, - STREAMED_SOUND_MISSION_S1_I = 128, - STREAMED_SOUND_MISSION_S1_J = 129, - STREAMED_SOUND_MISSION_S1_K = 130, - STREAMED_SOUND_MISSION_S1_L = 131, - STREAMED_SOUND_MISSION_S3_A = 132, - STREAMED_SOUND_MISSION_S3_B = 133, - STREAMED_SOUND_MISSION_EL3_A = 134, - STREAMED_SOUND_MISSION_MF1_A = 135, - STREAMED_SOUND_MISSION_MF2_A = 136, - STREAMED_SOUND_MISSION_MF3_A = 137, - STREAMED_SOUND_MISSION_MF3_B = 138, - STREAMED_SOUND_MISSION_MF3_B1 = 139, - STREAMED_SOUND_MISSION_MF3_C = 140, - STREAMED_SOUND_MISSION_MF4_A = 141, - STREAMED_SOUND_MISSION_MF4_B = 142, - STREAMED_SOUND_MISSION_MF4_C = 143, - STREAMED_SOUND_MISSION_A1_A = 144, - STREAMED_SOUND_MISSION_A3_A = 145, - STREAMED_SOUND_MISSION_A5_A = 146, - STREAMED_SOUND_MISSION_A4_A = 147, - STREAMED_SOUND_MISSION_A4_B = 148, - STREAMED_SOUND_MISSION_A4_C = 149, - STREAMED_SOUND_MISSION_A4_D = 150, - STREAMED_SOUND_MISSION_K1_A = 151, - STREAMED_SOUND_MISSION_K3_A = 152, - STREAMED_SOUND_MISSION_R1_A = 153, - STREAMED_SOUND_MISSION_R2_A = 154, - STREAMED_SOUND_MISSION_R2_B = 155, - STREAMED_SOUND_MISSION_R2_C = 156, - STREAMED_SOUND_MISSION_R2_D = 157, - STREAMED_SOUND_MISSION_R2_E = 158, - STREAMED_SOUND_MISSION_R2_F = 159, - STREAMED_SOUND_MISSION_R2_G = 160, - STREAMED_SOUND_MISSION_R2_H = 161, - STREAMED_SOUND_MISSION_R5_A = 162, - STREAMED_SOUND_MISSION_R6_A = 163, - STREAMED_SOUND_MISSION_R6_A1 = 164, - STREAMED_SOUND_MISSION_R6_B = 165, - STREAMED_SOUND_MISSION_LO2_A = 166, - STREAMED_SOUND_MISSION_LO6_A = 167, - STREAMED_SOUND_MISSION_YD2_A = 168, - STREAMED_SOUND_MISSION_YD2_B = 169, - STREAMED_SOUND_MISSION_YD2_C = 170, - STREAMED_SOUND_MISSION_YD2_C1 = 171, - STREAMED_SOUND_MISSION_YD2_D = 172, - STREAMED_SOUND_MISSION_YD2_E = 173, - STREAMED_SOUND_MISSION_YD2_F = 174, - STREAMED_SOUND_MISSION_YD2_G = 175, - STREAMED_SOUND_MISSION_YD2_H = 176, - STREAMED_SOUND_MISSION_YD2_ASS = 177, - STREAMED_SOUND_MISSION_YD2_OK = 178, - STREAMED_SOUND_MISSION_H5_A = 179, - STREAMED_SOUND_MISSION_H5_B = 180, - STREAMED_SOUND_MISSION_H5_C = 181, - STREAMED_SOUND_MISSION_AMMU_A = 182, - STREAMED_SOUND_MISSION_AMMU_B = 183, - STREAMED_SOUND_MISSION_AMMU_C = 184, - STREAMED_SOUND_MISSION_DOOR_1 = 185, - STREAMED_SOUND_MISSION_DOOR_2 = 186, - STREAMED_SOUND_MISSION_DOOR_3 = 187, - STREAMED_SOUND_MISSION_DOOR_4 = 188, - STREAMED_SOUND_MISSION_DOOR_5 = 189, - STREAMED_SOUND_MISSION_DOOR_6 = 190, - STREAMED_SOUND_MISSION_T3_A = 191, - STREAMED_SOUND_MISSION_T3_B = 192, - STREAMED_SOUND_MISSION_T3_C = 193, - STREAMED_SOUND_MISSION_K1_B = 194, - STREAMED_SOUND_MISSION_CAT1 = 195, - TOTAL_STREAMED_SOUNDS = 196, - NO_STREAMED_SOUND = 197, + STREAMED_SOUND_RADIO_HEAD, + STREAMED_SOUND_RADIO_CLASSIC, + STREAMED_SOUND_RADIO_KJAH, + STREAMED_SOUND_RADIO_RISE, + STREAMED_SOUND_RADIO_LIPS, + STREAMED_SOUND_RADIO_GAME, + STREAMED_SOUND_RADIO_MSX, + STREAMED_SOUND_RADIO_FLASH, + STREAMED_SOUND_RADIO_CHAT, + STREAMED_SOUND_RADIO_MP3_PLAYER, + STREAMED_SOUND_RADIO_POLICE, + STREAMED_SOUND_CITY_AMBIENT, + STREAMED_SOUND_WATER_AMBIENT, + STREAMED_SOUND_ANNOUNCE_COMMERCIAL_OPEN, + STREAMED_SOUND_ANNOUNCE_SUBURBAN_OPEN, + STREAMED_SOUND_NEWS_INTRO, + STREAMED_SOUND_BANK_INTRO, + STREAMED_SOUND_CUTSCENE_LUIGI1_LG, + STREAMED_SOUND_CUTSCENE_LUIGI2_DSB, + STREAMED_SOUND_CUTSCENE_LUIGI3_DM, + STREAMED_SOUND_CUTSCENE_LUIGI4_PAP, + STREAMED_SOUND_CUTSCENE_LUIGI5_TFB, + STREAMED_SOUND_CUTSCENE_JOEY0_DM2, + STREAMED_SOUND_CUTSCENE_JOEY1_LFL, + STREAMED_SOUND_CUTSCENE_JOEY2_KCL, + STREAMED_SOUND_CUTSCENE_JOEY3_VH, + STREAMED_SOUND_CUTSCENE_JOEY4_ETH, + STREAMED_SOUND_CUTSCENE_JOEY5_DST, + STREAMED_SOUND_CUTSCENE_JOEY6_TBJ, + STREAMED_SOUND_CUTSCENE_TONI1_TOL, + STREAMED_SOUND_CUTSCENE_TONI2_TPU, + STREAMED_SOUND_CUTSCENE_TONI3_MAS, + STREAMED_SOUND_CUTSCENE_TONI4_TAT, + STREAMED_SOUND_CUTSCENE_TONI5_BF, + STREAMED_SOUND_CUTSCENE_SAL0_MAS, + STREAMED_SOUND_CUTSCENE_SAL1_PF, + STREAMED_SOUND_CUTSCENE_SAL2_CTG, + STREAMED_SOUND_CUTSCENE_SAL3_RTC, + STREAMED_SOUND_CUTSCENE_SAL5_LRQ, + STREAMED_SOUND_CUTSCENE_SAL4_BDBA, + STREAMED_SOUND_CUTSCENE_SAL4_BDBB, + STREAMED_SOUND_CUTSCENE_SAL2_CTG2, + STREAMED_SOUND_CUTSCENE_SAL4_BDBD, + STREAMED_SOUND_CUTSCENE_SAL5_LRQB, + STREAMED_SOUND_CUTSCENE_SAL5_LRQC, + STREAMED_SOUND_CUTSCENE_ASUKA_1_SSO, + STREAMED_SOUND_CUTSCENE_ASUKA_2_PP, + STREAMED_SOUND_CUTSCENE_ASUKA_3_SS, + STREAMED_SOUND_CUTSCENE_ASUKA_4_PDR, + STREAMED_SOUND_CUTSCENE_ASUKA_5_K2FT, + STREAMED_SOUND_CUTSCENE_KENJI1_KBO, + STREAMED_SOUND_CUTSCENE_KENJI2_GIS, + STREAMED_SOUND_CUTSCENE_KENJI3_DS, + STREAMED_SOUND_CUTSCENE_KENJI4_SHI, + STREAMED_SOUND_CUTSCENE_KENJI5_SD, + STREAMED_SOUND_CUTSCENE_RAY0_PDR2, + STREAMED_SOUND_CUTSCENE_RAY1_SW, + STREAMED_SOUND_CUTSCENE_RAY2_AP, + STREAMED_SOUND_CUTSCENE_RAY3_ED, + STREAMED_SOUND_CUTSCENE_RAY4_GF, + STREAMED_SOUND_CUTSCENE_RAY5_PB, + STREAMED_SOUND_CUTSCENE_RAY6_MM, + STREAMED_SOUND_CUTSCENE_DONALD1_STOG, + STREAMED_SOUND_CUTSCENE_DONALD2_KK, + STREAMED_SOUND_CUTSCENE_DONALD3_ADO, + STREAMED_SOUND_CUTSCENE_DONALD5_ES, + STREAMED_SOUND_CUTSCENE_DONALD7_MLD, + STREAMED_SOUND_CUTSCENE_DONALD4_GTA, + STREAMED_SOUND_CUTSCENE_DONALD4_GTA2, + STREAMED_SOUND_CUTSCENE_DONALD6_STS, + STREAMED_SOUND_CUTSCENE_ASUKA6_BAIT, + STREAMED_SOUND_CUTSCENE_ASUKA7_ETG, + STREAMED_SOUND_CUTSCENE_ASUKA8_PS, + STREAMED_SOUND_CUTSCENE_ASUKA9_ASD, + STREAMED_SOUND_CUTSCENE_KENJI4_SHI2, + STREAMED_SOUND_CUTSCENE_CATALINA1_TEX, + STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1, + STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2, + STREAMED_SOUND_CUTSCENE_ELBURRO3_PH3, + STREAMED_SOUND_CUTSCENE_ELBURRO4_PH4, + STREAMED_SOUND_CUTSCENE_YARDIE_PH1, + STREAMED_SOUND_CUTSCENE_YARDIE_PH2, + STREAMED_SOUND_CUTSCENE_YARDIE_PH3, + STREAMED_SOUND_CUTSCENE_YARDIE_PH4, + STREAMED_SOUND_CUTSCENE_HOODS_PH1, + STREAMED_SOUND_CUTSCENE_HOODS_PH2, + STREAMED_SOUND_CUTSCENE_HOODS_PH3, + STREAMED_SOUND_CUTSCENE_HOODS_PH4, + STREAMED_SOUND_CUTSCENE_HOODS_PH5, + STREAMED_SOUND_CUTSCENE_MARTY_PH1, + STREAMED_SOUND_CUTSCENE_MARTY_PH2, + STREAMED_SOUND_CUTSCENE_MARTY_PH3, + STREAMED_SOUND_CUTSCENE_MARTY_PH4, + STREAMED_SOUND_MISSION_COMPLETED, + STREAMED_SOUND_GAME_COMPLETED, + STREAMED_SOUND_MISSION_LIB_A1, + STREAMED_SOUND_MISSION_LIB_A2, + STREAMED_SOUND_MISSION_LIB_A, + STREAMED_SOUND_MISSION_LIB_B, + STREAMED_SOUND_MISSION_LIB_C, + STREAMED_SOUND_MISSION_LIB_D, + STREAMED_SOUND_MISSION_L2_A, + STREAMED_SOUND_MISSION_J4T_1, + STREAMED_SOUND_MISSION_J4T_2, + STREAMED_SOUND_MISSION_J4T_3, + STREAMED_SOUND_MISSION_J4T_4, + STREAMED_SOUND_MISSION_J4_A, + STREAMED_SOUND_MISSION_J4_B, + STREAMED_SOUND_MISSION_J4_C, + STREAMED_SOUND_MISSION_J4_D, + STREAMED_SOUND_MISSION_J4_E, + STREAMED_SOUND_MISSION_J4_F, + STREAMED_SOUND_MISSION_J6_1, + STREAMED_SOUND_MISSION_J6_A, + STREAMED_SOUND_MISSION_J6_B, + STREAMED_SOUND_MISSION_J6_C, + STREAMED_SOUND_MISSION_J6_D, + STREAMED_SOUND_MISSION_T4_A, + STREAMED_SOUND_MISSION_S1_A, + STREAMED_SOUND_MISSION_S1_A1, + STREAMED_SOUND_MISSION_S1_B, + STREAMED_SOUND_MISSION_S1_C, + STREAMED_SOUND_MISSION_S1_C1, + STREAMED_SOUND_MISSION_S1_D, + STREAMED_SOUND_MISSION_S1_E, + STREAMED_SOUND_MISSION_S1_F, + STREAMED_SOUND_MISSION_S1_G, + STREAMED_SOUND_MISSION_S1_H, + STREAMED_SOUND_MISSION_S1_I, + STREAMED_SOUND_MISSION_S1_J, + STREAMED_SOUND_MISSION_S1_K, + STREAMED_SOUND_MISSION_S1_L, + STREAMED_SOUND_MISSION_S3_A, + STREAMED_SOUND_MISSION_S3_B, + STREAMED_SOUND_MISSION_EL3_A, + STREAMED_SOUND_MISSION_MF1_A, + STREAMED_SOUND_MISSION_MF2_A, + STREAMED_SOUND_MISSION_MF3_A, + STREAMED_SOUND_MISSION_MF3_B, + STREAMED_SOUND_MISSION_MF3_B1, + STREAMED_SOUND_MISSION_MF3_C, + STREAMED_SOUND_MISSION_MF4_A, + STREAMED_SOUND_MISSION_MF4_B, + STREAMED_SOUND_MISSION_MF4_C, + STREAMED_SOUND_MISSION_A1_A, + STREAMED_SOUND_MISSION_A3_A, + STREAMED_SOUND_MISSION_A5_A, + STREAMED_SOUND_MISSION_A4_A, + STREAMED_SOUND_MISSION_A4_B, + STREAMED_SOUND_MISSION_A4_C, + STREAMED_SOUND_MISSION_A4_D, + STREAMED_SOUND_MISSION_K1_A, + STREAMED_SOUND_MISSION_K3_A, + STREAMED_SOUND_MISSION_R1_A, + STREAMED_SOUND_MISSION_R2_A, + STREAMED_SOUND_MISSION_R2_B, + STREAMED_SOUND_MISSION_R2_C, + STREAMED_SOUND_MISSION_R2_D, + STREAMED_SOUND_MISSION_R2_E, + STREAMED_SOUND_MISSION_R2_F, + STREAMED_SOUND_MISSION_R2_G, + STREAMED_SOUND_MISSION_R2_H, + STREAMED_SOUND_MISSION_R5_A, + STREAMED_SOUND_MISSION_R6_A, + STREAMED_SOUND_MISSION_R6_A1, + STREAMED_SOUND_MISSION_R6_B, + STREAMED_SOUND_MISSION_LO2_A, + STREAMED_SOUND_MISSION_LO6_A, + STREAMED_SOUND_MISSION_YD2_A, + STREAMED_SOUND_MISSION_YD2_B, + STREAMED_SOUND_MISSION_YD2_C, + STREAMED_SOUND_MISSION_YD2_C1, + STREAMED_SOUND_MISSION_YD2_D, + STREAMED_SOUND_MISSION_YD2_E, + STREAMED_SOUND_MISSION_YD2_F, + STREAMED_SOUND_MISSION_YD2_G, + STREAMED_SOUND_MISSION_YD2_H, + STREAMED_SOUND_MISSION_YD2_ASS, + STREAMED_SOUND_MISSION_YD2_OK, + STREAMED_SOUND_MISSION_H5_A, + STREAMED_SOUND_MISSION_H5_B, + STREAMED_SOUND_MISSION_H5_C, + STREAMED_SOUND_MISSION_AMMU_A, + STREAMED_SOUND_MISSION_AMMU_B, + STREAMED_SOUND_MISSION_AMMU_C, + STREAMED_SOUND_MISSION_DOOR_1, + STREAMED_SOUND_MISSION_DOOR_2, + STREAMED_SOUND_MISSION_DOOR_3, + STREAMED_SOUND_MISSION_DOOR_4, + STREAMED_SOUND_MISSION_DOOR_5, + STREAMED_SOUND_MISSION_DOOR_6, + STREAMED_SOUND_MISSION_T3_A, + STREAMED_SOUND_MISSION_T3_B, + STREAMED_SOUND_MISSION_T3_C, + STREAMED_SOUND_MISSION_K1_B, + STREAMED_SOUND_MISSION_CAT1, + TOTAL_STREAMED_SOUNDS, + NO_STREAMED_SOUND, }; enum AudioEntityHandle { diff --git a/src/core/Camera.h b/src/core/Camera.h index 3e67903f..6b631ee2 100644 --- a/src/core/Camera.h +++ b/src/core/Camera.h @@ -515,6 +515,7 @@ int m_iModeObbeCamIsInForCar; void dtor(void) { this->CCamera::~CCamera(); } }; +static_assert(offsetof(CCamera, DistanceToWater) == 0xe4, "CCamera: error"); static_assert(offsetof(CCamera, m_WideScreenOn) == 0x70, "CCamera: error"); static_assert(offsetof(CCamera, WorldViewerBeingUsed) == 0x75, "CCamera: error"); static_assert(offsetof(CCamera, m_uiNumberOfTrainCamNodes) == 0x84, "CCamera: error"); diff --git a/src/core/ControllerConfig.h b/src/core/ControllerConfig.h index e04f9583..458e457c 100644 --- a/src/core/ControllerConfig.h +++ b/src/core/ControllerConfig.h @@ -116,6 +116,8 @@ public: #ifdef __DINPUT_INCLUDED__ DIJOYSTATE2 m_OldState; DIJOYSTATE2 m_NewState; +#else + uint8 ___padd[0x110 * 2]; #endif wchar m_aActionNames[MAX_CONTROLLERACTIONS][ACTIONNAME_LENGTH]; bool m_aButtonStates[MAX_BUTTONS]; diff --git a/src/core/World.cpp b/src/core/World.cpp index 0b389e42..c914b647 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -864,10 +864,9 @@ CVehicle* FindPlayerVehicle(void) { CPlayerPed *ped = FindPlayerPed(); - if(ped->InVehicle()) + if(ped && ped->InVehicle()) return ped->m_pMyVehicle; - else - return nil; + return nil; } CVehicle* diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index 2492c2de..337055c5 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -2134,7 +2134,7 @@ _WinMain(HINSTANCE instance, CPad::ResetCheats(); CPad::StopPadsShaking(); - DMAudio.ChangeMusicMode(MUSICMODE_OFF); + DMAudio.ChangeMusicMode(MUSICMODE_DISABLE); CTimer::Stop(); -- cgit v1.2.3