1 // Audio Output
2 #include "burner.h"
3 
4 INT32 nAudSampleRate[8] = { 44100, 44100, 22050, 22050, 22050, 22050, 22050, 22050 };			// sample rate
5 INT32 nAudVolume = 10000;				// Sound volume (% * 100)
6 INT32 nAudSegCount = 6;				// Segs in the pdsbLoop buffer
7 INT32 nAudSegLen = 0;					// Seg length in samples (calculated from Rate/Fps)
8 INT32 nAudAllocSegLen = 0;
9 UINT8 bAudOkay = 0;			// True if DSound was initted okay
10 UINT8 bAudPlaying = 0;		// True if the Loop buffer is playing
11 
12 INT32 nAudDSPModule[8] = { 0, };				// DSP module to use: 0 = none, 1 = low-pass filter
13 
14 INT16* nAudNextSound = NULL;		// The next sound seg we will add to the sample loop
15 
16 UINT32 nAudSelect = 0;		// Which audio plugin is selected
17 static UINT32 nAudActive = 0;
18 
19 #if defined (BUILD_WIN32)
20 	extern struct AudOut AudOutDx;
21 	extern struct AudOut AudOutXAudio2;
22 #elif defined (BUILD_MACOS)
23     extern struct AudOut AudOutMacOS;
24 #elif defined (BUILD_SDL)
25 	extern struct AudOut AudOutSDL;
26 #elif defined (BUILD_SDL2)
27 	#if defined (FORCE_PULSE_AUDIO)
28 		extern struct AudOut AudOutPulseSimple;
29 	#else
30 		extern struct AudOut AudOutSDL;
31 	#endif
32 #elif defined (_XBOX)
33 	extern struct AudOut AudOutXAudio2;
34 #elif defined (BUILD_QT)
35 #ifdef BUILD_QT_LINUX
36     extern struct AudOut AudOutPulseSimple;
37 #endif
38     extern struct AudOut AudOutQtSound;
39 #endif
40 
41 static struct AudOut *pAudOut[]=
42 {
43 #if defined (BUILD_WIN32)
44 	&AudOutDx,
45 	&AudOutXAudio2,
46 #elif defined (BUILD_MACOS)
47     &AudOutMacOS,
48 #elif defined (BUILD_SDL)
49 	&AudOutSDL,
50 #elif defined (BUILD_SDL2)
51 	#if defined (FORCE_PULSE_AUDIO)
52 		&AudOutPulseSimple,
53 	#else
54 		&AudOutSDL,
55 	#endif
56 #elif defined (_XBOX)
57 	&AudOutXAudio2,
58 #elif defined (BUILD_QT)
59 #ifdef BUILD_QT_LINUX
60     &AudOutPulseSimple,
61 #endif
62     &AudOutQtSound,
63 #endif
64 };
65 
66 #define AUD_LEN (sizeof(pAudOut)/sizeof(pAudOut[0]))
67 
68 static InterfaceInfo AudInfo = { NULL, NULL, NULL };
69 
AudBlankSound()70 INT32 AudBlankSound()
71 {
72 	if (!bAudOkay || nAudActive >= AUD_LEN) {
73 		return 1;
74 	}
75 	return pAudOut[nAudActive]->BlankSound();
76 }
77 
78 // This function checks the Sound loop, and if necessary gets some more sound
AudSoundCheck()79 INT32 AudSoundCheck()
80 {
81 	if (!bAudOkay || nAudActive >= AUD_LEN) {
82 		return 1;
83 	}
84 	return pAudOut[nAudActive]->SoundCheck();
85 }
86 
AudSoundInit()87 INT32 AudSoundInit()
88 {
89 	INT32 nRet;
90 
91 	if (nAudSelect >= AUD_LEN) {
92 		return 1;
93 	}
94 
95 	nAudActive = nAudSelect;
96 
97 	if ((nRet = pAudOut[nAudActive]->SoundInit()) == 0) {
98 		bAudOkay = true;
99 	}
100 
101 	return nRet;
102 }
103 
AudSetCallback(INT32 (* pCallback)(INT32))104 INT32 AudSetCallback(INT32 (*pCallback)(INT32))
105 {
106 	if (!bAudOkay || nAudActive >= AUD_LEN) {
107 		return 1;
108 	}
109 	return pAudOut[nAudActive]->SetCallback(pCallback);
110 }
111 
AudSoundPlay()112 INT32 AudSoundPlay()
113 {
114 	if (!bAudOkay || nAudActive >= AUD_LEN) {
115 		return 1;
116 	}
117 
118 	INT32 nRet = pAudOut[nAudActive]->SoundPlay();
119 	if (!nRet) {
120 		bAudPlaying = true;
121 	}
122 
123 	return nRet;
124 }
125 
AudSoundStop()126 INT32 AudSoundStop()
127 {
128 	if (nAudActive >= AUD_LEN) {
129 		return 1;
130 	}
131 
132 	bAudPlaying = false;
133 
134 	return pAudOut[nAudActive]->SoundStop();
135 }
136 
AudSoundExit()137 INT32 AudSoundExit()
138 {
139 	IntInfoFree(&AudInfo);
140 
141 	if (!bAudOkay || nAudActive >= AUD_LEN) {
142 		return 1;
143 	}
144 	bAudOkay = false;
145 
146 	INT32 nRet = pAudOut[nAudActive]->SoundExit();
147 
148 	nAudActive = 0;
149 
150 	return nRet;
151 }
152 
AudSoundSetVolume()153 INT32 AudSoundSetVolume()
154 {
155 	if (!bAudOkay || nAudActive >= AUD_LEN) {
156 		return 1;
157 	}
158 	return pAudOut[nAudActive]->SoundSetVolume();
159 }
160 
AudGetInfo()161 InterfaceInfo* AudGetInfo()
162 {
163 	if (IntInfoInit(&AudInfo)) {
164 		IntInfoFree(&AudInfo);
165 		return NULL;
166 	}
167 
168 	if (bAudOkay) {
169 		TCHAR szString[MAX_PATH] = _T("");
170 
171 		AudInfo.pszModuleName = pAudOut[nAudActive]->szModuleName;
172 
173 		_sntprintf(szString, MAX_PATH, _T("Playback at %iHz, %i%% volume"), nAudSampleRate[nAudActive], nAudVolume / 100);
174 		IntInfoAddStringInterface(&AudInfo, szString);
175 
176 		if (nAudDSPModule[nAudActive]) {
177 			IntInfoAddStringInterface(&AudInfo, _T("Applying low-pass filter"));
178 		}
179 
180 	 	if (pAudOut[nAudSelect]->GetPluginSettings) {
181 			pAudOut[nAudSelect]->GetPluginSettings(&AudInfo);
182 		}
183 	} else {
184 		IntInfoAddStringInterface(&AudInfo, _T("Audio plugin not initialised"));
185 	}
186 
187 	return &AudInfo;
188 }
189 
AudSelect(UINT32 nPlugIn)190 INT32 AudSelect(UINT32 nPlugIn)
191 {
192 	if (nPlugIn < AUD_LEN) {
193 		nAudSelect = nPlugIn;
194 		return 0;
195 	}
196 
197 	return 1;
198 }
199 
AudWriteSilence()200 void AudWriteSilence()
201 {
202 	if (nAudNextSound) {
203 		memset(nAudNextSound, 0, nAudAllocSegLen);
204 	}
205 }
206