Audacity 3.2.0
SpectrumView.h
Go to the documentation of this file.
1/**********************************************************************
2
3Audacity: A Digital Audio Editor
4
5SpectrumView.h
6
7Paul Licameli split from WaveTrackView.h
8
9**********************************************************************/
10
11#ifndef __AUDACITY_SPECTRUM_VIEW__
12#define __AUDACITY_SPECTRUM_VIEW__
13
14#include <functional>
15#include <map>
16#include <set>
17#include "WaveTrackView.h" // to inherit
18
19
20class WaveTrack;
21class BrushHandle;
22using HopsAndBinsMap = std::map<long long, std::set<int>>;
23
25private:
29 long long mStartSample;
30 long long mEndSample;
31
32public:
33 SpectralData(double sr)
34 :mSampleRate(sr)
35 ,mWindowSize( 2048 )
36 ,mHopSize ( mWindowSize / 4 )
37 // Set start and end in reverse for comparison during data addition
38 ,mStartSample(std::numeric_limits<long long>::max())
39 ,mEndSample( 0 )
40 {}
41 SpectralData(const SpectralData& src) = delete;
42
44 std::vector<HopsAndBinsMap> dataHistory;
45 // TODO: replace with two pairs to save space
46 std::vector<std::pair<int, int>> coordHistory;
47
48 // Abstracted the copy method for future extension
49 void CopyFrom(const SpectralData &src){
52
53 // std containers will perform deepcopy automatically
57 }
58
59 int GetHopSize() const {
60 return mHopSize;
61 }
62
63 int GetWindowSize() const{
64 return mWindowSize;
65 };
66
67 double GetSR() const{
68 return mSampleRate;
69 }
70
71 long long GetStartSample() const{
72 return mStartSample;
73 }
74
75 long long GetEndSample() const{
76 return mEndSample;
77 }
78
79 // The double time points is quantized into long long
80 void addHopBinData(int hopNum, int freqBin){
81 // Update the start and end sampleCount of current selection
82 if(hopNum * mHopSize > mEndSample)
83 mEndSample = hopNum * mHopSize;
84 if(hopNum * mHopSize < mStartSample)
85 mStartSample = hopNum * mHopSize;
86
87 dataBuffer[hopNum].insert(freqBin);
88 }
89
90 void removeHopBinData(int hopNum, int freqBin){
91 // TODO: Recalculate the start and end in case hop falls in 0 || end
92 for(auto &dataBuf: dataHistory){
93 if(dataBuf.find(hopNum) != dataBuf.end()){
94 dataBuf[hopNum].erase(freqBin);
95 }
96 }
97 }
98
100 // DataBuffer should be clear when the user release cursor
101 dataHistory.clear();
102 mStartSample = std::numeric_limits<long long>::max();
103 mEndSample = 0;
104 }
105
107 dataHistory.emplace_back(dataBuffer);
108 dataBuffer.clear();
109 coordHistory.clear();
110 }
111};
112
113class SpectrumView final : public WaveTrackSubView
114{
116public:
117 SpectrumView(WaveTrackView &waveTrackView, const SpectrumView &src) = delete;
118 explicit SpectrumView(WaveTrackView &waveTrackView);
119 ~SpectrumView() override;
120
121 const Type &SubViewType() const override;
122
123 std::shared_ptr<TrackVRulerControls> DoGetVRulerControls() override;
124
125 std::shared_ptr<SpectralData> GetSpectralData();
126
127 bool IsSpectral() const override;
128
129 static int mBrushRadius;
130
131 void CopyToSubView( WaveTrackSubView *destSubView ) const override;
132
133 class SpectralDataSaver;
134
135private:
136 std::weak_ptr<BrushHandle> mBrushHandle;
137 std::shared_ptr<SpectralData> mpSpectralData, mpBackupSpectralData;
139
140 // TrackPanelDrawable implementation
141 void Draw(
143 const wxRect &rect, unsigned iPass ) override;
144
145 void DoDraw( TrackPanelDrawingContext &context,
146 const WaveTrack *track,
147 const WaveClip* selectedClip,
148 const wxRect & rect );
149
150 std::vector<UIHandlePtr> DetailedHitTest(
151 const TrackPanelMouseState &state,
152 const AudacityProject *pProject, int currentTool, bool bMultiTool )
153 override;
154
155 unsigned CaptureKey
156 (wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
157 AudacityProject* project) override;
158
159 unsigned KeyDown(wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
160 AudacityProject* project) override;
161
162 unsigned Char
163 (wxKeyEvent& event, ViewInfo& viewInfo, wxWindow* pParent,
164 AudacityProject* project) override;
165
166 static void ForAll( AudacityProject &project,
167 std::function<void(SpectrumView &view)> fn );
168
169 void DoSetMinimized( bool minimized ) override;
170};
171
172#endif
std::map< long long, std::set< int > > HopsAndBinsMap
Definition: SpectrumView.h:22
static const auto fn
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
SpectralData(const SpectralData &src)=delete
long long GetStartSample() const
Definition: SpectrumView.h:71
int GetWindowSize() const
Definition: SpectrumView.h:63
long long GetEndSample() const
Definition: SpectrumView.h:75
double GetSR() const
Definition: SpectrumView.h:67
void addHopBinData(int hopNum, int freqBin)
Definition: SpectrumView.h:80
void clearAllData()
Definition: SpectrumView.h:99
void removeHopBinData(int hopNum, int freqBin)
Definition: SpectrumView.h:90
std::vector< HopsAndBinsMap > dataHistory
Definition: SpectrumView.h:44
double mSampleRate
Definition: SpectrumView.h:26
long long mEndSample
Definition: SpectrumView.h:30
int GetHopSize() const
Definition: SpectrumView.h:59
long long mStartSample
Definition: SpectrumView.h:29
void CopyFrom(const SpectralData &src)
Definition: SpectrumView.h:49
SpectralData(double sr)
Definition: SpectrumView.h:33
void saveAndClearBuffer()
Definition: SpectrumView.h:106
std::vector< std::pair< int, int > > coordHistory
Definition: SpectrumView.h:46
HopsAndBinsMap dataBuffer
Definition: SpectrumView.h:43
~SpectrumView() override
static void ForAll(AudacityProject &project, std::function< void(SpectrumView &view)> fn)
void DoSetMinimized(bool minimized) override
unsigned CaptureKey(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
void DoDraw(TrackPanelDrawingContext &context, const WaveTrack *track, const WaveClip *selectedClip, const wxRect &rect)
bool IsSpectral() const override
std::shared_ptr< TrackVRulerControls > DoGetVRulerControls() override
static int mBrushRadius
Definition: SpectrumView.h:129
std::shared_ptr< SpectralData > mpSpectralData
Definition: SpectrumView.h:137
std::weak_ptr< BrushHandle > mBrushHandle
Definition: SpectrumView.h:133
unsigned KeyDown(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
SpectrumView & operator=(const SpectrumView &)=delete
std::shared_ptr< SpectralData > mpBackupSpectralData
Definition: SpectrumView.h:137
const Type & SubViewType() const override
unsigned Char(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
std::shared_ptr< SpectralData > GetSpectralData()
void CopyToSubView(WaveTrackSubView *destSubView) const override
std::vector< UIHandlePtr > DetailedHitTest(const TrackPanelMouseState &state, const AudacityProject *pProject, int currentTool, bool bMultiTool) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
SpectrumView(WaveTrackView &waveTrackView, const SpectrumView &src)=delete
This allows multiple clips to be a part of one WaveTrack.
Definition: WaveClip.h:101
A Track that contains audio waveform data.
Definition: WaveTrack.h:51
STL namespace.