Refactored sound code - slight speedup.
This commit is contained in:
parent
0b6be244ac
commit
3a57341837
33 changed files with 706 additions and 535 deletions
|
|
@ -26,65 +26,62 @@ typedef struct cms_t
|
|||
int pos;
|
||||
} cms_t;
|
||||
|
||||
void cms_poll(void *p)
|
||||
void cms_update(cms_t *cms)
|
||||
{
|
||||
cms_t *cms = (cms_t *)p;
|
||||
int c, d;
|
||||
int16_t out_l = 0, out_r = 0;
|
||||
|
||||
if (cms->pos >= SOUNDBUFLEN)
|
||||
return;
|
||||
|
||||
for (c = 0; c < 4; c++)
|
||||
for (; cms->pos < sound_pos_global; cms->pos++)
|
||||
{
|
||||
switch (cms->noisetype[c >> 1][c & 1])
|
||||
int c, d;
|
||||
int16_t out_l = 0, out_r = 0;
|
||||
|
||||
for (c = 0; c < 4; c++)
|
||||
{
|
||||
case 0: cms->noisefreq[c >> 1][c & 1] = 31250; break;
|
||||
case 1: cms->noisefreq[c >> 1][c & 1] = 15625; break;
|
||||
case 2: cms->noisefreq[c >> 1][c & 1] = 7812; break;
|
||||
case 3: cms->noisefreq[c >> 1][c & 1] = cms->freq[c >> 1][(c & 1) * 3]; break;
|
||||
}
|
||||
}
|
||||
for (c = 0; c < 2; c ++)
|
||||
{
|
||||
if (cms->regs[c][0x1C] & 1)
|
||||
{
|
||||
for (d = 0; d < 6; d++)
|
||||
switch (cms->noisetype[c >> 1][c & 1])
|
||||
{
|
||||
if (cms->regs[c][0x14] & (1 << d))
|
||||
case 0: cms->noisefreq[c >> 1][c & 1] = 31250; break;
|
||||
case 1: cms->noisefreq[c >> 1][c & 1] = 15625; break;
|
||||
case 2: cms->noisefreq[c >> 1][c & 1] = 7812; break;
|
||||
case 3: cms->noisefreq[c >> 1][c & 1] = cms->freq[c >> 1][(c & 1) * 3]; break;
|
||||
}
|
||||
}
|
||||
for (c = 0; c < 2; c ++)
|
||||
{
|
||||
if (cms->regs[c][0x1C] & 1)
|
||||
{
|
||||
for (d = 0; d < 6; d++)
|
||||
{
|
||||
if (cms->stat[c][d]) out_l += (cms->vol[c][d][0] * 90);
|
||||
if (cms->stat[c][d]) out_r += (cms->vol[c][d][1] * 90);
|
||||
cms->count[c][d] += cms->freq[c][d];
|
||||
if (cms->count[c][d] >= 24000)
|
||||
if (cms->regs[c][0x14] & (1 << d))
|
||||
{
|
||||
cms->count[c][d] -= 24000;
|
||||
cms->stat[c][d] ^= 1;
|
||||
if (cms->stat[c][d]) out_l += (cms->vol[c][d][0] * 90);
|
||||
if (cms->stat[c][d]) out_r += (cms->vol[c][d][1] * 90);
|
||||
cms->count[c][d] += cms->freq[c][d];
|
||||
if (cms->count[c][d] >= 24000)
|
||||
{
|
||||
cms->count[c][d] -= 24000;
|
||||
cms->stat[c][d] ^= 1;
|
||||
}
|
||||
}
|
||||
else if (cms->regs[c][0x15] & (1 << d))
|
||||
{
|
||||
if (cms->noise[c][d / 3] & 1) out_l += (cms->vol[c][d][0] * 90);
|
||||
if (cms->noise[c][d / 3] & 1) out_r += (cms->vol[c][d][0] * 90);
|
||||
}
|
||||
}
|
||||
else if (cms->regs[c][0x15] & (1 << d))
|
||||
for (d = 0; d < 2; d++)
|
||||
{
|
||||
if (cms->noise[c][d / 3] & 1) out_l += (cms->vol[c][d][0] * 90);
|
||||
if (cms->noise[c][d / 3] & 1) out_r += (cms->vol[c][d][0] * 90);
|
||||
}
|
||||
}
|
||||
for (d = 0; d < 2; d++)
|
||||
{
|
||||
cms->noisecount[c][d] += cms->noisefreq[c][d];
|
||||
while (cms->noisecount[c][d] >= 24000)
|
||||
{
|
||||
cms->noisecount[c][d] -= 24000;
|
||||
cms->noise[c][d] <<= 1;
|
||||
if (!(((cms->noise[c][d] & 0x4000) >> 8) ^ (cms->noise[c][d] & 0x40)))
|
||||
cms->noise[c][d] |= 1;
|
||||
cms->noisecount[c][d] += cms->noisefreq[c][d];
|
||||
while (cms->noisecount[c][d] >= 24000)
|
||||
{
|
||||
cms->noisecount[c][d] -= 24000;
|
||||
cms->noise[c][d] <<= 1;
|
||||
if (!(((cms->noise[c][d] & 0x4000) >> 8) ^ (cms->noise[c][d] & 0x40)))
|
||||
cms->noise[c][d] |= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cms->buffer[(cms->pos << 1)] = out_l;
|
||||
cms->buffer[(cms->pos << 1) + 1] = out_r;
|
||||
}
|
||||
cms->buffer[(cms->pos << 1)] = out_l;
|
||||
cms->buffer[(cms->pos << 1) + 1] = out_r;
|
||||
|
||||
cms->pos++;
|
||||
}
|
||||
|
||||
void cms_get_buffer(int16_t *buffer, int len, void *p)
|
||||
|
|
@ -93,6 +90,8 @@ void cms_get_buffer(int16_t *buffer, int len, void *p)
|
|||
|
||||
int c;
|
||||
|
||||
cms_update(cms);
|
||||
|
||||
for (c = 0; c < len * 2; c++)
|
||||
buffer[c] += cms->buffer[c];
|
||||
|
||||
|
|
@ -111,6 +110,7 @@ void cms_write(uint16_t addr, uint8_t val, void *p)
|
|||
cms->addrs[chip] = val & 31;
|
||||
else
|
||||
{
|
||||
cms_update(cms);
|
||||
cms->regs[chip][cms->addrs[chip] & 31] = val;
|
||||
switch (cms->addrs[chip] & 31)
|
||||
{
|
||||
|
|
@ -159,7 +159,7 @@ void *cms_init()
|
|||
|
||||
pclog("cms_init\n");
|
||||
io_sethandler(0x0220, 0x0004, cms_read, NULL, NULL, cms_write, NULL, NULL, cms);
|
||||
sound_add_handler(cms_poll, cms_get_buffer, cms);
|
||||
sound_add_handler(cms_get_buffer, cms);
|
||||
return cms;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue