00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef TSAR_H
00024 #define TSAR_H
00025
00026 #include <QObject>
00027 #include <QTimer>
00028 #include <QByteArray>
00029 #include "RingBufferNPT.h"
00030
00031 #define THREAD_SAVE_INVOKE(caller, argument, slotSignature) { \
00032 TsarEvent event = tsar().create_event(caller, argument, #slotSignature, ""); \
00033 while (!tsar().add_event(event)) { printf("THREAD_SAVE_INVOKE: failed to add event, trying again\n");} \
00034 }
00035
00036 #define RT_THREAD_EMIT(cal, arg, signalSignature) {\
00037 TsarEvent event; \
00038 event.caller = cal; \
00039 event.argument = arg; \
00040 event.slotindex = -1; \
00041 static int retrievedsignalindex; \
00042 \
00043 if ( ! retrievedsignalindex ) { \
00044 \
00045 \
00046 retrievedsignalindex = cal->metaObject()->indexOfMethod(#signalSignature) - 4; \
00047 Q_ASSERT(retrievedsignalindex >= 0); \
00048 } \
00049 event.signalindex = retrievedsignalindex; \
00050 event.valid = true; \
00051 tsar().add_rt_event(event); \
00052 }\
00053
00054
00055 #define THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(caller, argument, slotSignature, signalSignature) { \
00056 TsarEvent event = tsar().create_event(caller, argument, #slotSignature, #signalSignature); \
00057 tsar().add_event(event);\
00058 }\
00059
00060
00061 struct TsarEvent {
00062
00063 QObject* caller;
00064 void* argument;
00065 int slotindex;
00066 void* _a[];
00067
00068
00069 int signalindex;
00070
00071 bool valid;
00072 };
00073
00074 class Tsar : public QObject
00075 {
00076 Q_OBJECT
00077
00078 public:
00079 TsarEvent create_event(QObject* caller, void* argument, const char* slotSignature, const char* signalSignature);
00080
00081 bool add_event(TsarEvent& event);
00082 void add_rt_event(TsarEvent& event);
00083 void process_event_slot(const TsarEvent& event);
00084 void process_event_signal(const TsarEvent& event);
00085 void process_event_slot_signal(const TsarEvent& event);
00086
00087 private:
00088 Tsar();
00089 ~Tsar();
00090 Tsar(const Tsar&);
00091
00092
00093 friend Tsar& tsar();
00094
00095
00096 friend class AudioDevice;
00097
00098 QList<RingBufferNPT<TsarEvent>*> m_events;
00099 RingBufferNPT<TsarEvent>* oldEvents;
00100 QTimer finishOldEventsTimer;
00101 int m_eventCounter;
00102 int m_retryCount;
00103
00104 #if defined (THREAD_CHECK)
00105 unsigned long m_threadId;
00106 #endif
00107
00108 void process_events();
00109
00110 private slots:
00111 void finish_processed_events();
00112
00113 };
00114
00115
00116 Tsar& tsar();
00117
00118 #endif
00119
00120
00121
00122
00123
00124