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