aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2021-09-01 17:59:20 +0300
committerSergeanur <s.anureev@yandex.ua>2021-09-01 17:59:20 +0300
commit232a45c9acc47be5845186bfccdc7c557898d100 (patch)
treec3cab7b2157eb22c81039a243813add409a316be
parent29383a6a11b33ec14ecb07d6e17c26f8c101fffd (diff)
Audio: separate buffers for mission audio
-rw-r--r--src/audio/AudioLogic.cpp10
-rw-r--r--src/audio/sampman.h5
-rw-r--r--src/audio/sampman_miles.cpp71
-rw-r--r--src/audio/sampman_oal.cpp71
4 files changed, 110 insertions, 47 deletions
diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index a2a1ee14..a6768b0e 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -8307,7 +8307,6 @@ cPedComments::Process()
goto PedCommentAlreadyAdded;
}
}
-#if defined(GTA_PS2) || defined(FIX_BUGS)
bool8 IsLoadedResult;
sampleIndex = m_aPedCommentQueue[m_nActiveQueue][m_aPedCommentOrderList[m_nActiveQueue][0]].m_nSampleIndex;
if (sampleIndex >= PLAYER_COMMENTS_START && sampleIndex <= PLAYER_COMMENTS_END) {
@@ -8318,18 +8317,13 @@ cPedComments::Process()
bIsPlayerComment = FALSE;
}
switch(IsLoadedResult) { // yes, this was a switch
-#else
- switch(SampleManager.IsPedCommentLoaded(sampleIndex)) { // yes, this was a switch
-#endif
case FALSE:
#if defined(GTA_PC) && !defined(FIX_BUGS)
if(!m_bDelay)
#endif
-#if defined(GTA_PS2) || defined(FIX_BUGS)
if (bIsPlayerComment)
SampleManager.LoadMissionAudio(MISSION_AUDIO_PLAYER_COMMENT, sampleIndex);
else
-#endif
SampleManager.LoadPedComment(sampleIndex);
break;
case TRUE:
@@ -11863,8 +11857,8 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot)
if (m_nMissionAudioSampleIndex[slot] != NO_SAMPLE) {
switch (m_nMissionAudioLoadingStatus[slot]) {
case LOADING_STATUS_NOT_LOADED:
- // TODO: LoadMissionAudio
- SampleManager.LoadPedComment(m_nMissionAudioSampleIndex[slot]);
+ if (!SampleManager.IsMissionAudioLoaded(slot, m_nMissionAudioSampleIndex[slot]))
+ SampleManager.LoadMissionAudio(slot, m_nMissionAudioSampleIndex[slot]);
SampleManager.SetChannelFrequency(slot + CHANNEL_MISSION_AUDIO_1, SampleManager.GetSampleBaseFrequency(m_nMissionAudioSampleIndex[slot]));
m_nMissionAudioLoadingStatus[slot] = LOADING_STATUS_LOADED;
nFramesUntilFailedLoad[slot] = 0;
diff --git a/src/audio/sampman.h b/src/audio/sampman.h
index ef56741c..cc020471 100644
--- a/src/audio/sampman.h
+++ b/src/audio/sampman.h
@@ -112,7 +112,8 @@ enum
#endif
};
#define MAX_PEDSFX 7
-#define PED_BLOCKSIZE 160000
+#define PED_BLOCKSIZE 79000
+#define MISSION_AUDIO_BLOCKSIZE 160000
#define MAXPROVIDERS 64
@@ -207,10 +208,8 @@ public:
void UnloadSampleBank (uint8 nBank);
bool8 IsSampleBankLoaded(uint8 nBank);
-#if defined (GTA_PS2) || defined (FIX_BUGS)
bool8 IsMissionAudioLoaded(uint8 nSlot, uint32 nSample);
bool8 LoadMissionAudio (uint8 nSlot, uint32 nSample);
-#endif
bool8 IsPedCommentLoaded(uint32 nComment);
bool8 LoadPedComment (uint32 nComment);
diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp
index 512af3ae..e6aa08a1 100644
--- a/src/audio/sampman_miles.cpp
+++ b/src/audio/sampman_miles.cpp
@@ -39,10 +39,11 @@ int32 nPedSlotSfx [MAX_PEDSFX];
int32 nPedSlotSfxAddr[MAX_PEDSFX];
uint8 nCurrentPedSlot;
-#ifdef FIX_BUGS
+uint32 nMissionSlotSfx[MISSION_AUDIO_SLOTS] = { UINT32_MAX, UINT32_MAX };
+uintptr nMissionSlotSfxStartAddress;
+
uint32 gPlayerTalkSfx = UINT32_MAX;
void *gPlayerTalkData = 0;
-#endif
uint8 nChannelVolume[MAXCHANNELS+MAX2DCHANNELS];
@@ -1323,7 +1324,13 @@ cSampleManager::Initialise(void)
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (int32)AIL_mem_alloc_lock(PED_BLOCKSIZE*MAX_PEDSFX);
-#ifdef FIX_BUGS
+ nMissionSlotSfxStartAddress = (uintptr)AIL_mem_alloc_lock(PED_BLOCKSIZE*MAX_PEDSFX);
+ if ( !nMissionSlotSfxStartAddress )
+ {
+ Terminate();
+ return FALSE;
+ }
+
// Find biggest player comment
uint32 nMaxPedSize = 0;
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
@@ -1335,7 +1342,6 @@ cSampleManager::Initialise(void)
Terminate();
return FALSE;
}
-#endif
LoadSampleBank(SFX_BANK_0);
@@ -1491,13 +1497,20 @@ cSampleManager::Terminate(void)
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
}
-#ifdef FIX_BUGS
+ if ( nMissionSlotSfxStartAddress != 0 )
+ {
+ AIL_mem_free_lock((void *)nMissionSlotSfxStartAddress);
+ nMissionSlotSfxStartAddress = 0;
+
+ for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ )
+ nMissionSlotSfx[i] = UINT32_MAX;
+ }
+
if ( gPlayerTalkData != 0)
{
AIL_mem_free_lock(gPlayerTalkData);
gPlayerTalkData = 0;
}
-#endif
if ( DIG )
{
@@ -1663,32 +1676,50 @@ cSampleManager::IsSampleBankLoaded(uint8 nBank)
return bSampleBankLoaded[nBank];
}
-#ifdef FIX_BUGS
bool8
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
{
- ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
+ ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
- return nSample == gPlayerTalkSfx;
+ switch (nSlot)
+ {
+ case MISSION_AUDIO_SLOT_1:
+ case MISSION_AUDIO_SLOT_2:
+ return nMissionSlotSfx[nSlot] == nSample;
+ case MISSION_AUDIO_PLAYER_COMMENT:
+ return nSample == gPlayerTalkSfx;
+ }
+ return FALSE;
}
bool8
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
{
- ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
+ ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
ASSERT(nSample < TOTAL_AUDIO_SAMPLES);
if (fseek(fpSampleDataHandle, m_aSamples[nSample].nOffset, SEEK_SET) != 0)
return FALSE;
- if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
- return FALSE;
+ switch (nSlot)
+ {
+ case MISSION_AUDIO_SLOT_1:
+ case MISSION_AUDIO_SLOT_2:
+ if (fread((void*)(nMissionSlotSfxStartAddress + nSlot*MISSION_AUDIO_BLOCKSIZE), 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
+ return FALSE;
+
+ nMissionSlotSfx[nSlot] = nSample;
+ break;
+ case MISSION_AUDIO_PLAYER_COMMENT:
+ if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
+ return FALSE;
- gPlayerTalkSfx = nSample;
+ gPlayerTalkSfx = nSample;
+ break;
+ }
return TRUE;
}
-#endif
bool8
cSampleManager::IsPedCommentLoaded(uint32 nComment)
@@ -1917,7 +1948,6 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
}
-#ifdef FIX_BUGS
else if ( nSfx >= PLAYER_COMMENTS_START && nSfx <= PLAYER_COMMENTS_END )
{
if ( !IsMissionAudioLoaded(MISSION_AUDIO_PLAYER_COMMENT, nSfx) )
@@ -1925,9 +1955,15 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = (uintptr)gPlayerTalkData;
}
-#endif
else
- {
+ {
+ for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ ) {
+ if ( IsMissionAudioLoaded(i, nSfx) ) {
+ addr = nMissionSlotSfxStartAddress + i * MISSION_AUDIO_BLOCKSIZE;
+ goto MissionAudioFound;
+ }
+ }
+
if ( !IsPedCommentLoaded(nSfx) )
return FALSE;
@@ -1936,6 +1972,7 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = nPedSlotSfxAddr[slot];
}
+MissionAudioFound:
#ifdef EXTERNAL_3D_SOUND
if ( b2d )
{
diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp
index 4122e9ff..5b05269b 100644
--- a/src/audio/sampman_oal.cpp
+++ b/src/audio/sampman_oal.cpp
@@ -92,7 +92,7 @@ OggOpusFile *fpSampleDataHandle;
#else
FILE *fpSampleDataHandle;
#endif
-bool8 bSampleBankLoaded [MAX_SFX_BANKS];
+bool8 bSampleBankLoaded [MAX_SFX_BANKS];
int32 nSampleBankDiscStartOffset [MAX_SFX_BANKS];
int32 nSampleBankSize [MAX_SFX_BANKS];
uintptr nSampleBankMemoryStartAddress[MAX_SFX_BANKS];
@@ -102,10 +102,11 @@ int32 nPedSlotSfx [MAX_PEDSFX];
int32 nPedSlotSfxAddr[MAX_PEDSFX];
uint8 nCurrentPedSlot;
-#ifdef FIX_BUGS
+uint32 nMissionSlotSfx[MISSION_AUDIO_SLOTS] = { UINT32_MAX, UINT32_MAX };
+uintptr nMissionSlotSfxStartAddress;
+
uint32 gPlayerTalkSfx = UINT32_MAX;
void *gPlayerTalkData = 0;
-#endif
CChannel aChannel[NUM_CHANNELS];
uint8 nChannelVolume[NUM_CHANNELS];
@@ -1053,7 +1054,9 @@ cSampleManager::Initialise(void)
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
ASSERT(nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] != 0);
-#ifdef FIX_BUGS
+ nMissionSlotSfxStartAddress = (uintptr)malloc(MISSION_AUDIO_BLOCKSIZE*MISSION_AUDIO_SLOTS);
+ ASSERT(nMissionSlotSfxStartAddress != 0);
+
// Find biggest player comment
uint32 nMaxPedSize = 0;
for (uint32 i = PLAYER_COMMENTS_START; i <= PLAYER_COMMENTS_END; i++)
@@ -1061,7 +1064,6 @@ cSampleManager::Initialise(void)
gPlayerTalkData = malloc(nMaxPedSize);
ASSERT(gPlayerTalkData != 0);
-#endif
LoadSampleBank(SFX_BANK_0);
}
@@ -1223,13 +1225,20 @@ cSampleManager::Terminate(void)
nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] = 0;
}
-#ifdef FIX_BUGS
+ if ( nMissionSlotSfxStartAddress != 0 )
+ {
+ free((void*)nMissionSlotSfxStartAddress);
+ nMissionSlotSfxStartAddress = 0;
+
+ for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ )
+ nMissionSlotSfx[i] = UINT32_MAX;
+ }
+
if ( gPlayerTalkData != 0 )
{
free(gPlayerTalkData);
gPlayerTalkData = 0;
}
-#endif
_bSampmanInitialised = FALSE;
}
@@ -1355,32 +1364,50 @@ cSampleManager::IsSampleBankLoaded(uint8 nBank)
return bSampleBankLoaded[nBank];
}
-#ifdef FIX_BUGS
bool8
cSampleManager::IsMissionAudioLoaded(uint8 nSlot, uint32 nSample)
{
- ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
-
- return nSample == gPlayerTalkSfx;
+ ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
+
+ switch (nSlot)
+ {
+ case MISSION_AUDIO_SLOT_1:
+ case MISSION_AUDIO_SLOT_2:
+ return nMissionSlotSfx[nSlot] == nSample;
+ case MISSION_AUDIO_PLAYER_COMMENT:
+ return nSample == gPlayerTalkSfx;
+ }
+ return FALSE;
}
bool8
cSampleManager::LoadMissionAudio(uint8 nSlot, uint32 nSample)
{
- ASSERT(nSlot == MISSION_AUDIO_PLAYER_COMMENT); // only MISSION_AUDIO_PLAYER_COMMENT is supported on PC
+ ASSERT(nSlot != MISSION_AUDIO_POLRADIO_CRIME_OR_COLOR && nSlot != MISSION_AUDIO_POLRADIO_AREA_OR_CAR); // these are not used in LCS
ASSERT(nSample < TOTAL_AUDIO_SAMPLES);
if (fseek(fpSampleDataHandle, m_aSamples[nSample].nOffset, SEEK_SET) != 0)
return FALSE;
- if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
- return FALSE;
+ switch (nSlot)
+ {
+ case MISSION_AUDIO_SLOT_1:
+ case MISSION_AUDIO_SLOT_2:
+ if (fread((void*)(nMissionSlotSfxStartAddress + nSlot*MISSION_AUDIO_BLOCKSIZE), 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
+ return FALSE;
+
+ nMissionSlotSfx[nSlot] = nSample;
+ break;
+ case MISSION_AUDIO_PLAYER_COMMENT:
+ if (fread(gPlayerTalkData, 1, m_aSamples[nSample].nSize, fpSampleDataHandle) != m_aSamples[nSample].nSize)
+ return FALSE;
- gPlayerTalkSfx = nSample;
+ gPlayerTalkSfx = nSample;
+ break;
+ }
return TRUE;
}
-#endif
bool8
cSampleManager::IsPedCommentLoaded(uint32 nComment)
@@ -1616,7 +1643,6 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset;
}
-#ifdef FIX_BUGS
else if ( nSfx >= PLAYER_COMMENTS_START && nSfx <= PLAYER_COMMENTS_END )
{
if ( !IsMissionAudioLoaded(MISSION_AUDIO_PLAYER_COMMENT, nSfx) )
@@ -1624,16 +1650,23 @@ cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank)
addr = (uintptr)gPlayerTalkData;
}
-#endif
else
{
+ for ( uint32 i = 0; i < MISSION_AUDIO_SLOTS; i++ ) {
+ if ( IsMissionAudioLoaded(i, nSfx) ) {
+ addr = nMissionSlotSfxStartAddress + i * MISSION_AUDIO_BLOCKSIZE;
+ goto MissionAudioFound;
+ }
+ }
+
if ( !IsPedCommentLoaded(nSfx) )
return FALSE;
int32 slot = _GetPedCommentSlot(nSfx);
addr = (nSampleBankMemoryStartAddress[SFX_BANK_PED_COMMENTS] + PED_BLOCKSIZE * slot);
}
-
+
+MissionAudioFound:
if ( GetChannelUsedFlag(nChannel) )
{
TRACE("Stopping channel %d - really!!!", nChannel);