From 2ce36a48b92a21b88a59d08856751d9adc7a062f Mon Sep 17 00:00:00 2001
From: Sergeanur <s.anureev@yandex.ua>
Date: Wed, 14 Jul 2021 23:07:47 +0300
Subject: [PATCH] Make PS2 VB files work together with PC audio files

---
 src/audio/sampman.h         | 110 ++++++++++++++++++++++++++++--
 src/audio/sampman_miles.cpp | 132 +++++++++++++++++++++++++++++-------
 src/audio/sampman_oal.cpp   |  39 ++++++-----
 src/core/config.h           |   2 +-
 4 files changed, 238 insertions(+), 45 deletions(-)

diff --git a/src/audio/sampman.h b/src/audio/sampman.h
index d1ad9a26..dc95622b 100644
--- a/src/audio/sampman.h
+++ b/src/audio/sampman.h
@@ -259,8 +259,8 @@ static char StreamedNameTable[][25] = {
     "AUDIO\\door_2.OPUS",  "AUDIO\\door_3.OPUS",  "AUDIO\\door_4.OPUS",  "AUDIO\\door_5.OPUS",  "AUDIO\\door_6.OPUS",  "AUDIO\\t3_a.OPUS",
     "AUDIO\\t3_b.OPUS",    "AUDIO\\t3_c.OPUS",    "AUDIO\\k1_b.OPUS",    "AUDIO\\cat1.OPUS"};
 #else
