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@0
|
15 class DenseTimeValueModel;
|
Chris@0
|
16 class SparseOneDimensionalModel;
|
Chris@0
|
17 class RealTimePluginInstance;
|
Chris@0
|
18
|
Chris@8
|
19 #include <QMutex>
|
Chris@8
|
20
|
Chris@0
|
21 #include <set>
|
Chris@0
|
22 #include <map>
|
Chris@0
|
23
|
Chris@0
|
24 class AudioGenerator
|
Chris@0
|
25 {
|
Chris@0
|
26 public:
|
Chris@0
|
27 AudioGenerator(ViewManager *);
|
Chris@0
|
28 virtual ~AudioGenerator();
|
Chris@0
|
29
|
Chris@0
|
30 /**
|
Chris@0
|
31 * Add a data model to be played from and initialise any
|
Chris@0
|
32 * necessary audio generation code.
|
Chris@10
|
33 * Returns true if the model is of a type that we know how to play.
|
Chris@10
|
34 * (The model will be added regardless.)
|
Chris@0
|
35 */
|
Chris@10
|
36 virtual bool addModel(Model *model);
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * Remove a model.
|
Chris@0
|
40 */
|
Chris@0
|
41 virtual void removeModel(Model *model);
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * Remove all models.
|
Chris@0
|
45 */
|
Chris@0
|
46 virtual void clearModels();
|
Chris@0
|
47
|
Chris@0
|
48 /**
|
Chris@0
|
49 * Reset playback, clearing plugins and the like.
|
Chris@0
|
50 */
|
Chris@0
|
51 virtual void reset();
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * Set the target channel count. The buffer parameter to mixModel
|
Chris@0
|
55 * must always point to at least this number of arrays.
|
Chris@0
|
56 */
|
Chris@0
|
57 virtual void setTargetChannelCount(size_t channelCount);
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * Return the internal processing block size. The frameCount
|
Chris@0
|
61 * argument to all mixModel calls must be a multiple of this
|
Chris@0
|
62 * value.
|
Chris@0
|
63 */
|
Chris@0
|
64 virtual size_t getBlockSize() const;
|
Chris@0
|
65
|
Chris@0
|
66 /**
|
Chris@0
|
67 * Mix a single model into an output buffer.
|
Chris@0
|
68 */
|
Chris@0
|
69 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
|
Chris@4
|
70 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
|
Chris@0
|
71
|
Chris@0
|
72 protected:
|
Chris@0
|
73 ViewManager *m_viewManager;
|
Chris@0
|
74 size_t m_sourceSampleRate;
|
Chris@0
|
75 size_t m_targetChannelCount;
|
Chris@0
|
76
|
Chris@0
|
77 struct NoteOff {
|
Chris@0
|
78
|
Chris@0
|
79 int pitch;
|
Chris@0
|
80 size_t frame;
|
Chris@0
|
81
|
Chris@0
|
82 struct Comparator {
|
Chris@0
|
83 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
|
Chris@0
|
84 return n1.frame < n2.frame;
|
Chris@0
|
85 }
|
Chris@0
|
86 };
|
Chris@0
|
87 };
|
Chris@0
|
88
|
Chris@0
|
89 typedef std::map<SparseOneDimensionalModel *,
|
Chris@0
|
90 RealTimePluginInstance *> PluginMap;
|
Chris@0
|
91
|
Chris@0
|
92 typedef std::set<NoteOff, NoteOff::Comparator> NoteOffSet;
|
Chris@0
|
93 typedef std::map<SparseOneDimensionalModel *, 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@0
|
99 virtual size_t mixDenseTimeValueModel
|
Chris@0
|
100 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
|
Chris@4
|
101 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
|
Chris@0
|
102
|
Chris@0
|
103 virtual size_t mixSparseOneDimensionalModel
|
Chris@0
|
104 (SparseOneDimensionalModel *model, size_t startFrame, size_t frameCount,
|
Chris@4
|
105 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
|
Chris@0
|
106
|
Chris@0
|
107 static const size_t m_pluginBlockSize;
|
Chris@0
|
108 };
|
Chris@0
|
109
|
Chris@0
|
110 #endif
|
Chris@0
|
111
|