~ubuntu-branches/ubuntu/gutsy/muse/gutsy

1.1.1 by Daniel Kobras
Import upstream version 0.6.3
1
//=========================================================
2
//  MusE
3
//  Linux Music Editor
4
//  $Id: audio.cpp,v 1.3 2004/01/05 20:03:05 spamatica Exp $
5
//
6
//  (C) Copyright 2001 Werner Schweer (ws@seh.de)
7
//=========================================================
8
9
#include <cmath>
10
#include <errno.h>
11
12
#include "song.h"
13
#include "node.h"
14
#include "driver/audiodev.h"
15
#include "driver/mididev.h"
16
#include "seq.h"
17
#include "synth.h"
18
#include "audioprefetch.h"
19
#include "plugins/plugin.h"
20
#include "audio.h"
21
#include "wave.h"
22
#include "midithread.h"
23
24
extern double curTime();
25
Audio* audio;
26
AudioDevice* audioDevice;   // current audio device in use
27
28
//---------------------------------------------------------
29
//   Audio
30
//---------------------------------------------------------
31
32
Audio::Audio()
33
      {
34
      msg = 0;
35
36
#if 0  // done in clearSong()
37
      // set master defaults
38
      audioOutput.setPorts(2);
39
      audioOutput.setVolume(1.0);
40
      for (int i = 0; i < mixerGroups; ++i) {
41
            audioGroups[i].setPorts(2);
42
            audioGroups[i].connectOut(&audioOutput);
43
            }
44
      audioInput.setPorts(2);
45
      audioInput.connectOut(&audioOutput);
46
#endif
47
48
      // create message channel
49
      int filedes[2];         // 0 - reading   1 - writing
50
      if (pipe(filedes) == -1) {
51
            perror("Audio: creating pipe");
52
            exit(-1);
53
            }
54
      fromThreadFdr = filedes[0];
55
      fromThreadFdw = filedes[1];
56
57
      _running = false;
58
      pthread_mutex_init(&mutex, 0);
59
      pthread_mutex_init(&msgMutex, 0);
60
      }
61
62
//---------------------------------------------------------
63
//   start
64
//    start audio processing
65
//---------------------------------------------------------
66
67
void Audio::start()
68
      {
69
      playState    = false;
70
      curSamplePos = 0;
71
72
      for (int i = 0; i < mixerGroups; ++i) {
73
            audioGroups[i].connect();
74
            }
75
      audioInput.connect();
76
77
      TrackList* tl = song->tracks();
78
      for (iTrack t = tl->begin(); t != tl->end(); ++t) {
79
            if ((*t)->type() == Track::WAVE) {
80
                  WaveTrack* track = (WaveTrack*)(*t);
81
                  track->connect();
82
                  }
83
            }
84
      if (audioDevice) {
85
            audioDevice->start();
86
            _running = true;
87
            }
88
      }
89
90
//---------------------------------------------------------
91
//   stop
92
//    stop audio processing
93
//---------------------------------------------------------
94
95
void Audio::stop(bool)
96
      {
97
      if (audioDevice)
98
            audioDevice->stop();
99
      _running = false;
100
      }
101
102
//---------------------------------------------------------
103
//   Audio
104
//---------------------------------------------------------
105
106
Audio::~Audio()
107
      {
108
      }
109
110
//---------------------------------------------------------
111
//   processAudio1
112
//    ALSA callback
113
//---------------------------------------------------------
114
115
void processAudio1(void*, void*)
116
      {
117
      audio->process(segmentSize);
118
      }
119
120
//---------------------------------------------------------
121
//   processAudio
122
//    JACK callback
123
//---------------------------------------------------------
124
125
int processAudio(jack_nframes_t frames, void*)
126
      {
127
      segmentSize = (unsigned long)frames;
128
      audio->process(segmentSize);
129
      return 0;
130
      }
