@@ -166,15 +166,15 @@ var |
| 166 |
|
166 |
|
| 167 |
implementation |
167 |
implementation |
| 168 |
|
168 |
|
| 169 |
uses vars, bass; |
169 |
uses vars, sdl2; |
| 170 |
|
170 |
|
| 171 |
const |
171 |
const |
| 172 |
playbackFrequency = 44100; |
172 |
playbackFrequency = 44100; |
| 173 |
sampleCycles: longint = (8192 * 1024) div playbackFrequency; |
173 |
sampleCycles: longint = (8192 * 1024) div playbackFrequency; |
| 174 |
TooFullThreshold: DWORD = (playbackFrequency div 10)*sizeof(single); //0.1s |
174 |
TooFullThreshold: Integer = (playbackFrequency div 10)*sizeof(single); //0.1s |
| 175 |
|
175 |
|
| 176 |
var |
176 |
var |
| 177 |
playStream: HStream; |
177 |
playStream: TSDL_AudioDeviceID; |
| 178 |
bufCycles, bufLVal, bufRVal: integer; |
178 |
bufCycles, bufLVal, bufRVal: integer; |
| 179 |
|
179 |
|
| 180 |
procedure ResetSound; |
180 |
procedure ResetSound; |
@@ -198,27 +198,34 @@ end; |
| 198 |
|
198 |
|
| 199 |
function SoundBufferTooFull: Boolean; |
199 |
function SoundBufferTooFull: Boolean; |
| 200 |
begin |
200 |
begin |
| 201 |
Result := BASS_ChannelGetData(PlayStream, nil, BASS_DATA_AVAILABLE) > TooFullThreshold; |
201 |
Result := SoundBufferSize > TooFullThreshold |
| 202 |
end; |
202 |
end; |
| 203 |
|
203 |
|
| 204 |
function SoundBufferSize: Integer; |
204 |
function SoundBufferSize: Integer; |
| 205 |
begin |
205 |
begin |
| 206 |
Result := BASS_ChannelGetData(PlayStream, nil, BASS_DATA_AVAILABLE); |
206 |
Result := SDL_GetQueuedAudioSize(playStream) |
| 207 |
end; |
207 |
end; |
| 208 |
|
208 |
|
| 209 |
procedure EnableSound; |
209 |
procedure EnableSound; |
|
|
210 |
var |
|
|
211 |
Want, Have: TSDL_AudioSpec; |
| 210 |
begin |
212 |
begin |
| 211 |
if soundEnable then |
213 |
if soundEnable then |
| 212 |
exit; |
214 |
exit; |
| 213 |
|
215 |
|
| 214 |
BASS_Init(-1, playbackFrequency, 0, 0, nil); |
216 |
Want := Default(TSDL_AudioSpec); |
| 215 |
PlayStream := BASS_StreamCreate( |
217 |
Have := Default(TSDL_AudioSpec); |
| 216 |
playbackFrequency, |
218 |
|
| 217 |
2, |
219 |
SDL_Init(SDL_INIT_AUDIO); |
| 218 |
BASS_SAMPLE_FLOAT, |
220 |
|
| 219 |
StreamProc(STREAMPROC_PUSH), |
221 |
Want.freq := playbackFrequency; |
| 220 |
nil); |
222 |
Want.format := AUDIO_F32; |
| 221 |
BASS_ChannelPlay(PlayStream, True); |
223 |
Want.channels := 2; |
|
|
224 |
Want.samples := 512; //???? |
|
|
225 |
Want.callback := nil; |
|
|
226 |
|
|
|
227 |
PlayStream := SDL_OpenAudioDevice(nil, 0, @Want, @Have, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); |
|
|
228 |
SDL_PauseAudioDevice(playStream, 0); |
| 222 |
|
229 |
|
| 223 |
soundEnable := True; |
230 |
soundEnable := True; |
| 224 |
bufCycles := 0; |
231 |
bufCycles := 0; |
@@ -231,7 +238,8 @@ begin |
| 231 |
if not soundEnable then |
238 |
if not soundEnable then |
| 232 |
exit; |
239 |
exit; |
| 233 |
|
240 |
|
| 234 |
BASS_Free; |
241 |
SDL_CloseAudioDevice(playStream); |
|
|
242 |
SDL_Quit; |
| 235 |
|
243 |
|
| 236 |
soundEnable := False; |
244 |
soundEnable := False; |
| 237 |
end; |
245 |
end; |
@@ -250,7 +258,7 @@ begin |
| 250 |
bufCycles := 0; |
258 |
bufCycles := 0; |
| 251 |
bufLVal := 0; |
259 |
bufLVal := 0; |
| 252 |
bufRVal := 0; |
260 |
bufRVal := 0; |
| 253 |
BASS_StreamPutData(PlayStream, @buf, 8 {2 32-bit float samples}); |
261 |
SDL_QueueAudio(playStream, @buf, 8); |
| 254 |
end; |
262 |
end; |
| 255 |
end; |
263 |
end; |
| 256 |
|
264 |
|