PCem
view src/sound_speaker.c @ 132:2b9cea0be424
Improvements to PC speaker - fixes sound on Beyond Castle Wolfenstein and probably other games as well.
| author | TomW |
|---|---|
| date | Wed Jul 16 20:44:29 2014 +0100 |
| parents | 923b243eba54 |
| children |
line source
1 #include "ibm.h"
2 #include "sound.h"
3 #include "sound_speaker.h"
5 int speaker_mute = 0;
7 static int16_t speaker_buffer[SOUNDBUFLEN];
9 static int speaker_pos = 0;
11 int speaker_gated = 0;
12 int speaker_enable = 0, was_speaker_enable = 0;
14 static void speaker_poll(void *p)
15 {
16 if (speaker_pos >= SOUNDBUFLEN) return;
18 // printf("SPeaker - %i %i %i %02X\n",speakval,gated,speakon,pit.m[2]);
19 if (speaker_gated && was_speaker_enable)
20 {
21 if (!pit.m[2] || pit.m[2]==4)
22 speaker_buffer[speaker_pos] = speakval;
23 else
24 speaker_buffer[speaker_pos] = speakon ? 0x1400 : 0;
25 }
26 else
27 speaker_buffer[speaker_pos] = was_speaker_enable ? 0x1400 : 0;
28 speaker_pos++;
29 if (!speaker_enable)
30 was_speaker_enable = 0;
31 }
33 static void speaker_get_buffer(int16_t *buffer, int len, void *p)
34 {
35 int c;
37 if (!speaker_mute)
38 {
39 for (c = 0; c < len * 2; c++)
40 buffer[c] += speaker_buffer[c >> 1];
41 }
43 speaker_pos = 0;
44 }
46 void speaker_init()
47 {
48 sound_add_handler(speaker_poll, speaker_get_buffer, NULL);
49 speaker_mute = 0;
50 }
