annotate audioio/AudioGenerator.h @ 256:f3f9e3d647c1

Give a dedicated key to toggling the centre line, and move it out of the overlay level setting -- reducing number of overlay levels to 3. Introduce two distinct vertical scale types (so that we can hide the spectrogram colour scale part easily)
author Chris Cannam
date Mon, 30 Jan 2012 16:02:14 +0000
parents e81c1ea227ee
children a98f1638c5ec 6c6950bd7d53
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;
Chris@43 21 class DenseTimeValueModel;
Chris@43 22 class SparseOneDimensionalModel;
Chris@43 23 class RealTimePluginInstance;
Chris@108 24 class Playable;
Chris@43 25
Chris@43 26 #include <QObject>
Chris@43 27 #include <QMutex>
Chris@43 28
Chris@43 29 #include <set>
Chris@43 30 #include <map>
Chris@43 31
Chris@43 32 class AudioGenerator : public QObject
Chris@43 33 {
Chris@43 34 Q_OBJECT
Chris@43 35
Chris@43 36 public:
Chris@43 37 AudioGenerator();
Chris@43 38 virtual ~AudioGenerator();
Chris@43 39
Chris@43 40 /**
Chris@43 41 * Add a data model to be played from and initialise any necessary
Chris@43 42 * audio generation code. Returns true if the model will be
Chris@108 43 * played. The model will be added regardless of the return
Chris@108 44 * value.
Chris@43 45 */
Chris@43 46 virtual bool addModel(Model *model);
Chris@43 47
Chris@43 48 /**
Chris@43 49 * Remove a model.
Chris@43 50 */
Chris@43 51 virtual void removeModel(Model *model);
Chris@43 52
Chris@43 53 /**
Chris@43 54 * Remove all models.
Chris@43 55 */
Chris@43 56 virtual void clearModels();
Chris@43 57
Chris@43 58 /**
Chris@43 59 * Reset playback, clearing plugins and the like.
Chris@43 60 */
Chris@43 61 virtual void reset();
Chris@43 62
Chris@43 63 /**
Chris@43 64 * Set the target channel count. The buffer parameter to mixModel
Chris@43 65 * must always point to at least this number of arrays.
Chris@43 66 */
Chris@43 67 virtual void setTargetChannelCount(size_t channelCount);
Chris@43 68
Chris@43 69 /**
Chris@43 70 * Return the internal processing block size. The frameCount
Chris@43 71 * argument to all mixModel calls must be a multiple of this
Chris@43 72 * value.
Chris@43 73 */
Chris@43 74 virtual size_t getBlockSize() const;
Chris@43 75
Chris@43 76 /**
Chris@43 77 * Mix a single model into an output buffer.
Chris@43 78 */
Chris@43 79 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
Chris@43 80 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
Chris@43 81
Chris@43 82 /**
Chris@43 83 * Specify that only the given set of models should be played.
Chris@43 84 */
Chris@43 85 virtual void setSoloModelSet(std::set<Model *>s);
Chris@43 86
Chris@43 87 /**
Chris@43 88 * Specify that all models should be played as normal (if not
Chris@43 89 * muted).
Chris@43 90 */
Chris@43 91 virtual void clearSoloModelSet();
Chris@43 92
Chris@43 93 protected slots:
Chris@108 94 void playPluginIdChanged(const Playable *, QString);
Chris@108 95 void playPluginConfigurationChanged(const Playable *, QString);
Chris@43 96
Chris@43 97 protected:
Chris@43 98 size_t m_sourceSampleRate;
Chris@43 99 size_t m_targetChannelCount;
Chris@43 100
Chris@43 101 bool m_soloing;
Chris@43 102 std::set<Model *> m_soloModelSet;
Chris@43 103
Chris@43 104 struct NoteOff {
Chris@43 105
Chris@43 106 int pitch;
Chris@43 107 size_t frame;
Chris@43 108
Chris@43 109 struct Comparator {
Chris@43 110 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
Chris@43 111 return n1.frame < n2.frame;
Chris@43 112 }
Chris@43 113 };
Chris@43 114 };
Chris@43 115
Chris@43 116 typedef std::map<const Model *, RealTimePluginInstance *> PluginMap;
Chris@43 117
Chris@178 118 typedef std::multiset<NoteOff, NoteOff::Comparator> NoteOffSet;
Chris@43 119 typedef std::map<const Model *, NoteOffSet> NoteOffMap;
Chris@43 120
Chris@43 121 QMutex m_mutex;
Chris@43 122 PluginMap m_synthMap;
Chris@43 123 NoteOffMap m_noteOffs;
Chris@43 124 static QString m_sampleDir;
Chris@43 125
Chris@43 126 virtual RealTimePluginInstance *loadPluginFor(const Model *model);
Chris@43 127 virtual RealTimePluginInstance *loadPlugin(QString id, QString program);
Chris@108 128 static void initialiseSampleDir();
Chris@43 129 static void setSampleDir(RealTimePluginInstance *plugin);
Chris@43 130
Chris@43 131 virtual size_t mixDenseTimeValueModel
Chris@43 132 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
Chris@43 133 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@43 134
Chris@43 135 virtual size_t mixSparseOneDimensionalModel
Chris@43 136 (SparseOneDimensionalModel *model, size_t startFrame, size_t frameCount,
Chris@43 137 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@43 138
Chris@43 139 virtual size_t mixNoteModel
Chris@43 140 (NoteModel *model, size_t startFrame, size_t frameCount,
Chris@43 141 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@43 142
Chris@43 143 static const size_t m_pluginBlockSize;
Chris@43 144 };
Chris@43 145
Chris@43 146 #endif
Chris@43 147