#pragma once #include "stdafx.h" #include "GbSquareChannel.h" #include "GbWaveChannel.h" #include "GbNoiseChannel.h" #include "../Utilities/blip_buf.h" #include "../Utilities/ISerializable.h" class Console; class Gameboy; class SoundMixer; class EmuSettings; class GbApu : public ISerializable { public: static constexpr int SampleRate = 96000; private: static constexpr int ApuFrequency = 1024 * 1024 * 4; //4mhz static constexpr int MaxSamples = 4000; Console* _console = nullptr; Gameboy* _gameboy = nullptr; EmuSettings* _settings = nullptr; SoundMixer* _soundMixer = nullptr; unique_ptr _square1; unique_ptr _square2; unique_ptr _wave; unique_ptr _noise; int16_t* _soundBuffer = nullptr; blip_t* _leftChannel = nullptr; blip_t* _rightChannel = nullptr; int16_t _prevLeftOutput = 0; int16_t _prevRightOutput = 0; uint32_t _clockCounter = 0; uint64_t _prevClockCount = 0; GbApuState _state = {}; uint8_t InternalRead(uint16_t addr); public: GbApu(); virtual ~GbApu(); void Init(Console* console, Gameboy* gameboy); GbApuDebugState GetState(); void Run(); void GetSoundSamples(int16_t* &samples, uint32_t& sampleCount); void ClockFrameSequencer(); uint8_t Peek(uint16_t addr); uint8_t Read(uint16_t addr); void Write(uint16_t addr, uint8_t value); uint8_t ReadCgbRegister(uint16_t addr); template void ProcessLengthEnableFlag(uint8_t value, T& length, bool& lengthEnabled, bool& enabled); void Serialize(Serializer& s) override; };