OXYGENHUB
◆ main openmsx / src / sound / EmuTimer.hh
1.6 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#ifndef EMUTIMER_HH
2
#define EMUTIMER_HH
3
4
#include "DynamicClock.hh"
5
#include "Schedulable.hh"
6
7
#include <cstdint>
8
#include <memory>
9
10
namespace openmsx {
11
12
class EmuTimerCallback
13
{
14
public:
15
	virtual void callback(uint8_t value) = 0;
16
17
protected:
18
	~EmuTimerCallback() = default;
19
};
20
21
22
class EmuTimer final : public Schedulable
23
{
24
public:
25
	EmuTimer(Scheduler& scheduler, EmuTimerCallback& cb,
26
	         uint8_t flag, unsigned freq_num, unsigned freq_denom,
27
	         int maxVal);
28
29
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPM_1(
30
		Scheduler& scheduler, EmuTimerCallback& cb);
31
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPM_2(
32
		Scheduler& scheduler, EmuTimerCallback& cb);
33
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPP_2(
34
		Scheduler& scheduler, EmuTimerCallback& cb);
35
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPL3_1(
36
		Scheduler& scheduler, EmuTimerCallback& cb);
37
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPL3_2(
38
		Scheduler& scheduler, EmuTimerCallback& cb);
39
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPL4_1(
40
		Scheduler& scheduler, EmuTimerCallback& cb);
41
	[[nodiscard]] static std::unique_ptr<EmuTimer> createOPL4_2(
42
		Scheduler& scheduler, EmuTimerCallback& cb);
43
44
	void setValue(int value);
45
	void setStart(bool start, EmuTime time);
46
47
	template<typename Archive>
48
	void serialize(Archive& ar, unsigned version);
49
50
private:
51
	void executeUntil(EmuTime time) override;
52
	void schedule(EmuTime time);
53
	void unschedule();
54
55
private:
56
	EmuTimerCallback& cb;
57
	DynamicClock clock{EmuTime::zero()};
58
	const int maxVal;
59
	int count;
60
	const uint8_t flag;
61
	bool counting = false;
62
};
63
64
} // namespace openmsx
65
66
#endif