131
132
//---------------------------------------------------------
133
//   process
134
//---------------------------------------------------------
135
136
void Audio::process(unsigned long frames)
137
      {
138
      extern int watchAudio;
139
      ++watchAudio;                 // make watchdog happy
140
141
      // get reference time position
142
      if (pthread_mutex_trylock(&mutex) == 0) {
143
            samplePos  = audioDevice->curPlayPos();
144
            sampleTime = curTime();
145
            pthread_mutex_unlock(&mutex);
146
            }
147
      if (msg) {
148
            processMsg(msg);
149
            int sn = msg->serialNo;
150
            msg = 0;    // dont process again
151
            int rv = write(fromThreadFdw, &sn, sizeof(int));
152
            if (rv != sizeof(int)) {
153
                  fprintf(stderr, "audio: write(%d) pipe failed: %s\n",
154
                     fromThreadFdw, strerror(errno));
155
                  }
156
            }
157
      audioOutput.process(frames);
158
159
      // process not connected mixer groups
160
      for (int i = 0; i < mixerGroups; ++i) {
161
            AudioNode* node = &audioGroups[i];
162
            if (node->_outRoute.empty() && ! node->_inRoute.empty()) {
163
                  int ports = node->ports();
164
                  float* buffer[ports];
165
                  float data[frames * ports];
166
                  for (int i = 0; i < ports; ++i)
167
                        buffer[i] = data + i * frames;
168
                  node->copyData(ports, frames, buffer);
169
                  }
170
            }
171
      if (playState) {
172
            curSamplePos += frames;
173
            audioPrefetch->msgTick();
174
            }
175
      }
176
177
//---------------------------------------------------------
178
//   curPlayPos
179
//    called from midi thread
180
//---------------------------------------------------------
181
182
int Audio::curPlayPos()
183
      {
184
      static int pos;
185
      static double time;
186
      if (pthread_mutex_trylock(&mutex) == 0) {
187
            pos  = samplePos;
188
            time = sampleTime;
189
            pthread_mutex_unlock(&mutex);
190
            }
191
//      else {
192
//            perror("mutex try lock failed");
193
//            }
194
      int elapsed = lrint((curTime() - time) * sampleRate);
195
      return pos + elapsed;
196
      }
197
198
//---------------------------------------------------------
199
//   processMsg
200
//---------------------------------------------------------
201
202
void Audio::processMsg(const volatile AudioMsg* msg)
203
      {
204
      switch(msg->id) {
205
            case AUDIO_PLAY:
206
                  if (msg->ival)
207
                        startPlay();
208
                  else
209
                        stopPlay();
210
                  break;
211
212
            case AUDIO_SEEK:
213
                  seek(msg->iival);
214
                  break;
215
216
            case AUDIO_RECORD:
217
                  msg->snode->setRecordFlag2(msg->ival);
218
                  break;
219
            case AUDIO_ROUTEADD:
220
                  connectNodes(msg->snode, msg->dnode);
221
                  break;
222
            case AUDIO_ROUTESET:
223
                  msg->snode->disconnectClear();
224
                  if (msg->dnode)
225
                        connectNodes(msg->snode, msg->dnode);
226
                  break;
227
            case AUDIO_ROUTEREMOVE:
228
                  disconnectNodes(msg->snode, msg->dnode);
229
                  break;
230
            case AUDIO_VOL:
231
                  msg->snode->setVolume(msg->dval);
232
                  break;
233
            case AUDIO_PAN:
234
                  msg->snode->setPan(msg->dval);
235
                  break;
236
            case AUDIO_SET_PREFADER:
237
                  msg->snode->setPrefader(msg->ival);
238
                  break;
239
            case AUDIO_SET_CHANNELS:
240
                  msg->snode->setPorts(msg->ival);
241
                  break;
242
            case AUDIO_ADDPLUGIN:
243
                  msg->snode->efxPipe()->insert(msg->plugin, msg->ival);
244
                  break;
245
            case AUDIO_REMOVE_SYNTHI:
246
                  msg->synth->disconnectClear();     // remove from audio chain
247
                  removeMidiInstrument(msg->synth->iname());
248
                  break;
249
            case AUDIO_ADD_SYNTHI:
250
                  synthiInstances.push_back((SynthI*)(msg->synth));
251
                  msg->synth->connect();
252
                  break;
253
254
            case AUDIO_SET_SEG_SIZE:
255
                  segmentSize = msg->ival;
256
                  sampleRate  = msg->iival;
257
                  audioOutput.segmentSizeChanged();
258
                  for (int i = 0; i < mixerGroups; ++i)
259
                        audioGroups[i].segmentSizeChanged();
260
                  for (iSynthI ii = synthiInstances.begin(); ii != synthiInstances.end();++ii)
261
                        (*ii)->segmentSizeChanged();
262
                  break;
263
264
            default:
265
                  song->processAudioMsg((const AudioMsg*)msg);
266
                  break;
267
            }
268
      }
