bsnes/higan/pce/psg/channel.cpp

30 lines
629 B
C++

auto PSG::Channel::power(uint id) -> void {
this->id = id;
memory::fill(&io, sizeof(IO));
}
auto PSG::Channel::run() -> void {
if(!io.enable) return sample(0);
if(!io.direct && --io.wavePeriod == 0) {
io.wavePeriod = io.waveFrequency;
io.waveOffset++;
io.waveSample = io.waveBuffer[io.waveOffset];
}
if(!io.noiseEnable) {
return sample(io.waveSample);
}
if(--io.noisePeriod == 0) {
io.noisePeriod = ~io.noiseFrequency << 7;
io.noiseSample = nall::random() & 1 ? ~0 : 0;
}
return sample(io.noiseSample);
}
auto PSG::Channel::sample(uint5 sample) -> void {
io.output = sample;
}