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
|