269
270
//---------------------------------------------------------
271
//   msgRemoveRoute
272
//---------------------------------------------------------
273
274
void Audio::msgRemoveRoute(AudioNode* src, AudioNode* dst)
275
      {
276
      AudioMsg msg;
277
      msg.id = AUDIO_ROUTEREMOVE;
278
      msg.snode = src;
279
      msg.dnode = dst;
280
      sendMsg(&msg);
281
      }
282
283
//---------------------------------------------------------
284
//   msgAddRoute
285
//---------------------------------------------------------
286
287
void Audio::msgAddRoute(AudioNode* src, AudioNode* dst)
288
      {
289
      AudioMsg msg;
290
      msg.id = AUDIO_ROUTEADD;
291
      msg.snode = src;
292
      msg.dnode = dst;
293
      sendMsg(&msg);
294
      song->update(SC_ROUTE);
295
      }
296
297
//---------------------------------------------------------
298
//   msgSetRoute
299
//---------------------------------------------------------
300
301
void Audio::msgSetRoute(AudioNode* src, AudioNode* dst)
302
      {
303
      AudioMsg msg;
304
      msg.id = AUDIO_ROUTESET;
305
      msg.snode = src;
306
      msg.dnode = dst;
307
      sendMsg(&msg);
308
      song->update(SC_ROUTE);
309
      }
310
311
//---------------------------------------------------------
312
//   msgAddPlugin
313
//---------------------------------------------------------
314
315
void Audio::msgAddPlugin(AudioNode* node, int idx, PluginI* plugin)
316
      {
317
      AudioMsg msg;
318
      msg.id     = AUDIO_ADDPLUGIN;
319
      msg.snode  = node;
320
      msg.ival   = idx;
321
      msg.plugin = plugin;
322
      sendMsg(&msg);
323
      }
324
325
//---------------------------------------------------------
326
//   msgSetRecord
327
//---------------------------------------------------------
328
329
void Audio::msgSetRecord(AudioNode* node, bool val)
330
      {
331
      AudioMsg msg;
332
      msg.id     = AUDIO_RECORD;
333
      msg.snode  = node;
334
      msg.ival   = int(val);
335
      sendMsg(&msg);
336
      }
337
338
//---------------------------------------------------------
339
//   msgSetVolume
340
//---------------------------------------------------------
341
342
void Audio::msgSetVolume(AudioNode* src, double val)
343
      {
344
      AudioMsg msg;
345
      msg.id    = AUDIO_VOL;
346
      msg.snode    = src;
347
      msg.dval  = val;
348
      sendMsg(&msg);
349
      }
350
351
//---------------------------------------------------------
352
//   msgRemoveSynthi
353
//---------------------------------------------------------
354
355
void Audio::msgRemoveSynthI(SynthI* synthi)
356
      {
357
      AudioMsg msg;
358
      msg.id = AUDIO_REMOVE_SYNTHI;
359
      msg.synth = synthi;
360
      sendMsg(&msg);
361
      for (iSynthI i = synthiInstances.begin();
362
            i != synthiInstances.end(); ++i) {
363
            if (*i == synthi) {
364
                  midiThread->msgShowInstrumentGui(*i, false);
365
                  synthiInstances.erase(i);
366
                  break;
367
                  }
368
            }
369
      song->updateAudioMixer();
370
      delete synthi;
371
      }
372
373
//---------------------------------------------------------
374
//   msgAddSynthi
375
//---------------------------------------------------------
376
377
void Audio::msgAddSynthI(SynthI* synth)
378
      {
379
      AudioMsg msg;
380
      msg.id = AUDIO_ADD_SYNTHI;
381
      msg.synth = synth;
382
      sendMsg(&msg);
383
      }
