1 // 2 // Copyright (C) 2007 by sinamas <sinamas at users.sourceforge.net> 3 // 4 // This program is free software; you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License version 2 as 6 // published by the Free Software Foundation. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU General Public License version 2 for more details. 12 // 13 // You should have received a copy of the GNU General Public License 14 // version 2 along with this program; if not, write to the 15 // Free Software Foundation, Inc., 16 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 // 18 19 #ifndef SOUND_H 20 #define SOUND_H 21 22 #include <stddef.h> 23 #include <cstddef> 24 25 #include "sound/channel1.h" 26 #include "sound/channel2.h" 27 #include "sound/channel3.h" 28 #include "sound/channel4.h" 29 30 namespace gambatte { 31 32 class PSG { 33 public: 34 PSG(); 35 void init(bool cgb); 36 void reset(); 37 void setStatePtrs(SaveState &state); 38 void saveState(SaveState &state); 39 void loadState(SaveState const &state); 40 41 void generateSamples(unsigned long cycleCounter, bool doubleSpeed); 42 void resetCounter(unsigned long newCc, unsigned long oldCc, bool doubleSpeed); 43 std::size_t fillBuffer(); setBuffer(uint_least32_t * buf)44 void setBuffer(uint_least32_t *buf) { buffer_ = buf; bufferPos_ = 0; } 45 isEnabled()46 bool isEnabled() const { return enabled_; } setEnabled(bool value)47 void setEnabled(bool value) { enabled_ = value; } 48 setNr10(unsigned data)49 void setNr10(unsigned data) { ch1_.setNr0(data); } setNr11(unsigned data)50 void setNr11(unsigned data) { ch1_.setNr1(data); } setNr12(unsigned data)51 void setNr12(unsigned data) { ch1_.setNr2(data); } setNr13(unsigned data)52 void setNr13(unsigned data) { ch1_.setNr3(data); } setNr14(unsigned data)53 void setNr14(unsigned data) { ch1_.setNr4(data); } 54 setNr21(unsigned data)55 void setNr21(unsigned data) { ch2_.setNr1(data); } setNr22(unsigned data)56 void setNr22(unsigned data) { ch2_.setNr2(data); } setNr23(unsigned data)57 void setNr23(unsigned data) { ch2_.setNr3(data); } setNr24(unsigned data)58 void setNr24(unsigned data) { ch2_.setNr4(data); } 59 setNr30(unsigned data)60 void setNr30(unsigned data) { ch3_.setNr0(data); } setNr31(unsigned data)61 void setNr31(unsigned data) { ch3_.setNr1(data); } setNr32(unsigned data)62 void setNr32(unsigned data) { ch3_.setNr2(data); } setNr33(unsigned data)63 void setNr33(unsigned data) { ch3_.setNr3(data); } setNr34(unsigned data)64 void setNr34(unsigned data) { ch3_.setNr4(data); } waveRamRead(unsigned index)65 unsigned waveRamRead(unsigned index) const { return ch3_.waveRamRead(index); } waveRamWrite(unsigned index,unsigned data)66 void waveRamWrite(unsigned index, unsigned data) { ch3_.waveRamWrite(index, data); } 67 setNr41(unsigned data)68 void setNr41(unsigned data) { ch4_.setNr1(data); } setNr42(unsigned data)69 void setNr42(unsigned data) { ch4_.setNr2(data); } setNr43(unsigned data)70 void setNr43(unsigned data) { ch4_.setNr3(data); } setNr44(unsigned data)71 void setNr44(unsigned data) { ch4_.setNr4(data); } 72 73 void setSoVolume(unsigned nr50); 74 void mapSo(unsigned nr51); 75 unsigned getStatus() const; 76 77 private: 78 Channel1 ch1_; 79 Channel2 ch2_; 80 Channel3 ch3_; 81 Channel4 ch4_; 82 uint_least32_t *buffer_; 83 std::size_t bufferPos_; 84 unsigned long lastUpdate_; 85 unsigned long soVol_; 86 uint_least32_t rsum_; 87 bool enabled_; 88 89 void accumulateChannels(unsigned long cycles); 90 }; 91 92 } 93 94 #endif 95