aboutsummaryrefslogtreecommitdiff
path: root/audio/fmopl.h
diff options
context:
space:
mode:
authorMatthew Hoops2015-05-14 21:07:46 -0400
committerMatthew Hoops2015-07-07 20:19:47 -0400
commit4d5658511228328a9e56d32448f9b598ecda696c (patch)
tree164d68f9ca5a6bed5e7c0b4526045067a0bd8c5e /audio/fmopl.h
parentbed9da8b9dbbaa19d317f71663e42875c1717fda (diff)
downloadscummvm-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.h43
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();