384
385
//---------------------------------------------------------
386
//   msgSetPan
387
//---------------------------------------------------------
388
389
void Audio::msgSetPan(AudioNode* node, double val)
390
      {
391
      AudioMsg msg;
392
      msg.id    = AUDIO_PAN;
393
      msg.snode = node;
394
      msg.dval  = val;
395
      sendMsg(&msg);
396
      }
397
398
//---------------------------------------------------------
399
//   msgSetPrefader
400
//---------------------------------------------------------
401
402
void Audio::msgSetPrefader(AudioNode* node, int val)
403
      {
404
      AudioMsg msg;
405
      msg.id    = AUDIO_SET_PREFADER;
406
      msg.snode = node;
407
      msg.ival  = val;
408
      sendMsg(&msg);
409
      }
410
411
//---------------------------------------------------------
412
//   msgSetChannels
413
//---------------------------------------------------------
414
415
void Audio::msgSetChannels(AudioNode* node, int val)
416
      {
417
      AudioMsg msg;
418
      msg.id    = AUDIO_SET_CHANNELS;
419
      msg.snode = node;
420
      msg.ival  = val;
421
      sendMsg(&msg);
422
      song->update(SC_CHANNELS);
423
      }
424
425
//---------------------------------------------------------
426
//   msgSetSegSize
427
//---------------------------------------------------------
428
429
void Audio::msgSetSegSize(int bs, int sr)
430
      {
431
      AudioMsg msg;
432
      msg.id = AUDIO_SET_SEG_SIZE;
433
      msg.ival = bs;
434
      msg.iival = sr;
435
      sendMsg(&msg);
436
      }
437
438
//---------------------------------------------------------
439
//   msgPlay
440
//---------------------------------------------------------
441
442
void Audio::msgPlay(bool flag)
443
      {
444
      AudioMsg msg;
445
      msg.id = AUDIO_PLAY;
446
      msg.ival = flag;
447
      sendMsg(&msg);
448
      }
449
450
//---------------------------------------------------------
451
//   msgSeek
452
//---------------------------------------------------------
453
454
void Audio::msgSeek(int pos)
455
      {
456
      AudioMsg msg;
457
      msg.id = AUDIO_SEEK;
458
      msg.iival = pos;
459
      sendMsg(&msg);
460
      }
461
462
//---------------------------------------------------------
463
//   msgAddPart
464
//---------------------------------------------------------
465
466
void Audio::msgAddPart(WavePart* part)
467
      {
468
      AudioMsg msg;
469
      msg.id = AUDIO_ADD_PART;
470
      msg.spart = part;
471
      sendMsg(&msg);
472
      }
473
474
//---------------------------------------------------------
475
//   msgRemovePart
476
//---------------------------------------------------------
477
478
void Audio::msgRemovePart(WavePart* part)
479
      {
480
      AudioMsg msg;
481
      msg.id = AUDIO_REMOVE_PART;
482
      msg.spart = part;
483
      sendMsg(&msg);
484
      }
485
486
//---------------------------------------------------------
487
//   msgChangePart
488
//---------------------------------------------------------
489
490
void Audio::msgChangePart(WavePart* spart, WavePart* dpart)
491
      {
492
      AudioMsg msg;
493
      msg.id = AUDIO_CHANGE_PART;
494
      msg.spart = spart;
495
      msg.dpart = dpart;
496
      sendMsg(&msg);
497
      }
498
499
//---------------------------------------------------------
500
//   msgRemoveTrack
501
//---------------------------------------------------------
502
503
void Audio::msgRemoveTrack(WaveTrack* track)
504
      {
505
      AudioMsg msg;
506
      msg.id = AUDIO_REMOVE_TRACK;
507
      msg.track = track;
508
      sendMsg(&msg);
509
      }
510
511
//---------------------------------------------------------
512
//   msgUndo
513
//---------------------------------------------------------
514
515
void Audio::msgUndo()
516
      {
517
      AudioMsg msg;
518
      msg.id = AUDIO_UNDO;
519
      sendMsg(&msg);
520
      }
