Sound.cpp: Update

- minor, non-function changing updates like float value changes, some unrolled sections
- break soundEvent into separate 8 / 16 bit data writes.
This commit is contained in:
retro-wertz 2019-04-28 17:03:42 +08:00 committed by Rafael Kitover
parent a4eae8025e
commit 0a95486fd8
4 changed files with 36 additions and 33 deletions

View File

@ -2849,8 +2849,8 @@ void CPUUpdateRegister(uint32_t address, uint16_t value)
case 0x7c: case 0x7c:
case 0x80: case 0x80:
case 0x84: case 0x84:
soundEvent(address & 0xFF, (uint8_t)(value & 0xFF)); soundEvent8(address & 0xFF, (uint8_t)(value & 0xFF));
soundEvent((address & 0xFF) + 1, (uint8_t)(value >> 8)); soundEvent8((address & 0xFF) + 1, (uint8_t)(value >> 8));
break; break;
case 0x82: case 0x82:
case 0x88: case 0x88:
@ -2866,7 +2866,7 @@ void CPUUpdateRegister(uint32_t address, uint16_t value)
case 0x9a: case 0x9a:
case 0x9c: case 0x9c:
case 0x9e: case 0x9e:
soundEvent(address & 0xFF, value); soundEvent16(address & 0xFF, value);
break; break;
case 0xB0: case 0xB0:
DM0SAD_L = value; DM0SAD_L = value;

View File

@ -723,7 +723,7 @@ static inline void CPUWriteByte(uint32_t address, uint8_t b)
case 0x9d: case 0x9d:
case 0x9e: case 0x9e:
case 0x9f: case 0x9f:
soundEvent(address & 0xFF, b); soundEvent8(address & 0xFF, b);
break; break;
case 0x301: // HALTCNT, undocumented case 0x301: // HALTCNT, undocumented
if (b == 0x80) if (b == 0x80)

View File

