diff options
author | Matthew Hoops | 2015-05-14 21:07:46 -0400 |
---|---|---|
committer | Matthew Hoops | 2015-07-07 20:19:47 -0400 |
commit | 4d5658511228328a9e56d32448f9b598ecda696c (patch) | |
tree | 164d68f9ca5a6bed5e7c0b4526045067a0bd8c5e /audio/fmopl.h | |
parent | bed9da8b9dbbaa19d317f71663e42875c1717fda (diff) | |
download | scummvm-rg350-4d5658511228328a9e56d32448f9b598ecda696c.tar.gz scummvm-rg350-4d5658511228328a9e56d32448f9b598ecda696c.tar.bz2 scummvm-rg350-4d5658511228328a9e56d32448f9b598ecda696c.zip |
AUDIO: Add a class representing a real OPL
Diffstat (limited to 'audio/fmopl.h')
-rw-r--r-- | audio/fmopl.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/audio/fmopl.h b/audio/fmopl.h index 091e0bd88d..ba0872d87b 100644 --- a/audio/fmopl.h +++ b/audio/fmopl.h @@ -106,8 +106,14 @@ private: static const EmulatorDescription _drivers[]; }; +/** + * The type of the OPL timer callback functor. + */ typedef Common::Functor0<void> TimerCallback; +/** + * A representation of a Yamaha OPL chip. + */ class OPL { private: static bool _hasInstance; @@ -194,6 +200,43 @@ protected: Common::ScopedPtr<TimerCallback> _callback; }; +/** + * An OPL that represents a real OPL, as opposed to an emulated one. + * + * This will use an actual timer instead of using one calculated from + * the number of samples in an AudioStream::readBuffer call. + */ +class RealOPL : public OPL { +public: + RealOPL(); + virtual ~RealOPL(); + + // OPL API + void setCallbackFrequency(int timerFrequency); + +protected: + // OPL API + void startCallbacks(int timerFrequency); + void stopCallbacks(); + +private: + static void timerProc(void *refCon); + void onTimer(); + + uint _baseFreq; + uint _remainingTicks; + + enum { + kMaxFreq = 100 + }; +}; + +/** + * An OPL that represents an emulated OPL. + * + * This will send callbacks based on the number of samples + * decoded in readBuffer(). + */ class EmulatedOPL : public OPL, protected Audio::AudioStream { public: EmulatedOPL(); |