#pragma once #include #include class ThreadSharedState; class ThreadMessage; /** * ThreadServer implements a worker thread that can do work * off of the audio thread in a plugin. * To do useful work with Thread server: * Derive a class from ThreadServer, and override handleMessage. * Define at least one message by deriving from ThreadMessage. * Control ThreadServer with ThreadClient. * For more info, refer to ThreadSharedState */ class ThreadServer { public: ThreadServer(std::shared_ptr state); virtual ~ThreadServer(); void start(); const ThreadServer& operator= (const ThreadServer&) = delete; ThreadServer(const ThreadServer&) = delete; static int _count; protected: /** * Derived thread servers must override this to get messages. * Message is not const, as server is allowed to modify it and * send it back. */ virtual void handleMessage(ThreadMessage*); /** * Utility for sending replies back to the client. * Will causes an error if there is a message in the mailbox already. */ void sendMessageToClient(ThreadMessage*); std::shared_ptr sharedState; std::unique_ptr thread; private: // Message based clients should not override this virtual void threadFunction(); /** * * TODO: get rid of proc and handle, if possible */ void procMessage(ThreadMessage*); };