521
522
//---------------------------------------------------------
523
//   msgRedo
524
//---------------------------------------------------------
525
526
void Audio::msgRedo()
527
      {
528
      AudioMsg msg;
529
      msg.id = AUDIO_REDO;
530
      sendMsg(&msg);
531
      }
532
533
//---------------------------------------------------------
534
//   seek
535
//---------------------------------------------------------
536
537
void Audio::seek(int tickpos)
538
      {
539
      if (noAudio || recordState)
540
            return;
541
      curSamplePos = lrint(tempomap.tick2time(tickpos) * sampleRate);
542
      audioPrefetch->msgSeek(curSamplePos);
543
      }
544
545
//---------------------------------------------------------
546
//   sendMsg
547
//---------------------------------------------------------
548
549
void Audio::sendMsg(AudioMsg* m)
550
      {
551
      static int sno = 0;
552
553
      if (_running) {
554
            //DEBUG:
555
//            pthread_mutex_lock(&msgMutex);  // block until msg is free
556
            int i = 0;
557
            while (msg) {
558
                  ++i;
559
                  if (i > 1000) {
560
                        printf("send msg failed\n");
561
                        break;
562
                        }
563
                  usleep(1000);
564
                  }
565
            m->serialNo = sno++;
566
            msg = m;
567
//            pthread_mutex_unlock(&msgMutex);
568
            // wait for next audio "process" call to finish operation
569
            int no = -1;
570
            int rv = read(fromThreadFdr, &no, sizeof(int));
571
            if (rv != sizeof(int))
572
                  perror("Audio: read pipe failed");
573
            else if (no != (sno-1)) {
574
                  fprintf(stderr, "audio: bad serial number, read %d expected %d\n",
575
                     no, sno-1);
576
                  }
577
            }
578
      else {
579
            // if audio is not running (during initialization)
580
            // process commands directly:
581
            processMsg(m);
582
            }
583
      }
584
585
//---------------------------------------------------------
586
//   writeTick
587
//    called from audiowriter thread context
588
//    write another buffer to soundfile
589
//---------------------------------------------------------
590
591
void Audio::writeTick()
592
      {
593
      if (audioOutput.recordFlag())
594
            audioOutput.record();
595
596
      TrackList* tl = song->tracks();
597
      for (iTrack t = tl->begin(); t != tl->end(); ++t) {
598
            if ((*t)->type() == Track::WAVE) {
599
                  WaveTrack* track = (WaveTrack*)(*t);
600
                  if (track->recordFlag())
601
                        track->record();
602
                  }
603
            }
604
      }
605
606
//---------------------------------------------------------
607
//   startPlay
608
//---------------------------------------------------------
609
610
void Audio::startPlay()
611
      {
612
      playState = true;
613
      if (song->record())
614
            startRecord();
615
      }
616
617
//---------------------------------------------------------
618
//   stopPlay
619
//---------------------------------------------------------
620
621
void Audio::stopPlay()
622
      {
623
      playState = false;
624
      TrackList* tracks = song->tracks();
625
      for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
626
            if ((*i)->type() != Track::WAVE)
627
                  continue;
628
            WaveTrack* track = (WaveTrack*)(*i);
629
            track->resetMeter();
630
            }
631
      if (song->record())
632
            stopRecord();
633
      }
634
635
//---------------------------------------------------------
636
//   startRecord
637
//---------------------------------------------------------
638
639
void Audio::startRecord()
640
      {
641
      recordState = true;
642
      TrackList* tracks = song->tracks();
643
      for (iTrack i = tracks->begin(); i != tracks->end(); ++i) {
644
            if ((*i)->type() != Track::WAVE)
645
                  continue;
646
            WaveTrack* track = (WaveTrack*)(*i);
647
            track->resetMeter();
648
//            if (track->recordFlag()) {
649
//                  track->recFile()->openWrite();
650
//                  }
651
            }
652
      }
653
654
//---------------------------------------------------------
655
//   stopRecord
656
//---------------------------------------------------------
657
658
void Audio::stopRecord()
659
      {
660
      recordState = false;
661
      }
662