... | ... |
@@ -37,11 +37,11 @@ envelope(Apu *c, Uint32 age) |
37 | 37 |
return 0x0000; |
38 | 38 |
} |
39 | 39 |
|
40 |
-void |
|
40 |
+int |
|
41 | 41 |
apu_render(Apu *c, Sint16 *sample, Sint16 *end) |
42 | 42 |
{ |
43 | 43 |
Sint32 s; |
44 |
- if(!c->advance || !c->period) return; |
|
44 |
+ if(!c->advance || !c->period) return 0; |
|
45 | 45 |
while(sample < end) { |
46 | 46 |
c->count += c->advance; |
47 | 47 |
c->i += c->count / c->period; |
... | ... |
@@ -49,7 +49,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end) |
49 | 49 |
if(c->i >= c->len) { |
50 | 50 |
if(!c->repeat) { |
51 | 51 |
c->advance = 0; |
52 |
- return; |
|
52 |
+ return 1; |
|
53 | 53 |
} |
54 | 54 |
c->i %= c->len; |
55 | 55 |
} |
... | ... |
@@ -57,6 +57,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end) |
57 | 57 |
*sample++ += s * c->volume[0] / 0x180; |
58 | 58 |
*sample++ += s * c->volume[1] / 0x180; |
59 | 59 |
} |
60 |
+ return 1; |
|
60 | 61 |
} |
61 | 62 |
|
62 | 63 |
void |
... | ... |
@@ -51,11 +51,13 @@ error(char *msg, const char *err) |
51 | 51 |
static void |
52 | 52 |
audio_callback(void *u, Uint8 *stream, int len) |
53 | 53 |
{ |
54 |
- int i; |
|
54 |
+ int i, running = 0; |
|
55 | 55 |
Sint16 *samples = (Sint16 *)stream; |
56 | 56 |
SDL_memset(stream, 0, len); |
57 | 57 |
for(i = 0; i < POLYPHONY; ++i) |
58 |
- apu_render(&apu[i], samples, samples + len / 2); |
|
58 |
+ running += apu_render(&apu[i], samples, samples + len / 2); |
|
59 |
+ if(!running) |
|
60 |
+ SDL_PauseAudioDevice(audio_id, 1); |
|
59 | 61 |
(void)u; |
60 | 62 |
} |
61 | 63 |
|
... | ... |
@@ -162,7 +164,6 @@ init(void) |
162 | 164 |
audio_id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0); |
163 | 165 |
if(!audio_id) |
164 | 166 |
return error("Audio", SDL_GetError()); |
165 |
- SDL_PauseAudioDevice(audio_id, 0); |
|
166 | 167 |
return 1; |
167 | 168 |
} |
168 | 169 |
|
... | ... |
@@ -300,6 +301,7 @@ audio_talk(Device *d, Uint8 b0, Uint8 w) |
300 | 301 |
c->repeat = !(d->dat[0xf] & 0x80); |
301 | 302 |
apu_start(c, mempeek16(d->dat, 0x8), d->dat[0xf] & 0x7f); |
302 | 303 |
SDL_UnlockAudioDevice(audio_id); |
304 |
+ SDL_PauseAudioDevice(audio_id, 0); |
|
303 | 305 |
} |
304 | 306 |
} |
305 | 307 |
|