AD1848: Extend ad1848_filter_aux2 to any channel

This commit is contained in:
Alexander Babikov
2025-09-11 16:49:38 +05:00
parent a59eb526ed
commit 14cf9ee80b
3 changed files with 11 additions and 7 deletions

View File

@@ -97,7 +97,7 @@ extern void ad1848_update(ad1848_t *ad1848);
extern void ad1848_speed_changed(ad1848_t *ad1848); extern void ad1848_speed_changed(ad1848_t *ad1848);
extern void ad1848_set_cd_audio_channel(void *priv, int channel); extern void ad1848_set_cd_audio_channel(void *priv, int channel);
extern void ad1848_filter_cd_audio(int channel, double *buffer, void *priv); extern void ad1848_filter_cd_audio(int channel, double *buffer, void *priv);
extern void ad1848_filter_aux2(void* priv, double* out_l, double* out_r); extern void ad1848_filter_channel(void* priv, int channel, double* out_l, double* out_r);
extern void ad1848_init(ad1848_t *ad1848, uint8_t type); extern void ad1848_init(ad1848_t *ad1848, uint8_t type);

View File

@@ -770,20 +770,24 @@ ad1848_filter_cd_audio(int channel, double *buffer, void *priv)
} }
void void
ad1848_filter_aux2(void *priv, double *out_l, double *out_r) ad1848_filter_channel(void *priv, int channel, double *out_l, double *out_r)
{ {
const ad1848_t *ad1848 = (ad1848_t *) priv; const ad1848_t *ad1848 = (ad1848_t *) priv;
if (ad1848->regs[4] & 0x80) { const int max_channel = (ad1848->type >= AD1848_TYPE_CS4231) ? 31 : 15;
if (channel > max_channel)
channel = max_channel;
if (ad1848->regs[channel] & 0x80) {
*out_l = 0.0; *out_l = 0.0;
} else { } else {
*out_l = ((*out_l) * ad1848_vols_5bits_aux_gain[ad1848->regs[4] & 0x1f]) / 65536.0; *out_l = ((*out_l) * ad1848_vols_5bits_aux_gain[ad1848->regs[channel] & 0x1f]) / 65536.0;
} }
if (ad1848->regs[5] & 0x80) { if (ad1848->regs[channel + 1] & 0x80) {
*out_r = 0.0; *out_r = 0.0;
} else { } else {
*out_r = ((*out_r) * ad1848_vols_5bits_aux_gain[ad1848->regs[5] & 0x1f]) / 65536.0; *out_r = ((*out_r) * ad1848_vols_5bits_aux_gain[ad1848->regs[channel + 1] & 0x1f]) / 65536.0;
} }
} }

View File

@@ -85,7 +85,7 @@ optimc_filter_opl(void *priv, double *out_l, double *out_r)
if (optimc->cur_wss_enabled) { if (optimc->cur_wss_enabled) {
*out_l /= optimc->sb->mixer_sbpro.fm_l; *out_l /= optimc->sb->mixer_sbpro.fm_l;
*out_r /= optimc->sb->mixer_sbpro.fm_r; *out_r /= optimc->sb->mixer_sbpro.fm_r;
ad1848_filter_aux2((void *) &optimc->ad1848, out_l, out_r); ad1848_filter_channel((void *) &optimc->ad1848, AD1848_AUX2, out_l, out_r);
} }
} }