ofxPDSP
OscOutput.h
1 
2 // OscOutput.h
3 // ofxPDSP
4 // Nicola Pisanti, MIT License, 2016
5 
6 #ifndef OFXPDSPMIDI_PDSPOSCOUT_H_INCLUDED
7 #define OFXPDSPMIDI_PDSPOSCOUT_H_INCLUDED
8 
9 #include "ofMain.h"
10 #include <chrono>
11 #include <algorithm>
12 #include <thread>
13 #include <mutex>
14 #include <condition_variable>
15 #include <atomic>
16 #include "../DSP/pdspCore.h"
17 #include "../sequencer/SequencerSection.h"
18 #include "ofxOsc.h"
19 
24 namespace pdsp { namespace osc {
25 
26 class Output : public pdsp::ExtSequencer, public pdsp::Preparable {
27 
28 private:
29 
35  class ScheduledOscMessage{
36  public:
37  ScheduledOscMessage();
38  ScheduledOscMessage(ofxOscMessage message, chrono::high_resolution_clock::time_point schedule);
39  ScheduledOscMessage(const ScheduledOscMessage &other);
40  ScheduledOscMessage& operator= (const ScheduledOscMessage &other);
41  ~ScheduledOscMessage();
42 
43  ofxOscMessage message;
44  chrono::high_resolution_clock::time_point scheduledTime;
45  };
46 
47 
48  static bool scheduledSort(const ScheduledOscMessage &lhs, const ScheduledOscMessage &rhs );
49 
55 public:
56  Output();
57  ~Output();
58 
59 
65  void openPort(const std::string &hostname, int port );
66 
70  void close() override;
71 
72 
73 
77  bool isConnected() { return connected; }
78 
83  void setVerbose( bool verbose );
84 
85 
90  pdsp::ExtSequencer& address( std::string oscAddress );
91 
95  void process( int bufferSize ) noexcept override;
96 
97  void linkToMessageBuffer(pdsp::MessageBuffer &messageBuffer) override;
98  void unlinkMessageBuffer(pdsp::MessageBuffer &messageBuffer) override;
102 protected:
103  void prepareToPlay( int expectedBufferSize, double sampleRate ) override;
104  void releaseResources() override ;
105 
106 private:
107 
108  ofxOscSender sender;
109  std::vector<std::string> addresses;
110  std::string selectedAddress;
111 
112 
113  bool connected;
114  bool verbose;
115 
116 
117  std::vector<pdsp::MessageBuffer*> inputs;
118 
119  std::vector<ScheduledOscMessage> messagesToSend;
120  int messageCount;
121 
122 
123  //MIDI DAEMON MEMBERS---------------------------------------------------------------
124  void startDaemon();
125  void closeDaemon();
126  void daemonFunction() noexcept;
127  static void daemonFunctionWrapper(Output* parent);
128 
129  thread daemonThread;
130  std::atomic<bool> runDaemon;
131 
132  //serial output processing members
133  std::chrono::time_point<std::chrono::high_resolution_clock> bufferChrono;
134  bool chronoStarted;
135  double usecPerSample;
136  std::vector<ScheduledOscMessage> circularBuffer;
137 
138  std::atomic<int> writeindex;
139  int send;
140 
141 };
142 
143 }}
144 
145 #endif //OFXPDSPMIDI_PDSPOSCOUT_H_INCLUDED
void close() override
shuts down the output
Definition: OscOutput.cpp:90
Definition: OscOutput.h:26
Thread-safe value control with smoothing.
Definition: SequencerBridge.h:11
void openPort(const std::string &hostname, int port)
open the port with the given index
Definition: OscOutput.cpp:75
bool isConnected()
return true if the port has been sucessfully opened
Definition: OscOutput.h:77
pdsp::ExtSequencer & address(std::string oscAddress)
patch a pdsp::ScoreSection::out_message() method to the result of this method for message to the seri...
Definition: OscOutput.cpp:100
void setVerbose(bool verbose)
enable or disable diagnostic messages
Definition: OscOutput.cpp:70
Definition: Preparable.h:36