switch to stereo volume control

This commit is contained in:
wbcbz7 committed 2026-03-20 02:10:10 +07:00
1 parent 6789a9b702
commit 1810d43b26
5 files changed
+50 -36

No files matched your search

+16 -11
View File
@@ -24,12 +24,16 @@
#include "volctrl.h"
extern Settings settings;
int32_t opl_volume = 0x10000; // default 1.0x volume
int32_t sb_volume = 0x10000; // default 1.0x volume
int32_t cd_audio_volume = 0x10000; // default 1.0x volume
int32_t gus_volume = 0x10000; // default 1.0x volume
int32_t psg_volume = 0x10000; // default 1.0x volume
// initialize to default 1.0 scale at start
struct volctrl_t volume = {
.opl = {0x10000, 0x10000},
.sb_pcm = {0x10000, 0x10000},
.cd_audio = {0x10000, 0x10000},
.sb_master = {0x10000, 0x10000},
.gus = 0x10000,
.psg = 0x10000,
};
extern struct volctrl_t volume;
int32_t set_volume_scale (uint8_t percent) {
if (percent > 100)
@@ -56,6 +60,7 @@ void set_volume(uint16_t mode) {
switch (mode){
case CMD_MAINVOL:
volume.sb_master[0] = volume.sb_master[1] = 0x10000; // reset SB master volume
set_volume(CMD_OPLVOL);
set_volume(CMD_SBVOL);
set_volume(CMD_CDVOL);
@@ -63,19 +68,19 @@ void set_volume(uint16_t mode) {
set_volume(CMD_PSGVOL);
break;
case CMD_OPLVOL:
opl_volume = set_volume_scale(settings.Volume.oplVol);
volume.opl[0] = volume.opl[1] = set_volume_scale(settings.Volume.oplVol);
break;
case CMD_SBVOL:
sb_volume = set_volume_scale(settings.Volume.sbVol);
volume.sb_pcm[0] = volume.sb_pcm[0] = set_volume_scale(settings.Volume.sbVol);
break;
case CMD_CDVOL:
cd_audio_volume = set_volume_scale(settings.Volume.cdVol);
volume.cd_audio[0] = volume.cd_audio[0] = set_volume_scale(settings.Volume.cdVol);
break;
case CMD_GUSVOL:
gus_volume = set_volume_scale(settings.Volume.gusVol);
volume.gus = set_volume_scale(settings.Volume.gusVol);
break;
case CMD_PSGVOL:
psg_volume = set_volume_scale(settings.Volume.psgVol);
volume.psg = set_volume_scale(settings.Volume.psgVol);
break;
}
}
+10 -5
View File
@@ -27,12 +27,17 @@ extern "C" {
#include "system/flash_settings.h"
#include "clamp.h"
extern int32_t opl_volume;
extern int32_t sb_volume;
extern int32_t cd_audio_volume;
extern int32_t gus_volume;
extern int32_t psg_volume;
struct volctrl_t {
// 0 - left, 1 - right
int32_t opl[2]; // OPL3 (aka MIDI)
int32_t sb_pcm[2]; // SB PCM (aka Voice)
int32_t cd_audio[2]; // CD audio
int32_t sb_master[2]; // SB Master volume
int32_t gus;
int32_t psg;
};
extern struct volctrl_t volume;
extern int32_t set_volume_scale (uint8_t percent);
+1 -1
View File
@@ -616,7 +616,7 @@ class GUSChannels {
// Output stereo sample if DAC enable on
// if ((GUS_reset_reg & 0x02/*DAC enable*/) == 0x02) {
tmpsamp = scale_sample(tmpsamp, gus_volume, 0);
tmpsamp = scale_sample(tmpsamp, volume.gus, 0);
stream[0] += tmpsamp * VolLeft;
stream[1] += tmpsamp * VolRight;
WaveUpdate();
+2 -2
View File
@@ -173,8 +173,8 @@ void play_psg() {
cms.generator(1).generate_frames(buf, SAMPLES_PER_BUFFER);
#endif
for (int i = 0; i < SAMPLES_PER_BUFFER; ++i) {
samples[i << 1] = scale_sample(buf[i << 1], psg_volume, 0);
samples[(i << 1) + 1] = scale_sample(buf[(i << 1) + 1], psg_volume, 0);
samples[i << 1] = scale_sample(buf[i << 1], volume.psg, 0);
samples[(i << 1) + 1] = scale_sample(buf[(i << 1) + 1], volume.psg, 0);
}
buffer->sample_count = SAMPLES_PER_BUFFER;
+21 -17
View File
@@ -105,10 +105,14 @@ static int16_t get_opl_sample()
{
int16_t opl_current_sample;
OPL_Pico_simple(&opl_current_sample, 1);
opl_current_sample = scale_sample(opl_current_sample << 1, opl_volume, 1);
return opl_current_sample;
}
typedef union {
uint32_t data32;
int16_t data16[2];
} sample_pair;
static Resampler<get_opl_sample> resampler;
// Setup values for audio sample clock
@@ -116,11 +120,6 @@ static Resampler<get_opl_sample> resampler;
static constexpr uint32_t clocks_per_sample_minus_one = (SYS_CLK_HZ / 44100) - 1;
static constexpr uint pwm_slice_num = 4; // slices 0-3 are taken by USB joystick support
typedef union {
uint32_t data32;
int16_t data16[2];
} sample_pair;
#ifdef CDROM
static audio_fifo_t* cd_fifo;
#endif
@@ -137,8 +136,8 @@ void audio_sample_handler(void) {
#else
uint32_t card_stereo = sbdsp_sample_stereo();
#endif
sample_l = scale_sample((int16_t)(card_stereo & 0xFFFF), sb_volume, 0);
sample_r = scale_sample((int16_t)(card_stereo >> 16), sb_volume, 0);
sample_l = scale_sample((int16_t)(card_stereo & 0xFFFF), volume.sb_pcm[0], 0);
sample_r = scale_sample((int16_t)(card_stereo >> 16), volume.sb_pcm[1], 0);
}
#endif
@@ -146,8 +145,8 @@ void audio_sample_handler(void) {
static uint32_t cd_index = 0;
const uint32_t has_cd_samples = fifo_take_samples_inline(cd_fifo, 2);
if (has_cd_samples) {
sample_l += scale_sample(cd_fifo->buffer[cd_index++], cd_audio_volume, 0);
sample_r += scale_sample(cd_fifo->buffer[cd_index++], cd_audio_volume, 0);
sample_l += scale_sample(cd_fifo->buffer[cd_index++], volume.cd_audio[0], 0);
sample_r += scale_sample(cd_fifo->buffer[cd_index++], volume.cd_audio[1], 0);
// sample_l += cd_fifo->buffer[cd_index++];
// sample_r += cd_fifo->buffer[cd_index++];
cd_index &= AUDIO_FIFO_BITS;
@@ -158,16 +157,21 @@ void audio_sample_handler(void) {
const uint32_t has_opl_samples = fifo_take_samples_inline(&opl_out_fifo, 1);
if (has_opl_samples) {
int16_t opl_sample = opl_out_fifo.buffer[opl_out_index++];
sample_l += opl_sample;
sample_r += opl_sample;
sample_l += scale_sample(opl_sample, volume.opl[0] << 1, 0);
sample_r += scale_sample(opl_sample, volume.opl[1] << 1, 0);
opl_out_index &= AUDIO_FIFO_BITS;
}
const sample_pair clamped = {.data16 = {
clamp16(sample_l),
clamp16(sample_r)
}};
audio_pio->txf[PICO_AUDIO_I2S_SM] = clamped.data32;
#ifdef SOUND_SB
// apply SB master volume and clamp the output
sample_l = scale_sample(sample_l, volume.sb_master[0], 1);
sample_r = scale_sample(sample_r, volume.sb_master[1], 1);
#else
sample_l = clamp16(sample_l);
sample_r = clamp16(sample_r);
#endif
audio_pio->txf[PICO_AUDIO_I2S_SM] = ((sample_l & 0xFFFF) | (sample_r << 16));
}
void play_adlib() {