annotate audioio/AudioGenerator.h @ 342:4eccff14b4d8 tonioni

Much fiddling toward getting sessions and individual audio files to load cleanly when they need quite different handling after load
author Chris Cannam
date Wed, 02 Apr 2014 21:25:56 +0100
parents 5c69d40a0e30
children 8d7f39df44ed
rev   line source
Chris@43 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@43 2
Chris@43 3 /*
Chris@43 4 Sonic Visualiser
Chris@43 5 An audio file viewer and annotation editor.
Chris@43 6 Centre for Digital Music, Queen Mary, University of London.
Chris@43 7 This file copyright 2006 Chris Cannam.
Chris@43 8
Chris@43 9 This program is free software; you can redistribute it and/or
Chris@43 10 modify it under the terms of the GNU General Public License as
Chris@43 11 published by the Free Software Foundation; either version 2 of the
Chris@43 12 License, or (at your option) any later version. See the file
Chris@43 13 COPYING included with this distribution for more information.
Chris@43 14 */
Chris@43 15
Chris@43 16 #ifndef _AUDIO_GENERATOR_H_
Chris@43 17 #define _AUDIO_GENERATOR_H_
Chris@43 18
Chris@43 19 class Model;
Chris@43 20 class NoteModel;
matthiasm@281 21 class FlexiNoteModel;
Chris@43 22 class DenseTimeValueModel;
Chris@43 23 class SparseOneDimensionalModel;
Chris@108 24 class Playable;
Chris@307 25 class ClipMixer;
Chris@313 26 class ContinuousSynth;
Chris@43 27
Chris@43 28 #include <QObject>
Chris@43 29 #include <QMutex>
Chris@43 30
Chris@43 31 #include <set>
Chris@43 32 #include <map>
Chris@275 33 #include <vector>
Chris@43 34
Chris@43 35 class AudioGenerator : public QObject
Chris@43 36 {
Chris@43 37 Q_OBJECT
Chris@43 38
Chris@43 39 public:
Chris@43 40 AudioGenerator();
Chris@43 41 virtual ~AudioGenerator();
Chris@43 42
Chris@43 43 /**
Chris@43 44 * Add a data model to be played from and initialise any necessary
Chris@43 45 * audio generation code. Returns true if the model will be
Chris@108 46 * played. The model will be added regardless of the return
Chris@108 47 * value.
Chris@43 48 */
Chris@43 49 virtual bool addModel(Model *model);
Chris@43 50
Chris@43 51 /**
Chris@43 52 * Remove a model.
Chris@43 53 */
Chris@43 54 virtual void removeModel(Model *model);
Chris@43 55
Chris@43 56 /**
Chris@43 57 * Remove all models.
Chris@43 58 */
Chris@43 59 virtual void clearModels();
Chris@43 60
Chris@43 61 /**
Chris@305 62 * Reset playback, clearing buffers and the like.
Chris@43 63 */
Chris@43 64 virtual void reset();
Chris@43 65
Chris@43 66 /**
Chris@43 67 * Set the target channel count. The buffer parameter to mixModel
Chris@43 68 * must always point to at least this number of arrays.
Chris@43 69 */
Chris@43 70 virtual void setTargetChannelCount(size_t channelCount);
Chris@43 71
Chris@43 72 /**
Chris@43 73 * Return the internal processing block size. The frameCount
Chris@43 74 * argument to all mixModel calls must be a multiple of this
Chris@43 75 * value.
Chris@43 76 */
Chris@43 77 virtual size_t getBlockSize() const;
Chris@43 78
Chris@43 79 /**
Chris@43 80 * Mix a single model into an output buffer.
Chris@43 81 */
Chris@43 82 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
Chris@43 83 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
Chris@43 84
Chris@43 85 /**
Chris@43 86 * Specify that only the given set of models should be played.
Chris@43 87 */
Chris@43 88 virtual void setSoloModelSet(std::set<Model *>s);
Chris@43 89
Chris@43 90 /**
Chris@43 91 * Specify that all models should be played as normal (if not
Chris@43 92 * muted).
Chris@43 93 */
Chris@43 94 virtual void clearSoloModelSet();
Chris@43 95
Chris@43 96 protected slots:
Chris@309 97 void playClipIdChanged(const Playable *, QString);
Chris@43 98
Chris@43 99 protected:
Chris@305 100 size_t m_sourceSampleRate;
Chris@305 101 size_t m_targetChannelCount;
rmb456@323 102 size_t m_waveType;
Chris@43 103
Chris@43 104 bool m_soloing;
Chris@43 105 std::set<Model *> m_soloModelSet;
Chris@43 106
Chris@43 107 struct NoteOff {
Chris@43 108
Chris@308 109 NoteOff(float _freq, size_t _frame) : frequency(_freq), frame(_frame) { }
Chris@275 110
Chris@308 111 float frequency;
Chris@43 112 size_t frame;
Chris@43 113
Chris@43 114 struct Comparator {
Chris@43 115 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
Chris@43 116 return n1.frame < n2.frame;
Chris@43 117 }
Chris@43 118 };
Chris@43 119 };
Chris@43 120
Chris@307 121
Chris@307 122 typedef std::map<const Model *, ClipMixer *> ClipMixerMap;
Chris@43 123
Chris@178 124 typedef std::multiset<NoteOff, NoteOff::Comparator> NoteOffSet;
Chris@43 125 typedef std::map<const Model *, NoteOffSet> NoteOffMap;
Chris@43 126
Chris@313 127 typedef std::map<const Model *, ContinuousSynth *> ContinuousSynthMap;
Chris@313 128
Chris@43 129 QMutex m_mutex;
Chris@313 130
Chris@307 131 ClipMixerMap m_clipMixerMap;
Chris@43 132 NoteOffMap m_noteOffs;
Chris@43 133 static QString m_sampleDir;
Chris@43 134
Chris@313 135 ContinuousSynthMap m_continuousSynthMap;
Chris@313 136
Chris@313 137 bool usesClipMixer(const Model *);
Chris@313 138 bool usesContinuousSynth(const Model *);
Chris@313 139
Chris@307 140 ClipMixer *makeClipMixerFor(const Model *model);
Chris@313 141 ContinuousSynth *makeSynthFor(const Model *model);
Chris@307 142
Chris@108 143 static void initialiseSampleDir();
Chris@43 144
Chris@43 145 virtual size_t mixDenseTimeValueModel
Chris@43 146 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
Chris@43 147 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@43 148
Chris@313 149 virtual size_t mixClipModel
Chris@275 150 (Model *model, size_t startFrame, size_t frameCount,
Chris@313 151 float **buffer, float gain, float pan);
Chris@313 152
Chris@313 153 virtual size_t mixContinuousSynthModel
Chris@313 154 (Model *model, size_t startFrame, size_t frameCount,
Chris@313 155 float **buffer, float gain, float pan);
Chris@275 156
Chris@305 157 static const size_t m_processingBlockSize;
Chris@43 158 };
Chris@43 159
Chris@43 160 #endif
Chris@43 161