Started pausing the audio device when it's not in use
This commit is contained in:
parent
4622a8a061
commit
8855b96057
|
@ -37,11 +37,11 @@ envelope(Apu *c, Uint32 age)
|
||||||
return 0x0000;
|
return 0x0000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
apu_render(Apu *c, Sint16 *sample, Sint16 *end)
|
apu_render(Apu *c, Sint16 *sample, Sint16 *end)
|
||||||
{
|
{
|
||||||
Sint32 s;
|
Sint32 s;
|
||||||
if(!c->advance || !c->period) return;
|
if(!c->advance || !c->period) return 0;
|
||||||
while(sample < end) {
|
while(sample < end) {
|
||||||
c->count += c->advance;
|
c->count += c->advance;
|
||||||
c->i += c->count / c->period;
|
c->i += c->count / c->period;
|
||||||
|
@ -49,7 +49,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end)
|
||||||
if(c->i >= c->len) {
|
if(c->i >= c->len) {
|
||||||
if(!c->repeat) {
|
if(!c->repeat) {
|
||||||
c->advance = 0;
|
c->advance = 0;
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
c->i %= c->len;
|
c->i %= c->len;
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,7 @@ apu_render(Apu *c, Sint16 *sample, Sint16 *end)
|
||||||
*sample++ += s * c->volume[0] / 0x180;
|
*sample++ += s * c->volume[0] / 0x180;
|
||||||
*sample++ += s * c->volume[1] / 0x180;
|
*sample++ += s * c->volume[1] / 0x180;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -24,6 +24,6 @@ typedef struct {
|
||||||
Uint8 pitch, repeat;
|
Uint8 pitch, repeat;
|
||||||
} Apu;
|
} Apu;
|
||||||
|
|
||||||
void apu_render(Apu *c, Sint16 *sample, Sint16 *end);
|
int apu_render(Apu *c, Sint16 *sample, Sint16 *end);
|
||||||
void apu_start(Apu *c, Uint16 adsr, Uint8 pitch);
|
void apu_start(Apu *c, Uint16 adsr, Uint8 pitch);
|
||||||
Uint8 apu_get_vu(Apu *c);
|
Uint8 apu_get_vu(Apu *c);
|
||||||
|
|
|
@ -51,11 +51,13 @@ error(char *msg, const char *err)
|
||||||
static void
|
static void
|
||||||
audio_callback(void *u, Uint8 *stream, int len)
|
audio_callback(void *u, Uint8 *stream, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i, running = 0;
|
||||||
Sint16 *samples = (Sint16 *)stream;
|
Sint16 *samples = (Sint16 *)stream;
|
||||||
SDL_memset(stream, 0, len);
|
SDL_memset(stream, 0, len);
|
||||||
for(i = 0; i < POLYPHONY; ++i)
|
for(i = 0; i < POLYPHONY; ++i)
|
||||||
apu_render(&apu[i], samples, samples + len / 2);
|
running += apu_render(&apu[i], samples, samples + len / 2);
|
||||||
|
if(!running)
|
||||||
|
SDL_PauseAudioDevice(audio_id, 1);
|
||||||
(void)u;
|
(void)u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +164,6 @@ init(void)
|
||||||
audio_id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0);
|
audio_id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0);
|
||||||
if(!audio_id)
|
if(!audio_id)
|
||||||
return error("Audio", SDL_GetError());
|
return error("Audio", SDL_GetError());
|
||||||
SDL_PauseAudioDevice(audio_id, 0);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,6 +301,7 @@ audio_talk(Device *d, Uint8 b0, Uint8 w)
|
||||||
c->repeat = !(d->dat[0xf] & 0x80);
|
c->repeat = !(d->dat[0xf] & 0x80);
|
||||||
apu_start(c, mempeek16(d->dat, 0x8), d->dat[0xf] & 0x7f);
|
apu_start(c, mempeek16(d->dat, 0x8), d->dat[0xf] & 0x7f);
|
||||||
SDL_UnlockAudioDevice(audio_id);
|
SDL_UnlockAudioDevice(audio_id);
|
||||||
|
SDL_PauseAudioDevice(audio_id, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue