Fix hijacking of the CD audio filter by VIA AC97
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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));
|
||||
|
Reference in New Issue
Block a user