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@0
|
33 */
|
Chris@0
|
34 virtual void addModel(Model *model);
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * Remove a model.
|
Chris@0
|
38 */
|
Chris@0
|
39 virtual void removeModel(Model *model);
|
Chris@0
|
40
|
Chris@0
|
41 /**
|
Chris@0
|
42 * Remove all models.
|
Chris@0
|
43 */
|
Chris@0
|
44 virtual void clearModels();
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * Reset playback, clearing plugins and the like.
|
Chris@0
|
48 */
|
Chris@0
|
49 virtual void reset();
|
Chris@0
|
50
|
Chris@0
|
51 /**
|
Chris@0
|
52 * Set the target channel count. The buffer parameter to mixModel
|
Chris@0
|
53 * must always point to at least this number of arrays.
|
Chris@0
|
54 */
|
Chris@0
|
55 virtual void setTargetChannelCount(size_t channelCount);
|
Chris@0
|
56
|
Chris@0
|
57 /**
|
Chris@0
|
58 * Return the internal processing block size. The frameCount
|
Chris@0
|
59 * argument to all mixModel calls must be a multiple of this
|
Chris@0
|
60 * value.
|
Chris@0
|
61 */
|
Chris@0
|
62 virtual size_t getBlockSize() const;
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * Mix a single model into an output buffer.
|
Chris@0
|
66 */
|
Chris@0
|
67 virtual size_t mixModel(Model *model, size_t startFrame, size_t frameCount,
|
Chris@4
|
68 float **buffer, size_t fadeIn = 0, size_t fadeOut = 0);
|
Chris@0
|
69
|
Chris@0
|
70 protected:
|
Chris@0
|
71 ViewManager *m_viewManager;
|
Chris@0
|
72 size_t m_sourceSampleRate;
|
Chris@0
|
73 size_t m_targetChannelCount;
|
Chris@0
|
74
|
Chris@0
|
75 struct NoteOff {
|
Chris@0
|
76
|
Chris@0
|
77 int pitch;
|
Chris@0
|
78 size_t frame;
|
Chris@0
|
79
|
Chris@0
|
80 struct Comparator {
|
Chris@0
|
81 bool operator()(const NoteOff &n1, const NoteOff &n2) const {
|
Chris@0
|
82 return n1.frame < n2.frame;
|
Chris@0
|
83 }
|
Chris@0
|
84 };
|
Chris@0
|
85 };
|
Chris@0
|
86
|
Chris@0
|
87 typedef std::map<SparseOneDimensionalModel *,
|
Chris@0
|
88 RealTimePluginInstance *> PluginMap;
|
Chris@0
|
89
|
Chris@0
|
90 typedef std::set<NoteOff, NoteOff::Comparator> NoteOffSet;
|
Chris@0
|
91 typedef std::map<SparseOneDimensionalModel *, NoteOffSet> NoteOffMap;
|
Chris@0
|
92
|
Chris@8
|
93 QMutex m_mutex;
|
Chris@0
|
94 PluginMap m_synthMap;
|
Chris@0
|
95 NoteOffMap m_noteOffs;
|
Chris@0
|
96
|
Chris@0
|
97 virtual size_t mixDenseTimeValueModel
|
Chris@0
|
98 (DenseTimeValueModel *model, size_t startFrame, size_t frameCount,
|
Chris@4
|
99 float **buffer, float gain, float pan, size_t fadeIn, size_t fadeOut);
|
Chris@0
|
100
|
Chris@0
|
101 virtual size_t mixSparseOneDimensionalModel
|
Chris@0
|
102 (SparseOneDimensionalModel *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 static const size_t m_pluginBlockSize;
|
Chris@0
|
106 };
|
Chris@0
|
107
|
Chris@0
|
108 #endif
|
Chris@0
|
109
|