1
//=========================================================
4
// $Id: node.h,v 1.2 2003/11/12 12:34:58 wschweer Exp $
6
// (C) Copyright 2001 Werner Schweer (ws@seh.de)
7
//=========================================================
9
#ifndef __AUDIONODE_H__
10
#define __AUDIONODE_H__
17
typedef struct { pthread_mutex_t lock; int counter; } muse_atomic_t;
19
typedef struct { int counter; } muse_atomic_t;
22
static inline int muse_atomic_read(muse_atomic_t *v) {
25
pthread_mutex_lock(&v->lock);
27
pthread_mutex_unlock(&v->lock);
34
static inline void muse_atomic_set(muse_atomic_t *v, int i) {
36
pthread_mutex_lock(&v->lock);
38
pthread_mutex_unlock(&v->lock);
43
static inline void muse_atomic_inc(muse_atomic_t *v) {
45
pthread_mutex_lock(&v->lock);
47
pthread_mutex_unlock(&v->lock);
55
static inline void muse_atomic_dec(muse_atomic_t *v) {
57
pthread_mutex_lock(&v->lock);
59
pthread_mutex_unlock(&v->lock);
67
static inline void muse_atomic_init(muse_atomic_t *v) {
69
pthread_mutex_init(&v->lock, NULL);
72
static inline void muse_atomic_destroy(muse_atomic_t *v) {
74
pthread_mutex_destroy(&v->lock);
82
const int AUDIO_GROUPS = 4;
83
const int FIFO_BUFFER = 64;
85
//---------------------------------------------------------
87
//---------------------------------------------------------
105
int ridx; // read index; only touched by reader
106
int widx; // write index; only touched by writer
107
muse_atomic_t count; // buffer count; writer increments, reader decrements
116
muse_atomic_set(&count, 0);
118
bool put(int, unsigned long, float** buffer, unsigned long pos);
119
bool getWriteBuffer(int, unsigned long, float** buffer, unsigned long pos);
121
bool get(int&, unsigned long&, float** buffer, unsigned long& pos);
125
//---------------------------------------------------------
128
// common part for audio and midi tracks
129
//---------------------------------------------------------
133
int _lastActivity; //tmp value
144
virtual void setMute(bool val);
145
virtual void setOff(bool val);
146
virtual void setSolo(bool val) = 0;
147
bool solo() const { return _solo; }
148
bool mute() const { return _mute; }
149
bool off() const { return _off; }
150
virtual bool isMute() const = 0;
151
virtual void addSolo() = 0;
152
bool recordFlag() const { return _recordFlag; }
153
virtual void setRecordFlag1(bool /*f*/) {}
154
virtual void setRecordFlag2(bool f) { _recordFlag = f; }
155
int activity() { return _activity; }
156
void setActivity(int v) { _activity = v; }
157
int lastActivity() { return _lastActivity; }
158
void setLastActivity(int v) { _lastActivity = v; }
159
void addActivity(int v) { _activity += v; }
161
virtual bool soloMode() = 0;
162
bool readProperty(Xml& xml, const QString& tag);
165
//---------------------------------------------------------
167
//---------------------------------------------------------
169
class MidiNode : public SNode {
170
static bool _soloMode;
171
static std::list<MidiNode*> nodeList;
176
virtual bool isMute() const;
177
virtual void setSolo(bool val);
178
virtual void addSolo();
179
virtual bool soloMode() { return _soloMode; }
182
//---------------------------------------------------------
184
// a managed collection of audio ports
185
// synth, track, group
186
//---------------------------------------------------------
188
class AudioNode : public SNode {
189
static bool _soloMode;
190
static std::list<AudioNode*> nodeList;
193
std::list<AudioNode*> _inRoute;
194
std::list<AudioNode*> _outRoute;
197
void readRecfile(Xml& xml);
200
int _ports; // 1 - mono, 2 - stereo
203
bool _prefader; // prefader metering
209
Fifo fifo; // fifo -> _recFile
211
virtual bool getData(int, unsigned long, float**);
215
AudioNode(const AudioNode&);
216
virtual ~AudioNode();
218
virtual bool isMute() const;
219
virtual void setSolo(bool val);
220
virtual void addSolo();
221
virtual bool soloMode() { return _soloMode; }
223
void putFifo(int channels, unsigned long n, float** bp);
225
SndFile* recFile() const { return _recFile; }
226
void setRecFile(SndFile* sf) { _recFile = sf; }
229
virtual void setRecordFlag1(bool f);
230
virtual void setRecordFlag2(bool f);
231
virtual void setMute(bool val);
232
virtual void setOff(bool val);
234
int ports() const { return _ports; }
235
void setPorts(int n);
236
double volume() const { return _volume; }
237
void setVolume(double val) { _volume = val; }
238
double pan() const { return _pan; }
239
void setPan(double val) { _pan = val; }
240
bool prefader() const { return _prefader; }
241
void setPrefader(bool val);
242
Pipeline* efxPipe() { return _efxPipe; }
244
void writeConfiguration(int, Xml&) const;
245
void readConfiguration(Xml&);
246
void readVolume(Xml& xml);
248
void connectIn(AudioNode* p);
249
void connectOut(AudioNode* p);
250
void disconnectIn(AudioNode* p);
251
void disconnectOut(AudioNode* p);
254
void disconnectClear();
256
AudioNode* route() const;
258
void segmentSizeChanged();
262
static void resetAllMeter();
264
int meter(int ch) const { return _meter[ch]; }
265
int peak(int ch) const { return _peak[ch]; }
267
virtual void addData(int, unsigned long, float**);
268
virtual void copyData(int, unsigned long, float**);
270
bool canRecord() const;
273
typedef std::list<AudioNode*>::iterator iAudioNode;
274
typedef std::list<AudioNode*>::const_iterator ciAudioNode;
276
//---------------------------------------------------------
278
//---------------------------------------------------------
280
class AudioPort : public AudioNode {
282
AudioPort() : AudioNode() {}
285
//---------------------------------------------------------
287
//---------------------------------------------------------
289
class AudioOutputPort : public AudioPort {
293
void process(unsigned long);
296
//---------------------------------------------------------
298
//---------------------------------------------------------
300
class AudioInputPort : public AudioPort {
301
virtual bool getData(int, unsigned long, float**);
307
extern AudioOutputPort audioOutput; // output device node
308
extern AudioInputPort audioInput; // input device node
310
extern AudioNode audioGroups[AUDIO_GROUPS];
311
extern int mixerGroups;
313
extern void connectNodes(AudioNode* out, AudioNode* in);
314
extern void disconnectNodes(AudioNode* out, AudioNode* in);
315
extern AudioNode* name2Node(const QString&);
316
extern QString node2Name(const AudioNode*);