Mesen2/Core/PCE/CdRom/PceAudioFader.cpp
Sour c6b86ba887 PCE: CD-ROM emulation improvements
-ADPCM edge cases work better (reset, length latching, dma, etc.)
-BRAM unlocking/locking fixes
-Read ToC command returns the correct amount of data
-SCSI data port returns the drive's reply whenever a reply is being read, regardless of the value written to the port through $1801
-Implemented/fixed audio sample read behavior (latching, L/R toggle)
-Fixed missing (unused) readable/writable bits in some registes

All of these fixes are based on the test results from krikzz's test rom here: https://github.com/krikzz/turbo-ed-pro-pub/tree/main/tcd-verificator
2023-12-27 23:27:07 +09:00

44 lines
No EOL
1.1 KiB
C++

#include "pch.h"
#include "PCE/CdRom/PceAudioFader.h"
#include "PCE/PceConsole.h"
#include "Utilities/Serializer.h"
PceAudioFader::PceAudioFader(PceConsole* console)
{
_console = console;
}
uint8_t PceAudioFader::Read()
{
return _state.RegValue;
}
void PceAudioFader::Write(uint8_t value)
{
_state.RegValue = value;
_state.Enabled = (value & 0x08) != 0;
_state.Target = (value & 0x02) ? PceAudioFaderTarget::Adpcm : PceAudioFaderTarget::CdAudio;
_state.StartClock = _console->GetMasterClock();
_state.FastFade = (value & 0x04) != 0;
}
double PceAudioFader::GetVolume(PceAudioFaderTarget target)
{
if(_state.Enabled && _state.Target == target) {
//Number of clocks to reduce volume by 1%
uint64_t fadeSpeed = (_state.FastFade ? 0.025 : 0.06) * _console->GetMasterClockRate();
double volume = 1.0 - (_console->GetMasterClock() - _state.StartClock) / fadeSpeed / 100.0;
return volume < 0 ? 0 : volume;
}
return 1.0;
}
void PceAudioFader::Serialize(Serializer& s)
{
SV(_state.Enabled);
SV(_state.Target);
SV(_state.StartClock);
SV(_state.FastFade);
SV(_state.RegValue);
}