annotate audioio/AudioGenerator.h @ 21:ebe07d3560e6

* Update licensing rubric for GPL
author Chris Cannam
date Mon, 20 Mar 2006 15:10:07 +0000
parents c606d3ffa397
children 7f32bb07629a
rev   line source
Chris@19 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@21 4 Sonic Visualiser
Chris@21 5 An audio file viewer and annotation editor.
Chris@21 6 Centre for Digital Music, Queen Mary, University of London.
Chris@21 7 This file copyright 2006 Chris Cannam.
Chris@0 8
Chris@21 9 This program is free software; you can redistribute it and/or
Chris@21 10 modify it under the terms of the GNU General Public License as
Chris@21 11 published by the Free Software Foundation; either version 2 of the
Chris@21 12 License, or (at your option) any later version. See the file
Chris@21 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #ifndef _AUDIO_GENERATOR_H_
Chris@0 17 #define _AUDIO_GENERATOR_H_
Chris@0 18
Chris@0 19 class Model;
Chris@0 20 class ViewManager;
Chris@11 21 class NoteModel;
Chris@0 22 class DenseTimeValueModel;
Chris@0 23 class SparseOneDimensionalModel;
Chris@0 24 class RealTimePluginInstance;
Chris@0 25
Chris@8 26 #include <QMutex>
Chris@8 27
Chris@0 28 #include <set>
Chris@0 29 #include <map>
Chris@0 30
Chris@0 31 class AudioGenerator
Chris@0 32 {
Chris@0 33 public:
Chris@0 34 AudioGenerator(ViewManager *);
Chris@0 35 virtual ~AudioGenerator();
Chris@0 36
Chris@0 37 /**
Chris@13 38 * Return true if the given model is of a type that we generally
Chris@13 39 * know how to play. This doesn't guarantee that a specific
Chris@13 40 * AudioGenerator will actually produce sounds for it (for
Chris@13 41 * example, it may turn out that a vital plugin is missing).
Chris@13 42 */
Chris@13 43 static bool canPlay(const Model *model);
Chris@13 44
Chris@13 45 /**
Chris@13 46 * Add a data model to be played from and initialise any necessary
Chris@13 47 * audio generation code. Returns true if the model will be
Chris@13 48 * played. (The return value test here is stricter than that for
Chris@13 49 * canPlay, above.) The model will be added regardless of the
Chris@13 50 * return value.
Chris@0 51 */
Chris@10 52 virtual bool addModel(Model *model);
Chris@0 53
Chris@0 54 /**
Chris@0 55 * Remove a model.
Chris@0 56 */
Chris@0 57 virtual void removeModel(Model *model);
Chris@0 58
Chris@0 59 /**
Chris@0 60 * Remove all models.
Chris@0 61 */
Chris@0 62 virtual void clearModels();
Chris@0 63
Chris@0 64 /**
Chris@0 65 * Reset playback, clearing plugins and the like.
Chris@0 66 */
Chris@0 67 virtual void reset();
Chris@0 68
Chris@0 69 /**
Chris@0 70 * Set the target channel count. The buffer parameter to mixModel
Chris@0 71 * must always point to at least this number of arrays.
Chris@0 72 */
Chris@0 73 virtual void setTargetChannelCount(size_t channelCount);
Chris@0 74
Chris@0 75 /**
Chris@0 76 * Return the internal processing block size. The frameCount
Chris@0 77 * argument to all mixModel calls must be a multiple of this
Chris@0 78 * value.
Chris@0 79 */
Chris@0 80 virtual size_t getBlockSize() const;
Chris@0 81
Chris@0 82 /**
Chris@0 83 * Mix a single model into an output buffer.
Chris@0 84 */
Chris@0 85 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
Chris@4 86 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
Chris@0 87
Chris@0 88 protected:
Chris@0 89 ViewManager *m_viewManager;
Chris@0 90 size_t m_sourceSampleRate;
Chris@0 91 size_t m_targetChannelCount;
Chris@0 92
Chris@0 93 struct NoteOff {
Chris@0 94
Chris@0 95 int pitch;
Chris@0 96 size_t frame;
Chris@0 97
Chris@0 98 struct Comparator {
Chris@0 99 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
Chris@0 100 return n1.frame < n2.frame;
Chris@0 101 }
Chris@0 102 };
Chris@0 103 };
Chris@0 104
Chris@11 105 typedef std::map<Model *, RealTimePluginInstance *> PluginMap;
Chris@0 106
Chris@0 107 typedef std::set<NoteOff, NoteOff::Comparator> NoteOffSet;
Chris@11 108 typedef std::map<Model *, NoteOffSet> NoteOffMap;
Chris@0 109
Chris@8 110 QMutex m_mutex;
Chris@0 111 PluginMap m_synthMap;
Chris@0 112 NoteOffMap m_noteOffs;
Chris@0 113
Chris@11 114 virtual RealTimePluginInstance *loadPlugin(QString id, QString program);
Chris@11 115
Chris@0 116 virtual size_t mixDenseTimeValueModel
Chris@0 117 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
Chris@4 118 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@0 119
Chris@0 120 virtual size_t mixSparseOneDimensionalModel
Chris@0 121 (SparseOneDimensionalModel *model, size_t startFrame, size_t frameCount,
Chris@4 122 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@0 123
Chris@11 124 virtual size_t mixNoteModel
Chris@11 125 (NoteModel *model, size_t startFrame, size_t frameCount,
Chris@11 126 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
Chris@11 127
Chris@0 128 static const size_t m_pluginBlockSize;
Chris@0 129 };
Chris@0 130
Chris@0 131 #endif
Chris@0 132