mirror of
https://github.com/polpo/picogus.git
synced 2026-10-25 21:40:16 +00:00
switch to stereo volume control
This commit is contained in:
1 parent
6789a9b702
commit
1810d43b26
5 files changed
+50
-36
No files matched your search
+16
-11
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user