Audacity 3.2.0
MixerBoard.h
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 MixerBoard.h
6
7 Vaughan Johnson, January 2007
8
9**********************************************************************/
10
11
12
13
14#ifndef __AUDACITY_MIXER_BOARD__
15#define __AUDACITY_MIXER_BOARD__
16
17#include <wx/frame.h> // to inherit
18#include <wx/scrolwin.h> // to inherit
19
20#include "widgets/ASlider.h" // to inherit
22
23#include "Observer.h"
24#include "Prefs.h"
25
26class wxArrayString;
27class wxBitmapButton;
28class wxImage;
29class wxMemoryDC;
30class AButton;
31struct AudioIOEvent;
32struct TrackListEvent;
34
35using ChannelGroupSampleView = std::vector<std::vector<AudioSegmentSampleView>>;
36
37// containment hierarchy:
38// MixerBoardFrame -> MixerBoard -> MixerBoardScrolledWindow -> MixerTrackCluster(s)
39
40
41// MixerTrackSlider is a subclass just to override OnMouseEvent,
42// so we can know when adjustment ends, so we can PushState only then.
43class MixerTrackSlider final : public ASlider
44{
45public:
46 MixerTrackSlider(wxWindow * parent,
47 wxWindowID id,
49 const wxPoint & pos,
50 const wxSize & size,
51 const ASlider::Options &options = ASlider::Options{});
52 virtual ~MixerTrackSlider() {}
53
54 void OnMouseEvent(wxMouseEvent & event);
55
56 void OnFocus(wxFocusEvent &event);
57 void OnCaptureKey(wxCommandEvent& event);
58
59protected:
60 bool mIsPan;
61
62public:
63 DECLARE_EVENT_TABLE()
64};
65
66
67class AudacityProject;
68class MeterPanel;
69class MixerBoard;
70
71class Track;
72#ifdef USE_MIDI
73class NoteTrack;
74#endif
75class PlayableTrack;
76
77class WaveChannel;
78class WaveTrack;
79class auStaticText;
80
82{
83public:
84 MixerTrackCluster(wxWindow* parent,
85 MixerBoard* grandParent, AudacityProject* project,
86 const std::shared_ptr<PlayableTrack> &pTrack,
87 const wxPoint& pos = wxDefaultPosition,
88 const wxSize& size = wxDefaultSize);
89 virtual ~MixerTrackCluster() {}
90
91 WaveTrack *GetWave() const;
92 WaveChannel *GetRight() const;
93#ifdef EXPERIMENTAL_MIDI_OUT
94 NoteTrack *GetNote() const;
95#endif
96
97 //void UpdatePrefs();
98
99 void HandleResize(); // For wxSizeEvents, update gain slider and meter.
100
101 void HandleSliderGain(const bool bWantPushState = false);
102#ifdef EXPERIMENTAL_MIDI_OUT
103 void HandleSliderVelocity(const bool bWantPushState = false);
104#endif
105 void HandleSliderPan(const bool bWantPushState = false);
106
107 void ResetMeter(const bool bResetClipping);
108
110 void UpdateMeter(const double t0, const double t1);
111
112private:
113 wxColour GetTrackColor();
114
115 // event handlers
116 void HandleSelect(bool bShiftDown, bool bControlDown);
117
118 void OnKeyEvent(wxKeyEvent& event);
119 void OnMouseEvent(wxMouseEvent& event);
120 void OnPaint(wxPaintEvent& evt);
121
122 void OnButton_MusicalInstrument(wxCommandEvent& event);
123 void OnSlider_Gain(wxCommandEvent& event);
124#ifdef EXPERIMENTAL_MIDI_OUT
125 void OnSlider_Velocity(wxCommandEvent& event);
126#endif
127 void OnSlider_Pan(wxCommandEvent& event);
128 void OnButton_Mute(wxCommandEvent& event);
129 void OnButton_Solo(wxCommandEvent& event);
130 //v void OnSliderScroll_Gain(wxScrollEvent& event);
131
132
133public:
134 std::shared_ptr<PlayableTrack> mTrack;
135
136private:
139
140 // controls
147#ifdef EXPERIMENTAL_MIDI_OUT
148 MixerTrackSlider* mSlider_Velocity;
149#endif
150 wxWeakRef<MeterPanel> mMeter;
152
153public:
154 DECLARE_EVENT_TABLE()
155};
156
157
159{
160public:
161 MusicalInstrument(std::unique_ptr<wxBitmap> &&pBitmap, const wxString & strXPMfilename);
162 virtual ~MusicalInstrument();
163
164 std::unique_ptr<wxBitmap> mBitmap;
165 wxArrayString mKeywords;
166};
167
168using MusicalInstrumentArray = std::vector<std::unique_ptr<MusicalInstrument>>;
169
170
171
172// wxScrolledWindow ignores mouse clicks in client area,
173// but they don't get passed to Mixerboard.
174// We need to catch them to deselect all track clusters.
175class MixerBoardScrolledWindow final : public wxScrolledWindow
176{
177public:
179 MixerBoard* parent, wxWindowID id = -1,
180 const wxPoint& pos = wxDefaultPosition,
181 const wxSize& size = wxDefaultSize,
182 long style = wxHSCROLL | wxVSCROLL);
184
185private:
186 void OnMouseEvent(wxMouseEvent& event);
187
188private:
191
192public:
193 DECLARE_EVENT_TABLE()
194};
195
196
197class MixerBoardFrame;
198class TrackList;
199
200class MixerBoard final : public wxWindow, private PrefsListener
201{
202 friend class MixerBoardFrame;
203
204public:
205 MixerBoard(AudacityProject* pProject,
206 wxFrame* parent,
207 const wxPoint& pos = wxDefaultPosition,
208 const wxSize& size = wxDefaultSize);
209
210 void UpdatePrefs() override;
211
212 // Add clusters for any tracks we're not yet showing.
213 // Update pointers for tracks we're already showing.
214 void UpdateTrackClusters();
215
217
218
219 wxBitmap* GetMusicalInstrumentBitmap(const Track *pTrack);
220
221 bool HasSolo();
222
223 void RefreshTrackClusters(bool bEraseBackground = true);
224 void ResizeTrackClusters();
225
226 void UpdateMeters(const double t1, const bool bLoopedPlay);
227
228 void UpdateWidth();
229
230private:
231 void ResetMeters(const bool bResetClipping);
232 void RemoveTrackCluster(size_t nIndex);
233 void MakeButtonBitmap( wxMemoryDC & dc, wxBitmap & bitmap,
234 wxRect & bev, const TranslatableString & str, bool up );
236 int FindMixerTrackCluster(const PlayableTrack* pTrack,
237 MixerTrackCluster** hMixerTrackCluster) const;
239
240 // event handlers
241 void OnPaint(wxPaintEvent& evt);
242 void OnSize(wxSizeEvent &evt);
244 void OnTrackSetChanged();
245 void OnTrackChanged(const TrackListEvent &event);
247
248public:
249 // mute & solo button images: Create once and store on MixerBoard for use in all MixerTrackClusters.
250 std::unique_ptr<wxImage> mImageMuteUp, mImageMuteOver, mImageMuteDown,
251 mImageMuteDownWhileSolo, // the one actually alternate image
253
255
256private:
260
261 // Track clusters are maintained in the same order as the WaveTracks.
262 std::vector<MixerTrackCluster*> mMixerTrackClusters;
263
266 MixerBoardScrolledWindow* mScrolledWindow; // Holds the MixerTrackClusters and handles scrolling.
267 double mPrevT1;
269 bool mUpToDate{ false };
270
271public:
272 DECLARE_EVENT_TABLE()
273};
274
275
277 : public wxFrame
279{
280public:
282 virtual ~MixerBoardFrame();
283
284 void Recreate(AudacityProject *pProject);
285
286private:
287 // event handlers
288 void OnCloseWindow(wxCloseEvent &WXUNUSED(event));
289 void OnMaximize(wxMaximizeEvent &event);
290 void OnSize(wxSizeEvent &evt);
291 void OnKeyEvent(wxKeyEvent &evt);
292
293 void SetWindowTitle();
294
297public:
299
300public:
301 DECLARE_EVENT_TABLE()
302};
303
304#endif // __AUDACITY_MIXER_BOARD__
305
306
wxImage(22, 22)
#define str(a)
const TranslatableString name
Definition: Distortion.cpp:76
std::vector< std::unique_ptr< MusicalInstrument > > MusicalInstrumentArray
Definition: MixerBoard.h:168
std::vector< std::vector< AudioSegmentSampleView > > ChannelGroupSampleView
Definition: MixerBoard.h:35
const auto project
A wxButton with mouse-over behaviour.
Definition: AButton.h:104
ASlider is a custom slider, allowing for a slicker look and feel.
Definition: ASlider.h:260
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
MeterPanel is a panel that paints the meter used for monitoring or playback.
Definition: MeterPanel.h:104
void OnKeyEvent(wxKeyEvent &evt)
void OnMaximize(wxMaximizeEvent &event)
Observer::Subscription mTitleChangeSubscription
Definition: MixerBoard.h:295
void OnCloseWindow(wxCloseEvent &WXUNUSED(event))
AudacityProject * mProject
Definition: MixerBoard.h:296
MixerBoardFrame(AudacityProject *parent)
void OnSize(wxSizeEvent &evt)
MixerBoard * mMixerBoard
Definition: MixerBoard.h:298
virtual ~MixerBoardFrame()
void Recreate(AudacityProject *pProject)
bool mUpToDate
Definition: MixerBoard.h:269
void OnSize(wxSizeEvent &evt)
void OnStartStop(AudioIOEvent)
int FindMixerTrackCluster(const PlayableTrack *pTrack, MixerTrackCluster **hMixerTrackCluster) const
std::unique_ptr< wxImage > mImageMuteDownWhileSolo
Definition: MixerBoard.h:251
void UpdateWidth()
void ResizeTrackClusters()
MusicalInstrumentArray mMusicalInstruments
Definition: MixerBoard.h:264
void UpdateMeters(const double t1, const bool bLoopedPlay)
void OnPaint(wxPaintEvent &evt)
void OnTrackSetChanged()
TrackList * mTracks
Definition: MixerBoard.h:268
std::unique_ptr< wxImage > mImageMuteDown
Definition: MixerBoard.h:250
std::unique_ptr< wxImage > mImageMuteDisabled
Definition: MixerBoard.h:252
std::unique_ptr< wxImage > mImageMuteOver
Definition: MixerBoard.h:250
std::unique_ptr< wxImage > mImageSoloDown
Definition: MixerBoard.h:252
void MakeButtonBitmap(wxMemoryDC &dc, wxBitmap &bitmap, wxRect &bev, const TranslatableString &str, bool up)
void UpdatePrefs() override
Definition: MixerBoard.cpp:980
void OnTimer(Observer::Message)
MixerBoardScrolledWindow * mScrolledWindow
Definition: MixerBoard.h:266
std::unique_ptr< wxImage > mImageMuteUp
Definition: MixerBoard.h:250
wxBitmap * GetMusicalInstrumentBitmap(const Track *pTrack)
void OnTrackChanged(const TrackListEvent &event)
void UpdateTrackClusters()
bool HasSolo()
Observer::Subscription mTrackPanelSubscription
Definition: MixerBoard.h:258
Observer::Subscription mAudioIOSubscription
Definition: MixerBoard.h:259
void ResetMeters(const bool bResetClipping)
MixerBoard(AudacityProject *pProject, wxFrame *parent, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize)
Definition: MixerBoard.cpp:894
std::unique_ptr< wxImage > mImageSoloDisabled
Definition: MixerBoard.h:252
std::unique_ptr< wxImage > mImageSoloUp
Definition: MixerBoard.h:252
int GetTrackClustersWidth()
void RemoveTrackCluster(size_t nIndex)
void CreateMuteSoloImages()
std::unique_ptr< wxImage > mImageSoloOver
Definition: MixerBoard.h:252
void LoadMusicalInstruments()
AudacityProject * mProject
Definition: MixerBoard.h:265
std::vector< MixerTrackCluster * > mMixerTrackClusters
Definition: MixerBoard.h:262
void RefreshTrackClusters(bool bEraseBackground=true)
int mMuteSoloWidth
Definition: MixerBoard.h:254
Observer::Subscription mPlaybackScrollerSubscription
Definition: MixerBoard.h:257
double mPrevT1
Definition: MixerBoard.h:267
AudacityProject * mProject
Definition: MixerBoard.h:190
MixerBoard * mMixerBoard
Definition: MixerBoard.h:189
virtual ~MixerBoardScrolledWindow()
Definition: MixerBoard.cpp:863
void OnMouseEvent(wxMouseEvent &event)
Definition: MixerBoard.cpp:867
MixerBoardScrolledWindow(AudacityProject *project, MixerBoard *parent, wxWindowID id=-1, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxHSCROLL|wxVSCROLL)
Definition: MixerBoard.cpp:852
wxBitmapButton * mBitmapButton_MusicalInstrument
Definition: MixerBoard.h:142
void OnSlider_Gain(wxCommandEvent &event)
Definition: MixerBoard.cpp:757
void HandleSliderGain(const bool bWantPushState=false)
Definition: MixerBoard.cpp:416
MixerTrackSlider * mSlider_Gain
Definition: MixerBoard.h:146
void UpdateForStateChange()
Definition: MixerBoard.cpp:470
void OnButton_MusicalInstrument(wxCommandEvent &event)
Definition: MixerBoard.cpp:751
std::shared_ptr< PlayableTrack > mTrack
Definition: MixerBoard.h:134
AudacityProject * mProject
Definition: MixerBoard.h:138
void ResetMeter(const bool bResetClipping)
Definition: MixerBoard.cpp:460
void OnSlider_Pan(wxCommandEvent &event)
Definition: MixerBoard.cpp:784
WaveTrack * GetWave() const
Definition: MixerBoard.cpp:341
AButton * mToggleButton_Mute
Definition: MixerBoard.h:143
ChannelGroupSampleView mSampleView
Definition: MixerBoard.h:151
MixerBoard * mMixerBoard
Definition: MixerBoard.h:137
wxWeakRef< MeterPanel > mMeter
Definition: MixerBoard.h:150
void UpdateMeter(const double t0, const double t1)
Definition: MixerBoard.cpp:538
void OnPaint(wxPaintEvent &evt)
Definition: MixerBoard.cpp:724
void OnButton_Mute(wxCommandEvent &event)
Definition: MixerBoard.cpp:789
WaveChannel * GetRight() const
Definition: MixerBoard.cpp:346
void HandleSelect(bool bShiftDown, bool bControlDown)
Definition: MixerBoard.cpp:710
void OnKeyEvent(wxKeyEvent &event)
wxColour GetTrackColor()
Definition: MixerBoard.cpp:702
void OnMouseEvent(wxMouseEvent &event)
Definition: MixerBoard.cpp:716
MixerTrackCluster(wxWindow *parent, MixerBoard *grandParent, AudacityProject *project, const std::shared_ptr< PlayableTrack > &pTrack, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize)
Definition: MixerBoard.cpp:176
virtual ~MixerTrackCluster()
Definition: MixerBoard.h:89
void OnButton_Solo(wxCommandEvent &event)
Definition: MixerBoard.cpp:803
MixerTrackSlider * mSlider_Pan
Definition: MixerBoard.h:145
void HandleSliderPan(const bool bWantPushState=false)
Definition: MixerBoard.cpp:445
auStaticText * mStaticText_TrackName
Definition: MixerBoard.h:141
AButton * mToggleButton_Solo
Definition: MixerBoard.h:144
void OnCaptureKey(wxCommandEvent &event)
Definition: MixerBoard.cpp:115
void OnFocus(wxFocusEvent &event)
Definition: MixerBoard.cpp:110
void OnMouseEvent(wxMouseEvent &event)
Definition: MixerBoard.cpp:94
virtual ~MixerTrackSlider()
Definition: MixerBoard.h:52
MixerTrackSlider(wxWindow *parent, wxWindowID id, const TranslatableString &name, const wxPoint &pos, const wxSize &size, const ASlider::Options &options=ASlider::Options{})
Definition: MixerBoard.cpp:84
MusicalInstrument(std::unique_ptr< wxBitmap > &&pBitmap, const wxString &strXPMfilename)
Definition: MixerBoard.cpp:818
virtual ~MusicalInstrument()
Definition: MixerBoard.cpp:836
std::unique_ptr< wxBitmap > mBitmap
Definition: MixerBoard.h:164
wxArrayString mKeywords
Definition: MixerBoard.h:165
A Track that is used for Midi notes. (Somewhat old code).
Definition: NoteTrack.h:86
A move-only handle representing a connection to a Publisher.
Definition: Observer.h:70
AudioTrack subclass that can also be audibly replayed by the program.
Definition: PlayableTrack.h:40
A listener notified of changes in preferences.
Definition: Prefs.h:561
Abstract base class for an object holding data associated with points on a time axis.
Definition: Track.h:122
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
Definition: Track.h:975
Holds a msgid for the translation catalog; may also bind format arguments.
A Track that contains audio waveform data.
Definition: WaveTrack.h:222
is like wxStaticText, except it can be themed. wxStaticText can't be.
Definition: auStaticText.h:20
Default message type for Publisher.
Definition: Observer.h:26
Notification of changes in individual tracks of TrackList, or of TrackList's composition.
Definition: Track.h:928