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