-#if defined(PS2_AUDIO_PATHS)
-static char StreamedNameTable[][25]=
+#ifdef PS2_AUDIO_PATHS
+static char PS2StreamedNameTable[][25]=
 {
 	"AUDIO\\MUSIC\\HEAD.VB",
 	"AUDIO\\MUSIC\\CLASS.VB",
@@ -357,7 +357,110 @@ static char StreamedNameTable[][25]=
 	"AUDIO\\PHONE\\MT_PH4.VB",
 	"AUDIO\\MUSIC\\MISCOM.VB",
 	"AUDIO\\MUSIC\\END.VB",
-#else
+	"AUDIO\\lib_a1.WAV",
+	"AUDIO\\lib_a2.WAV",
+	"AUDIO\\lib_a.WAV",
+	"AUDIO\\lib_b.WAV",
+	"AUDIO\\lib_c.WAV",
+	"AUDIO\\lib_d.WAV",
+	"AUDIO\\l2_a.WAV",
+	"AUDIO\\j4t_1.WAV",
+	"AUDIO\\j4t_2.WAV",
+	"AUDIO\\j4t_3.WAV",
+	"AUDIO\\j4t_4.WAV",
+	"AUDIO\\j4_a.WAV",
+	"AUDIO\\j4_b.WAV",
+	"AUDIO\\j4_c.WAV",
+	"AUDIO\\j4_d.WAV",
+	"AUDIO\\j4_e.WAV",
+	"AUDIO\\j4_f.WAV",
+	"AUDIO\\j6_1.WAV",
+	"AUDIO\\j6_a.WAV",
+	"AUDIO\\j6_b.WAV",
+	"AUDIO\\j6_c.WAV",
+	"AUDIO\\j6_d.WAV",
+	"AUDIO\\t4_a.WAV",
+	"AUDIO\\s1_a.WAV",
+	"AUDIO\\s1_a1.WAV",
+	"AUDIO\\s1_b.WAV",
+	"AUDIO\\s1_c.WAV",
+	"AUDIO\\s1_c1.WAV",
+	"AUDIO\\s1_d.WAV",
+	"AUDIO\\s1_e.WAV",
+	"AUDIO\\s1_f.WAV",
+	"AUDIO\\s1_g.WAV",
+	"AUDIO\\s1_h.WAV",
+	"AUDIO\\s1_i.WAV",
+	"AUDIO\\s1_j.WAV",
+	"AUDIO\\s1_k.WAV",
+	"AUDIO\\s1_l.WAV",
+	"AUDIO\\s3_a.WAV",
+	"AUDIO\\s3_b.WAV",
+	"AUDIO\\el3_a.WAV",
+	"AUDIO\\mf1_a.WAV",
+	"AUDIO\\mf2_a.WAV",
+	"AUDIO\\mf3_a.WAV",
+	"AUDIO\\mf3_b.WAV",
+	"AUDIO\\mf3_b1.WAV",
+	"AUDIO\\mf3_c.WAV",
+	"AUDIO\\mf4_a.WAV",
+	"AUDIO\\mf4_b.WAV",
+	"AUDIO\\mf4_c.WAV",
+	"AUDIO\\a1_a.WAV",
+	"AUDIO\\a3_a.WAV",
+	"AUDIO\\a5_a.WAV",
+	"AUDIO\\a4_a.WAV",
+	"AUDIO\\a4_b.WAV",
+	"AUDIO\\a4_c.WAV",
+	"AUDIO\\a4_d.WAV",
+	"AUDIO\\k1_a.WAV",
+	"AUDIO\\k3_a.WAV",
+	"AUDIO\\r1_a.WAV",
+	"AUDIO\\r2_a.WAV",
+	"AUDIO\\r2_b.WAV",
+	"AUDIO\\r2_c.WAV",
+	"AUDIO\\r2_d.WAV",
+	"AUDIO\\r2_e.WAV",
+	"AUDIO\\r2_f.WAV",
+	"AUDIO\\r2_g.WAV",
+	"AUDIO\\r2_h.WAV",
+	"AUDIO\\r5_a.WAV",
+	"AUDIO\\r6_a.WAV",
+	"AUDIO\\r6_a1.WAV",
+	"AUDIO\\r6_b.WAV",
+	"AUDIO\\lo2_a.WAV",
+	"AUDIO\\lo6_a.WAV",
+	"AUDIO\\yd2_a.WAV",
+	"AUDIO\\yd2_b.WAV",
+	"AUDIO\\yd2_c.WAV",
+	"AUDIO\\yd2_c1.WAV",
+	"AUDIO\\yd2_d.WAV",
+	"AUDIO\\yd2_e.WAV",
+	"AUDIO\\yd2_f.WAV",
+	"AUDIO\\yd2_g.WAV",
+	"AUDIO\\yd2_h.WAV",
+	"AUDIO\\yd2_ass.WAV",
+	"AUDIO\\yd2_ok.WAV",
+	"AUDIO\\h5_a.WAV",
+	"AUDIO\\h5_b.WAV",
+	"AUDIO\\h5_c.WAV",
+	"AUDIO\\ammu_a.WAV",
+	"AUDIO\\ammu_b.WAV",
+	"AUDIO\\ammu_c.WAV",
+	"AUDIO\\door_1.WAV",
+	"AUDIO\\door_2.WAV",
+	"AUDIO\\door_3.WAV",
+	"AUDIO\\door_4.WAV",
+	"AUDIO\\door_5.WAV",
+	"AUDIO\\door_6.WAV",
+	"AUDIO\\t3_a.WAV",
+	"AUDIO\\t3_b.WAV",
+	"AUDIO\\t3_c.WAV",
+	"AUDIO\\k1_b.WAV",
+	"AUDIO\\cat1.WAV"
+};
+#endif
+
 static char StreamedNameTable[][25] =
 {
 	"AUDIO\\HEAD.WAV",
@@ -455,7 +558,6 @@ static char StreamedNameTable[][25] =
 	"AUDIO\\MT_PH4.MP3",
 	"AUDIO\\MISCOM.WAV",
 	"AUDIO\\END.MP3",
-#endif
 	"AUDIO\\lib_a1.WAV",
 	"AUDIO\\lib_a2.WAV",
 	"AUDIO\\lib_a.WAV",
diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp
index e820864c..d529513d 100644
--- a/src/audio/sampman_miles.cpp
+++ b/src/audio/sampman_miles.cpp
@@ -992,11 +992,20 @@ cSampleManager::Initialise(void)
 				
 				if ( GetDriveType(m_szCDRomRootPath) == DRIVE_CDROM )
 				{
+					FILE *f;
+#ifdef PS2_AUDIO_PATHS
 					strcpy(filepath, m_szCDRomRootPath);
-					strcat(filepath, StreamedNameTable[0]);
-					
-					FILE *f = fopen(filepath, "rb");
+					strcat(filepath, PS2StreamedNameTable[0]);
+					f = fopen(filepath, "rb");
+
+					if ( !f )
+#endif
+					{
+						strcpy(filepath, m_szCDRomRootPath);
+						strcat(filepath, StreamedNameTable[0]);
 					
+						f = fopen(filepath, "rb");
+					}
 					if ( f )
 					{
 						fclose(f);
@@ -1005,11 +1014,20 @@ cSampleManager::Initialise(void)
 
 						for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
 						{
+#ifdef PS2_AUDIO_PATHS
 							strcpy(filepath, m_szCDRomRootPath);
-							strcat(filepath, StreamedNameTable[i]);
-							
+							strcat(filepath, PS2StreamedNameTable[i]);
+
 							mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
-							
+							if ( !mp3Stream[0] )
+#endif
+							{
+								strcpy(filepath, m_szCDRomRootPath);
+								strcat(filepath, StreamedNameTable[i]);
+
+								mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
+							}
+
 							if ( mp3Stream[0] )
 							{
 								AIL_stream_ms_position(mp3Stream[0], &tatalms, NULL);
@@ -1078,7 +1096,14 @@ cSampleManager::Initialise(void)
 		strcpy(_aHDDPath, m_szCDRomRootPath);
 		rootpath[0] = '\0';
 		
-		FILE *f = fopen(StreamedNameTable[0], "rb");
+		FILE *f;
+
+#ifdef PS2_AUDIO_PATHS
+		f = fopen(PS2StreamedNameTable[0], "rb");
+		if (!f)
+#endif
+
+			f = fopen(StreamedNameTable[0], "rb");
 		
 		if ( f )
 		{
@@ -1086,11 +1111,20 @@ cSampleManager::Initialise(void)
 			
 			for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
 			{
+#ifdef PS2_AUDIO_PATHS
 				strcpy(filepath, rootpath);
-				strcat(filepath, StreamedNameTable[i]);
-				
+				strcat(filepath, PS2StreamedNameTable[i]);
+
 				mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
-				
+				if ( !mp3Stream[0] )
+#endif
+				{
+					strcpy(filepath, rootpath);
+					strcat(filepath, StreamedNameTable[i]);
+
+					mp3Stream[0] = AIL_open_stream(DIG, filepath, 0);
+				}
+
 				if ( mp3Stream[0] )
 				{
 					AIL_stream_ms_position(mp3Stream[0], &tatalms, NULL);
@@ -1299,9 +1333,11 @@ cSampleManager::CheckForAnAudioFileOnCD(void)
 {
 #if GTA_VERSION < GTA3_PC_STEAM && !defined(NO_CDCHECK)
 	char filepath[MAX_PATH];
+	FILE *f;
 	
+#ifdef PS2_AUDIO_PATHS
 #if GTA_VERSION >= GTA3_PC_11
-	if (_bUseHDDAudio)
+	if(_bUseHDDAudio)
 		strcpy(filepath, _aHDDPath);
 	else
 		strcpy(filepath, m_szCDRomRootPath);
@@ -1309,10 +1345,25 @@ cSampleManager::CheckForAnAudioFileOnCD(void)
 	strcpy(filepath, m_szCDRomRootPath);
 #endif // #if GTA_VERSION >= GTA3_PC_11
 
-	strcat(filepath, StreamedNameTable[AudioManager.GetRandomNumber(1) % TOTAL_STREAMED_SOUNDS]);
-	
-	FILE *f = fopen(filepath, "rb");
+	strcat(filepath, PS2StreamedNameTable[AudioManager.GetRandomNumber(1) % TOTAL_STREAMED_SOUNDS]);
+
+	f = fopen(filepath, "rb");
+	if ( !f )
+#endif // PS2_AUDIO_PATHS
+	{
+#if GTA_VERSION >= GTA3_PC_11
+		if (_bUseHDDAudio)
+			strcpy(filepath, _aHDDPath);
+		else
+			strcpy(filepath, m_szCDRomRootPath);
+#else
+		strcpy(filepath, m_szCDRomRootPath);
+#endif // #if GTA_VERSION >= GTA3_PC_11
+
+		strcat(filepath, StreamedNameTable[AudioManager.GetRandomNumber(1) % TOTAL_STREAMED_SOUNDS]);
 	
+		f = fopen(filepath, "rb");
+	}
 	if ( f )
 	{
 		fclose(f);
@@ -2007,11 +2058,19 @@ cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
 			}
 			
 			char filepath[MAX_PATH];
-			
+#ifdef PS2_AUDIO_PATHS
 			strcpy(filepath, m_szCDRomRootPath);
-			strcat(filepath, StreamedNameTable[nFile]);
-			
+			strcat(filepath, PS2StreamedNameTable[nFile]);
+
 			mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0);
+			if ( !mp3Stream[nStream] )
+#endif
+			{
+				strcpy(filepath, m_szCDRomRootPath);
+				strcat(filepath, StreamedNameTable[nFile]);
+
+				mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0);
+			}
 	
 			if ( mp3Stream[nStream] )
 			{
@@ -2073,10 +2132,19 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 				// Try to continue from previous song, if already started
 				if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
 					nFile = 0;
+#ifdef PS2_AUDIO_PATHS
 					strcpy(filename, m_szCDRomRootPath);
-					strcat(filename, StreamedNameTable[nFile]);
-					
+					strcat(filename, PS2StreamedNameTable[nFile]);
+
 					mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+					if ( !mp3Stream[nStream] )
+#endif
+					{
+						strcpy(filename, m_szCDRomRootPath);
+						strcat(filename, StreamedNameTable[nFile]);
+					
+						mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+					}
 					if ( mp3Stream[nStream] )
 					{
 						AIL_set_stream_loop_count(mp3Stream[nStream], 1);
@@ -2120,10 +2188,19 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 					{
 						nFile = 0;
 						_bIsMp3Active = 0;
+#ifdef PS2_AUDIO_PATHS
 						strcpy(filename, m_szCDRomRootPath);
-						strcat(filename, StreamedNameTable[nFile]);
-						
+						strcat(filename, PS2StreamedNameTable[nFile]);
+
 						mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+						if ( !mp3Stream[nStream] )
+#endif
+						{
+							strcpy(filename, m_szCDRomRootPath);
+							strcat(filename, StreamedNameTable[nFile]);
+						
+							mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+						}
 						if ( mp3Stream[nStream] )
 						{
 							AIL_set_stream_loop_count(mp3Stream[nStream], 1);
@@ -2161,10 +2238,19 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 		position = 0;
 		nFile = 0;
 	}
+#ifdef PS2_AUDIO_PATHS
 	strcpy(filename, m_szCDRomRootPath);
-	strcat(filename, StreamedNameTable[nFile]);
-	
+	strcat(filename, PS2StreamedNameTable[nFile]);
+
 	mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+	if ( !mp3Stream[nStream] )
+#endif
+	{
+		strcpy(filename, m_szCDRomRootPath);
+		strcat(filename, StreamedNameTable[nFile]);
+	
+		mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
+	}
 	if ( mp3Stream[nStream] )
 	{
 		AIL_set_stream_loop_count(mp3Stream[nStream], 1);
diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp
index fdd449f7..2d9f9e86 100644
--- a/src/audio/sampman_oal.cpp
+++ b/src/audio/sampman_oal.cpp
@@ -894,7 +894,11 @@ cSampleManager::Initialise(void)
 
 		for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ )
 		{	
-			if ( aStream[0] && aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) )
+			if(aStream[0] && (
+#ifdef PS2_AUDIO_PATHS
+				aStream[0]->Open(PS2StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000) || 
+#endif
+				aStream[0]->Open(StreamedNameTable[i], IsThisTrackAt16KHz(i) ? 16000 : 32000)))
 			{
 				uint32 tatalms = aStream[0]->GetLengthMS();
 				aStream[0]->Close();
@@ -1601,8 +1605,6 @@ cSampleManager::StopChannel(uint32 nChannel)
 void
 cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
 {
-	char filename[MAX_PATH];
-	
 	ASSERT( nStream < MAX_STREAMS );
 
 	if ( nFile < TOTAL_STREAMED_SOUNDS )
@@ -1611,9 +1613,10 @@ cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream)
 
 		stream->Close();
 
-		strcpy(filename, StreamedNameTable[nFile]);
-		
-		stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
+#ifdef PS2_AUDIO_PATHS
+		if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
+#endif
+			stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
 		if ( !stream->Setup() )
 		{
 			stream->Close();
@@ -1673,10 +1676,11 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 				// Try to continue from previous song, if already started
 				if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
 					nFile = 0;
-					strcpy(filename, StreamedNameTable[nFile]);
-
 					CStream *stream = aStream[nStream];
-					stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
+#ifdef PS2_AUDIO_PATHS
+					if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
+#endif
+						stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
 					if ( stream->Setup() ) {
 						if (position != 0)
 							stream->SetPosMS(position);
@@ -1725,10 +1729,11 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 					{
 						nFile = 0;
 						_bIsMp3Active = 0;
-						strcpy(filename, StreamedNameTable[nFile]);
-
-						CStream* stream = aStream[nStream];
-						stream->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
+						CStream *stream = aStream[nStream];
+#ifdef PS2_AUDIO_PATHS
+						if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
+#endif
+							stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
 
 						if (stream->Setup()) {
 							if (position != 0)
@@ -1768,11 +1773,11 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
 		position = 0;
 		nFile = 0;
 	}
-	strcpy(filename, StreamedNameTable[nFile]);
-	
 	CStream *stream = aStream[nStream];
-
-	aStream[nStream]->Open(filename, IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
+#ifdef PS2_AUDIO_PATHS
+	if(!stream->Open(PS2StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000))
+#endif
+		stream->Open(StreamedNameTable[nFile], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
 	
 	if ( stream->Setup() ) {
 		if (position != 0)
diff --git a/src/core/config.h b/src/core/config.h
index 885f98b8..8f5cfb3d 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -420,7 +420,7 @@ enum Config {
 #define RADIO_SCROLL_TO_PREV_STATION
 #define AUDIO_CACHE
 #define PS2_AUDIO_CHANNELS // increases the maximum number of audio channels to PS2 value of 44 (PC has 28 originally)
-//#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds)
+#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds)
 //#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder
 #define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files
 #define PAUSE_RADIO_IN_FRONTEND // pause radio when game is paused