@ -50,8 +50,8 @@ int soundTicks = SOUND_CLOCK_TICKS_;
static float soundVolume = 1.0f; static float soundVolume = 1.0f;
static int soundEnableFlag = 0x3ff; // emulator channels enabled static int soundEnableFlag = 0x3ff; // emulator channels enabled
static float soundFiltering_ = -1; static float soundFiltering_ = -1.0f;
static float soundVolume_ = -1; static float soundVolume_ = -1.0f;
void interp_rate() { /* empty for now */} void interp_rate() { /* empty for now */}
@ -161,7 +161,7 @@ void Gba_Pcm::update(int dac)
int period = time - last_time; int period = time - last_time;
int idx = (unsigned)period / 512; int idx = (unsigned)period / 512;
if (idx >= 3) if (idx > 3)
idx = 3; idx = 3;
static int const filters[4] = { 0, 0, 1, 2 }; static int const filters[4] = { 0, 0, 1, 2 };
@ -188,8 +188,8 @@ void Gba_Pcm_Fifo::timer_overflowed(int which_timer)
// Not filled by DMA, so fill with 16 bytes of silence // Not filled by DMA, so fill with 16 bytes of silence
int reg = which ? FIFOB_L : FIFOA_L; int reg = which ? FIFOB_L : FIFOA_L;
for (int n = 8; n--;) { for (int n = 8; n--;) {
soundEvent(reg, (uint16_t)0); soundEvent16(reg, (uint16_t)0);
soundEvent(reg + 2, (uint16_t)0); soundEvent16(reg + 2, (uint16_t)0);
} }
} }
} }
@ -237,21 +237,21 @@ static void apply_control()
static int gba_to_gb_sound(int addr) static int gba_to_gb_sound(int addr)
{ {
static const int table[0x40] = { static const int table[0x40] = {
0xFF10, 0, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0, 0, 0xFF10, 0, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0, 0, // 0x60
0xFF16, 0xFF17, 0, 0, 0xFF18, 0xFF19, 0, 0, 0xFF16, 0xFF17, 0, 0, 0xFF18, 0xFF19, 0, 0, // 0x68
0xFF1A, 0, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0, 0, 0xFF1A, 0, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0, 0, // 0x70
0xFF20, 0xFF21, 0, 0, 0xFF22, 0xFF23, 0, 0, 0xFF20, 0xFF21, 0, 0, 0xFF22, 0xFF23, 0, 0, // 0x78
0xFF24, 0xFF25, 0, 0, 0xFF26, 0, 0, 0, 0xFF24, 0xFF25, 0, 0, 0xFF26, 0, 0, 0, // 0x80
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x88
0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, // 0x90
0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, // 0x98
}; };
if (addr >= 0x60 && addr < 0xA0) if (addr >= 0x60 && addr < 0xA0)
return table[addr - 0x60]; return table[addr - 0x60];
return 0; return 0;
} }
void soundEvent(uint32_t address, uint8_t data) void soundEvent8(uint32_t address, uint8_t data)
{ {
int gb_addr = gba_to_gb_sound(address); int gb_addr = gba_to_gb_sound(address);
if (gb_addr) { if (gb_addr) {
@ -271,13 +271,15 @@ static void apply_volume(bool apu_only = false)
soundVolume_ = soundVolume; soundVolume_ = soundVolume;
if (gb_apu) { if (gb_apu) {
static float const apu_vols[4] = { 0.25, 0.5, 1, 0.25 }; static float const apu_vols[4] = { 0.25f, 0.5f, 1.0f, 0.25f };
gb_apu->volume(soundVolume_ * apu_vols[ioMem[SGCNT0_H] & 3]); gb_apu->volume(soundVolume_ * apu_vols[ioMem[SGCNT0_H] & 3]);
} }
if (!apu_only) { if (!apu_only) {
for (int i = 0; i < 3; i++) double synth_vol = 0.66 / 256.0 * soundVolume_;
pcm_synth[i].volume(0.66 / 256 * soundVolume_); pcm_synth[0].volume(synth_vol);
pcm_synth[1].volume(synth_vol);
pcm_synth[2].volume(synth_vol);
} }
} }
@ -289,7 +291,7 @@ static void write_SGCNT0_H(int data)
apply_volume(true); apply_volume(true);
} }
void soundEvent(uint32_t address, uint16_t data) void soundEvent16(uint32_t address, uint16_t data)
{ {
switch (address) { switch (address) {
case SGCNT0_H: case SGCNT0_H:
@ -308,14 +310,14 @@ void soundEvent(uint32_t address, uint16_t data)
WRITE16LE(&ioMem[address], data); WRITE16LE(&ioMem[address], data);
break; break;
case 0x88: case SOUNDBIAS:
data &= 0xC3FF; data &= 0xC3FF;
WRITE16LE(&ioMem[address], data); WRITE16LE(&ioMem[address], data);
break; break;
default: default:
soundEvent(address & ~1, (uint8_t)(data)); // even soundEvent8(address & ~1, (uint8_t)(data)); // even
soundEvent(address | 1, (uint8_t)(data >> 8)); // odd soundEvent8(address | 1, (uint8_t)(data >> 8)); // odd
break; break;
} }
} }
@ -523,7 +525,7 @@ void soundReset()
soundPaused = true; soundPaused = true;
soundTicks = 0; soundTicks = 0;
soundEvent(NR52, (uint8_t)0x80); soundEvent8(NR52, (uint8_t)0x80);
} }
bool soundInit() bool soundInit()

View File

@ -48,18 +48,19 @@ extern float soundFiltering; // 0.0 = none, 1.0 = max
//// GBA sound emulation //// GBA sound emulation
// GBA sound registers // GBA sound registers
#define SGCNT0_H 0x82 #define SGCNT0_H 0x82
#define FIFOA_L 0xa0 #define SOUNDBIAS 0x88
#define FIFOA_H 0xa2 #define FIFOA_L 0xa0
#define FIFOB_L 0xa4 #define FIFOA_H 0xa2
#define FIFOB_H 0xa6 #define FIFOB_L 0xa4
#define FIFOB_H 0xa6
// Resets emulated sound hardware // Resets emulated sound hardware
void soundReset(); void soundReset();
// Emulates write to sound hardware // Emulates write to sound hardware
void soundEvent(uint32_t addr, uint8_t data); void soundEvent8(uint32_t addr, uint8_t data);
void soundEvent(uint32_t addr, uint16_t data); // TODO: error-prone to overload like this void soundEvent16(uint32_t addr, uint16_t data); // TODO: error-prone to overload like this
// Notifies emulator that a timer has overflowed // Notifies emulator that a timer has overflowed
void soundTimerOverflow(int which); void soundTimerOverflow(int which);