annotate audioio/AudioGenerator.h @ 11:8dc0ae8fccdd

* Add LED button * Add note model playback (currently assuming that value == MIDI pitch) * Reorganise PlayParameters and move repository from ViewManager to new PlayParameterRepository class
author Chris Cannam
date Wed, 15 Feb 2006 17:58:35 +0000
parents b6dc944128da
children 89bb89894ad6
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 A waveform viewer and audio annotation editor.
Chris@2 5 Chris Cannam, Queen Mary University of London, 2005-2006
Chris@0 6
Chris@0 7 This is experimental software. Not for distribution.
Chris@0 8 */
Chris@0 9
Chris@0 10 #ifndef _AUDIO_GENERATOR_H_
Chris@0 11 #define _AUDIO_GENERATOR_H_
Chris@0 12
Chris@0 13 class Model;
Chris@0 14 class ViewManager;
Chris@11 15 class NoteModel;
Chris@0 16 class DenseTimeValueModel;
Chris@0 17 class SparseOneDimensionalModel;
Chris@0 18 class RealTimePluginInstance;
Chris@0 19
Chris@8 20 #include <QMutex>
Chris@8 21
Chris@0 22 #include <set>
Chris@0 23 #include <map>
Chris@0 24
Chris@0 25 class AudioGenerator
Chris@0 26 {
Chris@0 27 public:
Chris@0 28 AudioGenerator(ViewManager *);
Chris@0 29 virtual ~AudioGenerator();
Chris@0 30
Chris@0 31 /**
Chris@0 32 * Add a data model to be played from and initialise any
Chris@0 33 * necessary audio generation code.
Chris@10 34 * Returns true if the model is of a type that we know how to play.
Chris@10 35 * (The model will be added regardless.)
Chris@0 36 */
Chris@10 37 virtual bool addModel(Model *model);
Chris@0 38
Chris@0 39 /**
Chris@0 40 * Remove a model.
Chris@0 41 */
Chris@0 42 virtual void removeModel(Model *model);
Chris@0 43
Chris@0 44 /**
Chris@0 45 * Remove all models.
Chris@0 46 */
Chris@0 47 virtual void clearModels();
Chris@0 48
Chris@0 49 /**
Chris@0 50 * Reset playback, clearing plugins and the like.
Chris@0 51 */
Chris@0 52 virtual void reset();
Chris@0 53
Chris@0 54 /**
Chris@0 55 * Set the target channel count. The buffer parameter to mixModel
Chris@0 56 * must always point to at least this number of arrays.
Chris@0 57 */
Chris@0 58 virtual void setTargetChannelCount(size_t channelCount);
Chris@0 59
Chris@0 60 /**
Chris@0 61 * Return the internal processing block size. The frameCount
Chris@0 62 * argument to all mixModel calls must be a multiple of this
Chris@0 63 * value.
Chris@0 64 */
Chris@0 65 virtual size_t getBlockSize() const;
Chris@0 66
Chris@0 67 /**
Chris@0 68 * Mix a single model into an output buffer.
Chris@0 69 */
Chris@0 70 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
Chris@4 71 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
Chris@0 72
Chris@0 73 protected:
Chris@0 74 ViewManager *m_viewManager;
Chris@0 75 size_t m_sourceSampleRate;
Chris@0 76 size_t m_targetChannelCount;
Chris@0 77
Chris@0 78 struct NoteOff {
Chris@0 79
Chris@0 80 int pitch;
Chris@0 81 size_t frame;
Chris@0 82
Chris@0 83 struct Comparator {
Chris@0 84 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
Chris@0 85 return n1.frame < n2.frame;
Chris@0 86 }
Chris@0 87 };
Chris@0 88 };
Chris@0 89
Chris@11 90 typedef std::map<Model *, RealTimePluginInstance *> PluginMap;
Chris@0 91
Chris@0 92 typedef std::set<NoteOff, NoteOff::Comparator> NoteOffSet;
Chris@11 93 typedef std::map<Model *, NoteOffSet> NoteOffMap;
Chris@0 94
Chris@8 95 QMutex m_mutex;
Chris@0 96 PluginMap m_synthMap;
Chris@0 97 NoteOffMap m_noteOffs;
Chris@0 98
Chris@11 99 virtual RealTimePluginInstance *loadPlugin(QString id, QString program);
Chris@11 100
Chris@0 101 virtual size_t mixDenseTimeValueModel
Chris@0 102 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
Chris@4 103 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@0 104
Chris@0 105 virtual size_t mixSparseOneDimensionalModel
Chris@0 106 (SparseOneDimensionalModel *model, size_t startFrame, size_t frameCount,
Chris@4 107 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@0 108
Chris@11 109 virtual size_t mixNoteModel
Chris@11 110 (NoteModel *model, size_t startFrame, size_t frameCount,
Chris@11 111 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@11 112
Chris@0 113 static const size_t m_pluginBlockSize;
Chris@0 114 };
Chris@0 115
Chris@0 116 #endif
Chris@0 117