Fix hijacking of the CD audio filter by VIA AC97

This commit is contained in:
RichardG867
2021-11-20 22:59:08 -03:00
parent 96439dac3d
commit 1e98d531f2
4 changed files with 15 additions and 8 deletions

View File

@@ -824,6 +824,9 @@ pipc_sb_handlers(pipc_t *dev, uint8_t modem)
sb_dsp_setirq(&dev->sb->dsp, (irq == 11) ? 10 : irq);
sb_dsp_setdma8(&dev->sb->dsp, (dev->ac97_regs[0][0x43] >> 4) & 0x03);
/* Set up CD audio filter. This might not actually work if VIAUDIO writes to CD volume through AC97. */
sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb);
}
if (dev->ac97_regs[0][0x42] & 0x02) {

View File

@@ -87,6 +87,7 @@ ac97_via_log(const char *fmt, ...)
static void ac97_via_sgd_process(void *priv);
static void ac97_via_update_codec(ac97_via_t *dev);
static void ac97_via_speed_changed(void *priv);
static void ac97_via_filter_cd_audio(int channel, double *buffer, void *priv);
void
@@ -390,8 +391,15 @@ ac97_via_sgd_write(uint16_t addr, uint8_t val, void *priv)
*((uint16_t *) &dev->codec_shadow[modem].regs_codec[i][val & 0x7f]) = *((uint16_t *) &dev->sgd_regs[0x80]));
/* Update primary audio codec state if that codec was written to. */
if (!modem && !i)
if (!modem && !i) {
ac97_via_update_codec(dev);
/* Set up CD audio filter if CD volume was written to. Setting it
up at init prevents CD audio from working on other cards, but
this works as the CD channel is muted by default per AC97 spec. */
if (val == 0x12)
sound_set_cd_audio_filter(ac97_via_filter_cd_audio, dev);
}
}
}
@@ -741,7 +749,7 @@ ac97_via_get_buffer(int32_t *buffer, int len, void *priv)
static void
via_ac97_filter_cd_audio(int channel, double *buffer, void *priv)
ac97_via_filter_cd_audio(int channel, double *buffer, void *priv)
{
ac97_via_t *dev = (ac97_via_t *) priv;
double c, volume = channel ? dev->cd_vol_r : dev->cd_vol_l;
@@ -806,9 +814,6 @@ ac97_via_init(const device_t *info)
/* Set up playback handler. */
sound_add_handler(ac97_via_get_buffer, dev);
/* Set up CD audio filter. */
sound_set_cd_audio_filter(via_ac97_filter_cd_audio, dev);
return dev;
}

View File

@@ -779,9 +779,9 @@ cs423x_init(const device_t *info)
/* Initialize ISAPnP. */
dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev);
/* Initialize SBPro codec first to get the correct CD audio filter for the default
context, which is SBPro. The WSS codec is initialized later by cs423x_reset */
/* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */
dev->sb = device_add(&sb_pro_compat_device);
sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */
/* Initialize RAM, registers and WSS codec. */
cs423x_reset(dev);

View File

@@ -1615,7 +1615,6 @@ sb_pro_compat_init(const device_t *info)
sb->mixer_enabled = 1;
sound_add_handler(sb_get_buffer_sbpro, sb);
sound_set_cd_audio_filter(sbpro_filter_cd_audio, sb);
sb->mpu = (mpu_t *) malloc(sizeof(mpu_t));
memset(sb->mpu, 0, sizeof(mpu_t));