Split EnvelopeEditor.cpp from Envelope.cpp...

... Envelope drops down out of the big strongly connected component, the new
piece stays behind
This commit is contained in:
Paul Licameli 2019-06-09 07:46:42 -04:00
parent 1dce507aaf
commit 7ed99c6e8f
14 changed files with 592 additions and 519 deletions

View File

@ -82,6 +82,8 @@ src/Dither.cpp
src/Dither.h src/Dither.h
src/Envelope.cpp src/Envelope.cpp
src/Envelope.h src/Envelope.h
src/EnvelopeEditor.cpp
src/EnvelopeEditor.h
src/Experimental.h src/Experimental.h
src/FFT.cpp src/FFT.cpp
src/FFT.h src/FFT.h

View File

@ -1229,6 +1229,7 @@
5E15126F1DB0010C00702E29 /* TrackUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126A1DB0010C00702E29 /* TrackUI.cpp */; }; 5E15126F1DB0010C00702E29 /* TrackUI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126A1DB0010C00702E29 /* TrackUI.cpp */; };
5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */; }; 5E1512701DB0010C00702E29 /* TrackVRulerControls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */; };
5E16FF4D1FF9CE0B0085E1B8 /* LanguageNames.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */; }; 5E16FF4D1FF9CE0B0085E1B8 /* LanguageNames.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */; };
5E17EF712298372D00B47301 /* EnvelopeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E17EF6F2298372D00B47301 /* EnvelopeEditor.cpp */; };
5E18CFF02291C31000E75250 /* ProjectFileIORegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E18CFEE2291C31000E75250 /* ProjectFileIORegistry.cpp */; }; 5E18CFF02291C31000E75250 /* ProjectFileIORegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E18CFEE2291C31000E75250 /* ProjectFileIORegistry.cpp */; };
5E18CFF322931D3D00E75250 /* AudacityMessageBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E18CFF222931D3D00E75250 /* AudacityMessageBox.cpp */; }; 5E18CFF322931D3D00E75250 /* AudacityMessageBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E18CFF222931D3D00E75250 /* AudacityMessageBox.cpp */; };
5E19D655217D51190024D0B1 /* PluginMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E19D64C217D51190024D0B1 /* PluginMenus.cpp */; }; 5E19D655217D51190024D0B1 /* PluginMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E19D64C217D51190024D0B1 /* PluginMenus.cpp */; };
@ -3213,6 +3214,8 @@
5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackVRulerControls.cpp; sourceTree = "<group>"; }; 5E15126B1DB0010C00702E29 /* TrackVRulerControls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackVRulerControls.cpp; sourceTree = "<group>"; };
5E15126C1DB0010C00702E29 /* TrackVRulerControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackVRulerControls.h; sourceTree = "<group>"; }; 5E15126C1DB0010C00702E29 /* TrackVRulerControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackVRulerControls.h; sourceTree = "<group>"; };
5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LanguageNames.txt; path = ../locale/LanguageNames.txt; sourceTree = "<group>"; }; 5E16FF4C1FF9CE0B0085E1B8 /* LanguageNames.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LanguageNames.txt; path = ../locale/LanguageNames.txt; sourceTree = "<group>"; };
5E17EF6F2298372D00B47301 /* EnvelopeEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnvelopeEditor.cpp; sourceTree = "<group>"; };
5E17EF702298372D00B47301 /* EnvelopeEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnvelopeEditor.h; sourceTree = "<group>"; };
5E18CFEE2291C31000E75250 /* ProjectFileIORegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProjectFileIORegistry.cpp; sourceTree = "<group>"; }; 5E18CFEE2291C31000E75250 /* ProjectFileIORegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProjectFileIORegistry.cpp; sourceTree = "<group>"; };
5E18CFEF2291C31000E75250 /* ProjectFileIORegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectFileIORegistry.h; sourceTree = "<group>"; }; 5E18CFEF2291C31000E75250 /* ProjectFileIORegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectFileIORegistry.h; sourceTree = "<group>"; };
5E18CFF122931CA900E75250 /* AudacityMessageBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityMessageBox.h; sourceTree = "<group>"; }; 5E18CFF122931CA900E75250 /* AudacityMessageBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudacityMessageBox.h; sourceTree = "<group>"; };
@ -4346,6 +4349,7 @@
1790AFF709883BFD008A330A /* DirManager.cpp */, 1790AFF709883BFD008A330A /* DirManager.cpp */,
1790AFF909883BFD008A330A /* Dither.cpp */, 1790AFF909883BFD008A330A /* Dither.cpp */,
1790B05F09883BFD008A330A /* Envelope.cpp */, 1790B05F09883BFD008A330A /* Envelope.cpp */,
5E17EF6F2298372D00B47301 /* EnvelopeEditor.cpp */,
283135FD0DFBA2E80076D551 /* FFmpeg.cpp */, 283135FD0DFBA2E80076D551 /* FFmpeg.cpp */,
1790B07009883BFD008A330A /* FFT.cpp */, 1790B07009883BFD008A330A /* FFT.cpp */,
5E07842C1DEE6B8600CA76EA /* FileException.cpp */, 5E07842C1DEE6B8600CA76EA /* FileException.cpp */,
@ -4463,6 +4467,7 @@
1790AFF809883BFD008A330A /* DirManager.h */, 1790AFF809883BFD008A330A /* DirManager.h */,
1790AFFA09883BFD008A330A /* Dither.h */, 1790AFFA09883BFD008A330A /* Dither.h */,
1790B06009883BFD008A330A /* Envelope.h */, 1790B06009883BFD008A330A /* Envelope.h */,
5E17EF702298372D00B47301 /* EnvelopeEditor.h */,
1790B06109883BFD008A330A /* Experimental.h */, 1790B06109883BFD008A330A /* Experimental.h */,
283135FE0DFBA2E80076D551 /* FFmpeg.h */, 283135FE0DFBA2E80076D551 /* FFmpeg.h */,
1790B07109883BFD008A330A /* FFT.h */, 1790B07109883BFD008A330A /* FFT.h */,
@ -8465,6 +8470,7 @@
28EBA8010A78FAF800C8BB1F /* InterpolateAudio.cpp in Sources */, 28EBA8010A78FAF800C8BB1F /* InterpolateAudio.cpp in Sources */,
28EBA8020A78FAF800C8BB1F /* Matrix.cpp in Sources */, 28EBA8020A78FAF800C8BB1F /* Matrix.cpp in Sources */,
5EF5706B22AAAEDA00C4702C /* ProjectFileManager.cpp in Sources */, 5EF5706B22AAAEDA00C4702C /* ProjectFileManager.cpp in Sources */,
5E17EF712298372D00B47301 /* EnvelopeEditor.cpp in Sources */,
28E3E6E80A7C14CA00AB1361 /* ExportFLAC.cpp in Sources */, 28E3E6E80A7C14CA00AB1361 /* ExportFLAC.cpp in Sources */,
2897F6F00AB3DB5A003C20C5 /* ControlToolBar.cpp in Sources */, 2897F6F00AB3DB5A003C20C5 /* ControlToolBar.cpp in Sources */,
2897F6F10AB3DB5A003C20C5 /* EditToolBar.cpp in Sources */, 2897F6F10AB3DB5A003C20C5 /* EditToolBar.cpp in Sources */,

View File

@ -11,12 +11,13 @@
*******************************************************************//** *******************************************************************//**
\class Envelope \class Envelope
\brief Draggable curve used in TrackPanel for varying amplification. \brief Piecewise linear or piecewise exponential function from double to double
This class manages an envelope - i.e. a piecewise linear funtion This class manages an envelope - i.e. a function
that the user can edit by dragging control points around. The that the user can edit by dragging control points around. The
envelope is most commonly used to control the amplitude of a envelope is most commonly used to control the amplitude of a
waveform, but it is also used to shape the Equalization curve. waveform, but it is also used to shape the Equalization curve, and in
TimeTrack to determine a time warp.
*//****************************************************************//** *//****************************************************************//**
@ -30,21 +31,14 @@ a draggable point type.
#include "Experimental.h" #include "Experimental.h"
#include "ViewInfo.h"
#include <math.h> #include <math.h>
#include <wx/wxcrtvararg.h> #include <wx/wxcrtvararg.h>
#include <wx/dc.h>
#include <wx/brush.h> #include <wx/brush.h>
#include <wx/event.h>
#include <wx/pen.h> #include <wx/pen.h>
#include <wx/textfile.h> #include <wx/textfile.h>
#include <wx/log.h> #include <wx/log.h>
#include "AColor.h"
#include "TrackArtist.h"
static const double VALUE_TOLERANCE = 0.001; static const double VALUE_TOLERANCE = 0.001;
Envelope::Envelope(bool exponential, double minValue, double maxValue, double defaultValue) Envelope::Envelope(bool exponential, double minValue, double maxValue, double defaultValue)
@ -307,91 +301,6 @@ static double Limit( double Lo, double Value, double Hi )
} }
#endif #endif
/// TODO: This should probably move to track artist.
static void DrawPoint(wxDC & dc, const wxRect & r, int x, int y, bool top)
{
if (y >= 0 && y <= r.height) {
wxRect circle(r.x + x, r.y + (top ? y - 1: y - 2), 4, 4);
dc.DrawEllipse(circle);
}
}
#include "TrackPanelDrawingContext.h"
/// TODO: This should probably move to track artist.
void Envelope::DrawPoints
(TrackPanelDrawingContext &context, const wxRect & r,
bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored) const
{
auto &dc = context.dc;
const auto artist = TrackArtist::Get( context );
const auto &zoomInfo = *artist->pZoomInfo;
bool highlight = false;
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
auto target = dynamic_cast<EnvelopeHandle*>(context.target.get());
highlight = target && target->GetEnvelope() == this;
#endif
wxPen &pen = highlight ? AColor::uglyPen : AColor::envelopePen;
dc.SetPen( pen );
dc.SetBrush(*wxWHITE_BRUSH);
for (int i = 0; i < (int)mEnv.size(); i++) {
const double time = mEnv[i].GetT() + mOffset;
const wxInt64 position = zoomInfo.TimeToPosition(time);
if (position >= 0 && position < r.width) {
// Change colour if this is the draggable point...
if (i == mDragPoint) {
dc.SetPen( pen );
dc.SetBrush(AColor::envelopeBrush);
}
double v = mEnv[i].GetVal();
int x = (int)(position);
int y, y2;
y = GetWaveYPos(v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false);
if (!mirrored) {
DrawPoint(dc, r, x, y, true);
}
else {
y2 = GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
true, dBRange, false);
// This follows the same logic as the envelop drawing in
// TrackArt::DrawEnvelope().
// TODO: make this calculation into a reusable function.
if (y2 - y < 9) {
int value = (int)((zoomMax / (zoomMax - zoomMin)) * r.height);
y = value - 4;
y2 = value + 4;
}
DrawPoint(dc, r, x, y, true);
DrawPoint(dc, r, x, y2, false);
// Contour
y = GetWaveYPos(v, zoomMin, zoomMax, r.height, dB,
false, dBRange, false);
y2 = GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
false, dBRange, false);
if (y <= y2) {
DrawPoint(dc, r, x, y, true);
DrawPoint(dc, r, x, y2, false);
}
}
// Change colour back again if was the draggable point.
if (i == mDragPoint) {
dc.SetPen( pen );
dc.SetBrush(*wxWHITE_BRUSH);
}
}
}
}
bool Envelope::HandleXMLTag(const wxChar *tag, const wxChar **attrs) bool Envelope::HandleXMLTag(const wxChar *tag, const wxChar **attrs)
{ {
// Return unless it's the envelope tag. // Return unless it's the envelope tag.
@ -447,208 +356,6 @@ void Envelope::WriteXML(XMLWriter &xmlFile) const
xmlFile.EndTag(wxT("envelope")); xmlFile.EndTag(wxT("envelope"));
} }
namespace
{
inline int SQR(int x) { return x * x; }
}
/// ValueOfPixel() converts a y position on screen to an envelope value.
/// @param y - y position, usually of the mouse.relative to the clip.
/// @param height - height of the rectangle we are in.
/// @upper - true if we are on the upper line, false if on lower.
/// @dB - display mode either linear or log.
/// @zoomMin - vertical scale, typically -1.0
/// @zoomMax - vertical scale, typically +1.0
float EnvelopeEditor::ValueOfPixel( int y, int height, bool upper,
bool dB, double dBRange,
float zoomMin, float zoomMax)
{
float v = ::ValueOfPixel(y, height, 0 != mContourOffset, dB, dBRange, zoomMin, zoomMax);
// MB: this is mostly equivalent to what the old code did, I'm not sure
// if anything special is needed for asymmetric ranges
if(upper)
return mEnvelope.ClampValue(v);
else
return mEnvelope.ClampValue(-v);
}
/// HandleMouseButtonDown either finds an existing control point or adds a NEW one
/// which is then recorded as the point to drag.
/// This is slightly complicated by there possibly being four control points for
/// a given time value:
/// We have an upper and lower envelope line.
/// Also we may be showing an inner envelope (at 0.5 the range).
bool EnvelopeEditor::HandleMouseButtonDown(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo,
bool dB, double dBRange,
float zoomMin, float zoomMax)
{
int ctr = (int)(r.height * zoomMax / (zoomMax - zoomMin));
bool upper = !mMirrored || (zoomMin >= 0.0) || (event.m_y - r.y < ctr);
int clip_y = event.m_y - r.y;
if(clip_y < 0) clip_y = 0; //keeps point in rect r, even if mouse isn't
if(clip_y > r.GetBottom()) clip_y = r.GetBottom();
int bestNum = -1;
int bestDistSqr = 100; // Must be within 10 pixel radius.
// Member variables hold state that will be needed in dragging.
mButton = event.GetButton();
mContourOffset = false;
// wxLogDebug(wxT("Y:%i Height:%i Offset:%i"), y, height, mContourOffset );
int len = mEnvelope.GetNumberOfPoints();
// TODO: extract this into a function FindNearestControlPoint()
// TODO: also fix it so that we can drag the last point on an envelope.
for (int i = 0; i < len; i++) { //search for control point nearest click
const double time = mEnvelope[i].GetT() + mEnvelope.GetOffset();
const wxInt64 position = zoomInfo.TimeToPosition(time);
if (position >= 0 && position < r.width) {
int x = (int)(position);
int y[4];
int numControlPoints;
// Outer control points
double value = mEnvelope[i].GetVal();
y[0] = GetWaveYPos(value, zoomMin, zoomMax, r.height,
dB, true, dBRange, false);
y[1] = GetWaveYPos(-value, zoomMin, zoomMax, r.height,
dB, true, dBRange, false);
// Inner control points(contour)
y[2] = GetWaveYPos(value, zoomMin, zoomMax, r.height,
dB, false, dBRange, false);
y[3] = GetWaveYPos(-value -.00000001, zoomMin, zoomMax,
r.height, dB, false, dBRange, false);
numControlPoints = 4;
if (y[2] > y[3])
numControlPoints = 2;
if (!mMirrored)
numControlPoints = 1;
const int deltaXSquared = SQR(x - (event.m_x - r.x));
for(int j=0; j<numControlPoints; j++){
const int dSqr = deltaXSquared + SQR(y[j] - (event.m_y - r.y));
if (dSqr < bestDistSqr) {
bestNum = i;
bestDistSqr = dSqr;
mContourOffset = (bool)(j > 1);
}
}
}
}
if (bestNum >= 0) {
mEnvelope.SetDragPoint(bestNum);
}
else {
// TODO: Extract this into a function CreateNewPoint
const double when = zoomInfo.PositionToTime(event.m_x, r.x);
// if (when <= 0 || when >= mTrackLen)
// return false;
const double v = mEnvelope.GetValue( when );
int ct = GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
false, dBRange, false) ;
int cb = GetWaveYPos( -v-.000000001, zoomMin, zoomMax, r.height, dB,
false, dBRange, false) ;
if (ct <= cb || !mMirrored) {
int t = GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false) ;
int b = GetWaveYPos( -v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false) ;
ct = (t + ct) / 2;
cb = (b + cb) / 2;
if (mMirrored &&
(event.m_y - r.y) > ct &&
((event.m_y - r.y) < cb))
mContourOffset = true;
else
mContourOffset = false;
}
double newVal = ValueOfPixel(clip_y, r.height, upper, dB, dBRange,
zoomMin, zoomMax);
mEnvelope.SetDragPoint(mEnvelope.InsertOrReplace(when, newVal));
mDirty = true;
}
mUpper = upper;
// const int dragPoint = mEnvelope.GetDragPoint();
// mInitialVal = mEnvelope[dragPoint].GetVal();
// mInitialY = event.m_y+mContourOffset;
return true;
}
void EnvelopeEditor::MoveDragPoint(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax)
{
int clip_y = event.m_y - r.y;
if(clip_y < 0) clip_y = 0;
if(clip_y > r.height) clip_y = r.height;
double newVal = ValueOfPixel(clip_y, r.height, mUpper, dB, dBRange,
zoomMin, zoomMax);
// We no longer tolerate multiple envelope points at the same t.
// epsilon is less than the time offset of a single sample
// TODO: However because mTrackEpsilon assumes 200KHz this use
// of epsilon is a tad bogus. What we need to do instead is DELETE
// a duplicated point on a mouse up.
double newWhen = zoomInfo.PositionToTime(event.m_x, r.x) - mEnvelope.GetOffset();
mEnvelope.MoveDragPoint(newWhen, newVal);
}
bool EnvelopeEditor::HandleDragging(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax,
float WXUNUSED(eMin), float WXUNUSED(eMax))
{
mDirty = true;
wxRect larger = r;
larger.Inflate(10, 10);
if (larger.Contains(event.m_x, event.m_y))
{
// IF we're in the rect THEN we're not deleting this point (anymore).
// ...we're dragging it.
MoveDragPoint( event, r, zoomInfo, dB, dBRange, zoomMin, zoomMax);
return true;
}
if(!mEnvelope.GetDragPointValid())
// IF we already know we're deleting THEN no envelope point to update.
return false;
// Invalidate the point
mEnvelope.SetDragPointValid(false);
return true;
}
// Exit dragging mode and delete dragged point if neccessary.
bool EnvelopeEditor::HandleMouseButtonUp()
{
mEnvelope.ClearDragPoint();
mButton = wxMOUSE_BTN_NONE;
return true;
}
void Envelope::Delete( int point ) void Envelope::Delete( int point )
{ {
mEnv.erase(mEnv.begin() + point); mEnv.erase(mEnv.begin() + point);
@ -659,22 +366,6 @@ void Envelope::Insert(int point, const EnvPoint &p)
mEnv.insert(mEnv.begin() + point, p); mEnv.insert(mEnv.begin() + point, p);
} }
// Returns true if parent needs to be redrawn
bool EnvelopeEditor::MouseEvent(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax)
{
if (event.ButtonDown() && mButton == wxMOUSE_BTN_NONE)
return HandleMouseButtonDown( event, r, zoomInfo, dB, dBRange,
zoomMin, zoomMax);
if (event.Dragging() && mEnvelope.GetDragPoint() >= 0)
return HandleDragging( event, r, zoomInfo, dB, dBRange,
zoomMin, zoomMax);
if (event.ButtonUp() && event.GetButton() == mButton)
return HandleMouseButtonUp();
return false;
}
void Envelope::CollapseRegion( double t0, double t1, double sampleDur ) void Envelope::CollapseRegion( double t0, double t1, double sampleDur )
// NOFAIL-GUARANTEE // NOFAIL-GUARANTEE
{ {
@ -1346,48 +1037,6 @@ void Envelope::GetValuesRelative
} }
} }
void Envelope::GetValues
( double alignedTime, double sampleDur,
double *buffer, int bufferLen, int leftOffset,
const ZoomInfo &zoomInfo )
const
{
// Getting many envelope values, corresponding to pixel columns, which may
// not be uniformly spaced in time when there is a fisheye.
double prevDiscreteTime=0.0, prevSampleVal=0.0, nextSampleVal=0.0;
for ( int xx = 0; xx < bufferLen; ++xx ) {
auto time = zoomInfo.PositionToTime( xx, -leftOffset );
if ( sampleDur <= 0 )
// Sample interval not defined (as for time track)
buffer[xx] = GetValue( time );
else {
// The level of zoom-in may resolve individual samples.
// If so, then instead of evaluating the envelope directly,
// we draw a piecewise curve with knees at each sample time.
// This actually makes clearer what happens as you drag envelope
// points and make discontinuities.
auto leftDiscreteTime = alignedTime +
sampleDur * floor( ( time - alignedTime ) / sampleDur );
if ( xx == 0 || leftDiscreteTime != prevDiscreteTime ) {
prevDiscreteTime = leftDiscreteTime;
prevSampleVal =
GetValue( prevDiscreteTime, sampleDur );
nextSampleVal =
GetValue( prevDiscreteTime + sampleDur, sampleDur );
}
auto ratio = ( time - leftDiscreteTime ) / sampleDur;
if ( GetExponential() )
buffer[ xx ] = exp(
( 1.0 - ratio ) * log( prevSampleVal )
+ ratio * log( nextSampleVal ) );
else
buffer[ xx ] =
( 1.0 - ratio ) * prevSampleVal + ratio * nextSampleVal;
}
}
}
// relative time // relative time
int Envelope::NumberOfPointsAfter(double t) const int Envelope::NumberOfPointsAfter(double t) const
{ {
@ -1806,19 +1455,3 @@ void Envelope::testMe()
checkResult( 18, NextPointAfter( 0 ), 5 ); checkResult( 18, NextPointAfter( 0 ), 5 );
checkResult( 19, NextPointAfter( 5 ), 10 ); checkResult( 19, NextPointAfter( 5 ), 10 );
} }
EnvelopeEditor::EnvelopeEditor(Envelope &envelope, bool mirrored)
: mEnvelope(envelope)
, mMirrored(mirrored)
, mContourOffset(-1)
// , mInitialVal(-1.0)
// , mInitialY(-1)
, mUpper(false)
, mButton(wxMOUSE_BTN_NONE)
, mDirty(false)
{
}
EnvelopeEditor::~EnvelopeEditor()
{
}

View File

@ -112,12 +112,6 @@ public:
XMLTagHandler *HandleXMLChild(const wxChar *tag) override; XMLTagHandler *HandleXMLChild(const wxChar *tag) override;
void WriteXML(XMLWriter &xmlFile) const /* not override */; void WriteXML(XMLWriter &xmlFile) const /* not override */;
void DrawPoints(
TrackPanelDrawingContext &context,
const wxRect & r,
bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored) const;
// Handling Cut/Copy/Paste events // Handling Cut/Copy/Paste events
// sampleDur determines when the endpoint of the collapse is near enough // sampleDur determines when the endpoint of the collapse is near enough
// to an endpoint of the domain, that an extra control point is not needed. // to an endpoint of the domain, that an extra control point is not needed.
@ -148,14 +142,6 @@ public:
* more than one value in a row. */ * more than one value in a row. */
void GetValues(double *buffer, int len, double t0, double tstep) const; void GetValues(double *buffer, int len, double t0, double tstep) const;
/** \brief Get many envelope points for pixel columns at once,
* but don't assume uniform time per pixel.
*/
void GetValues
( double aligned_time, double sampleDur,
double *buffer, int bufferLen, int leftOffset,
const ZoomInfo &zoomInfo) const;
// Guarantee an envelope point at the end of the domain. // Guarantee an envelope point at the end of the domain.
void Cap( double sampleDur ); void Cap( double sampleDur );
@ -279,49 +265,4 @@ inline void EnvPoint::SetVal( Envelope *pEnvelope, double val )
mVal = val; mVal = val;
} }
// A class that holds state for the duration of dragging
// of an envelope point.
class EnvelopeEditor
{
public:
EnvelopeEditor(Envelope &envelope, bool mirrored);
~EnvelopeEditor();
// Event Handlers
// Each of these returns true if the envelope needs to be redrawn
bool MouseEvent(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0);
private:
bool HandleMouseButtonDown(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0);
bool HandleDragging(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0, float eMin = 0., float eMax = 2.);
bool HandleMouseButtonUp();
private:
float ValueOfPixel(int y, int height, bool upper,
bool dB, double dBRange,
float zoomMin, float zoomMax);
void MoveDragPoint(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax);
Envelope &mEnvelope;
const bool mMirrored;
/** \brief Number of pixels contour is from the true envelope. */
int mContourOffset;
// double mInitialVal;
// int mInitialY;
bool mUpper;
int mButton;
bool mDirty;
};
#endif #endif

380
src/EnvelopeEditor.cpp Normal file
View File

@ -0,0 +1,380 @@
/**********************************************************************
Audacity: A Digital Audio Editor
EnvelopeEditor.cpp
Paul Licameli split this from Envelope.cpp
**********************************************************************/
#include "EnvelopeEditor.h"
#include <wx/dc.h>
#include <wx/event.h>
#include "AColor.h"
#include "Envelope.h"
#include "TrackArtist.h"
#include "TrackPanelDrawingContext.h"
#include "ViewInfo.h"
namespace {
void DrawPoint(wxDC & dc, const wxRect & r, int x, int y, bool top)
{
if (y >= 0 && y <= r.height) {
wxRect circle(r.x + x, r.y + (top ? y - 1: y - 2), 4, 4);
dc.DrawEllipse(circle);
}
}
}
void EnvelopeEditor::DrawPoints
(const Envelope &env,
TrackPanelDrawingContext &context, const wxRect & r,
bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored)
{
auto &dc = context.dc;
const auto artist = TrackArtist::Get( context );
const auto &zoomInfo = *artist->pZoomInfo;
bool highlight = false;
#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
auto target = dynamic_cast<EnvelopeHandle*>(context.target.get());
highlight = target && target->GetEnvelope() == this;
#endif
wxPen &pen = highlight ? AColor::uglyPen : AColor::envelopePen;
dc.SetPen( pen );
dc.SetBrush(*wxWHITE_BRUSH);
for (int i = 0; i < (int)env.GetNumberOfPoints(); i++) {
const double time = env[i].GetT() + env.GetOffset();
const wxInt64 position = zoomInfo.TimeToPosition(time);
if (position >= 0 && position < r.width) {
// Change colour if this is the draggable point...
if (i == env.GetDragPoint()) {
dc.SetPen( pen );
dc.SetBrush(AColor::envelopeBrush);
}
double v = env[i].GetVal();
int x = (int)(position);
int y, y2;
y = GetWaveYPos(v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false);
if (!mirrored) {
DrawPoint(dc, r, x, y, true);
}
else {
y2 = GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
true, dBRange, false);
// This follows the same logic as the envelop drawing in
// TrackArt::DrawEnvelope().
// TODO: make this calculation into a reusable function.
if (y2 - y < 9) {
int value = (int)((zoomMax / (zoomMax - zoomMin)) * r.height);
y = value - 4;
y2 = value + 4;
}
DrawPoint(dc, r, x, y, true);
DrawPoint(dc, r, x, y2, false);
// Contour
y = GetWaveYPos(v, zoomMin, zoomMax, r.height, dB,
false, dBRange, false);
y2 = GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
false, dBRange, false);
if (y <= y2) {
DrawPoint(dc, r, x, y, true);
DrawPoint(dc, r, x, y2, false);
}
}
// Change colour back again if was the draggable point.
if (i == env.GetDragPoint()) {
dc.SetPen( pen );
dc.SetBrush(*wxWHITE_BRUSH);
}
}
}
}
void EnvelopeEditor::GetValues
( const Envelope &env,
double alignedTime, double sampleDur,
double *buffer, int bufferLen, int leftOffset,
const ZoomInfo &zoomInfo )
{
// Getting many envelope values, corresponding to pixel columns, which may
// not be uniformly spaced in time when there is a fisheye.
double prevDiscreteTime=0.0, prevSampleVal=0.0, nextSampleVal=0.0;
for ( int xx = 0; xx < bufferLen; ++xx ) {
auto time = zoomInfo.PositionToTime( xx, -leftOffset );
if ( sampleDur <= 0 )
// Sample interval not defined (as for time track)
buffer[xx] = env.GetValue( time );
else {
// The level of zoom-in may resolve individual samples.
// If so, then instead of evaluating the envelope directly,
// we draw a piecewise curve with knees at each sample time.
// This actually makes clearer what happens as you drag envelope
// points and make discontinuities.
auto leftDiscreteTime = alignedTime +
sampleDur * floor( ( time - alignedTime ) / sampleDur );
if ( xx == 0 || leftDiscreteTime != prevDiscreteTime ) {
prevDiscreteTime = leftDiscreteTime;
prevSampleVal =
env.GetValue( prevDiscreteTime, sampleDur );
nextSampleVal =
env.GetValue( prevDiscreteTime + sampleDur, sampleDur );
}
auto ratio = ( time - leftDiscreteTime ) / sampleDur;
if ( env.GetExponential() )
buffer[ xx ] = exp(
( 1.0 - ratio ) * log( prevSampleVal )
+ ratio * log( nextSampleVal ) );
else
buffer[ xx ] =
( 1.0 - ratio ) * prevSampleVal + ratio * nextSampleVal;
}
}
}
EnvelopeEditor::EnvelopeEditor(Envelope &envelope, bool mirrored)
: mEnvelope(envelope)
, mMirrored(mirrored)
, mContourOffset(-1)
// , mInitialVal(-1.0)
// , mInitialY(-1)
, mUpper(false)
, mButton(wxMOUSE_BTN_NONE)
, mDirty(false)
{
}
EnvelopeEditor::~EnvelopeEditor()
{
}
namespace
{
inline int SQR(int x) { return x * x; }
}
/// ValueOfPixel() converts a y position on screen to an envelope value.
/// @param y - y position, usually of the mouse.relative to the clip.
/// @param height - height of the rectangle we are in.
/// @upper - true if we are on the upper line, false if on lower.
/// @dB - display mode either linear or log.
/// @zoomMin - vertical scale, typically -1.0
/// @zoomMax - vertical scale, typically +1.0
float EnvelopeEditor::ValueOfPixel( int y, int height, bool upper,
bool dB, double dBRange,
float zoomMin, float zoomMax)
{
float v = ::ValueOfPixel(y, height, 0 != mContourOffset, dB, dBRange, zoomMin, zoomMax);
// MB: this is mostly equivalent to what the old code did, I'm not sure
// if anything special is needed for asymmetric ranges
if(upper)
return mEnvelope.ClampValue(v);
else
return mEnvelope.ClampValue(-v);
}
/// HandleMouseButtonDown either finds an existing control point or adds a NEW one
/// which is then recorded as the point to drag.
/// This is slightly complicated by there possibly being four control points for
/// a given time value:
/// We have an upper and lower envelope line.
/// Also we may be showing an inner envelope (at 0.5 the range).
bool EnvelopeEditor::HandleMouseButtonDown(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo,
bool dB, double dBRange,
float zoomMin, float zoomMax)
{
int ctr = (int)(r.height * zoomMax / (zoomMax - zoomMin));
bool upper = !mMirrored || (zoomMin >= 0.0) || (event.m_y - r.y < ctr);
int clip_y = event.m_y - r.y;
if(clip_y < 0) clip_y = 0; //keeps point in rect r, even if mouse isn't
if(clip_y > r.GetBottom()) clip_y = r.GetBottom();
int bestNum = -1;
int bestDistSqr = 100; // Must be within 10 pixel radius.
// Member variables hold state that will be needed in dragging.
mButton = event.GetButton();
mContourOffset = false;
// wxLogDebug(wxT("Y:%i Height:%i Offset:%i"), y, height, mContourOffset );
int len = mEnvelope.GetNumberOfPoints();
// TODO: extract this into a function FindNearestControlPoint()
// TODO: also fix it so that we can drag the last point on an envelope.
for (int i = 0; i < len; i++) { //search for control point nearest click
const double time = mEnvelope[i].GetT() + mEnvelope.GetOffset();
const wxInt64 position = zoomInfo.TimeToPosition(time);
if (position >= 0 && position < r.width) {
int x = (int)(position);
int y[4];
int numControlPoints;
// Outer control points
double value = mEnvelope[i].GetVal();
y[0] = GetWaveYPos(value, zoomMin, zoomMax, r.height,
dB, true, dBRange, false);
y[1] = GetWaveYPos(-value, zoomMin, zoomMax, r.height,
dB, true, dBRange, false);
// Inner control points(contour)
y[2] = GetWaveYPos(value, zoomMin, zoomMax, r.height,
dB, false, dBRange, false);
y[3] = GetWaveYPos(-value -.00000001, zoomMin, zoomMax,
r.height, dB, false, dBRange, false);
numControlPoints = 4;
if (y[2] > y[3])
numControlPoints = 2;
if (!mMirrored)
numControlPoints = 1;
const int deltaXSquared = SQR(x - (event.m_x - r.x));
for(int j=0; j<numControlPoints; j++){
const int dSqr = deltaXSquared + SQR(y[j] - (event.m_y - r.y));
if (dSqr < bestDistSqr) {
bestNum = i;
bestDistSqr = dSqr;
mContourOffset = (bool)(j > 1);
}
}
}
}
if (bestNum >= 0) {
mEnvelope.SetDragPoint(bestNum);
}
else {
// TODO: Extract this into a function CreateNewPoint
const double when = zoomInfo.PositionToTime(event.m_x, r.x);
// if (when <= 0 || when >= mTrackLen)
// return false;
const double v = mEnvelope.GetValue( when );
int ct = GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
false, dBRange, false) ;
int cb = GetWaveYPos( -v-.000000001, zoomMin, zoomMax, r.height, dB,
false, dBRange, false) ;
if (ct <= cb || !mMirrored) {
int t = GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false) ;
int b = GetWaveYPos( -v, zoomMin, zoomMax, r.height, dB,
true, dBRange, false) ;
ct = (t + ct) / 2;
cb = (b + cb) / 2;
if (mMirrored &&
(event.m_y - r.y) > ct &&
((event.m_y - r.y) < cb))
mContourOffset = true;
else
mContourOffset = false;
}
double newVal = ValueOfPixel(clip_y, r.height, upper, dB, dBRange,
zoomMin, zoomMax);
mEnvelope.SetDragPoint(mEnvelope.InsertOrReplace(when, newVal));
mDirty = true;
}
mUpper = upper;
// const int dragPoint = mEnvelope.GetDragPoint();
// mInitialVal = mEnvelope[dragPoint].GetVal();
// mInitialY = event.m_y+mContourOffset;
return true;
}
void EnvelopeEditor::MoveDragPoint(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax)
{
int clip_y = event.m_y - r.y;
if(clip_y < 0) clip_y = 0;
if(clip_y > r.height) clip_y = r.height;
double newVal = ValueOfPixel(clip_y, r.height, mUpper, dB, dBRange,
zoomMin, zoomMax);
// We no longer tolerate multiple envelope points at the same t.
// epsilon is less than the time offset of a single sample
// TODO: However because mTrackEpsilon assumes 200KHz this use
// of epsilon is a tad bogus. What we need to do instead is DELETE
// a duplicated point on a mouse up.
double newWhen = zoomInfo.PositionToTime(event.m_x, r.x) - mEnvelope.GetOffset();
mEnvelope.MoveDragPoint(newWhen, newVal);
}
bool EnvelopeEditor::HandleDragging(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax,
float WXUNUSED(eMin), float WXUNUSED(eMax))
{
mDirty = true;
wxRect larger = r;
larger.Inflate(10, 10);
if (larger.Contains(event.m_x, event.m_y))
{
// IF we're in the rect THEN we're not deleting this point (anymore).
// ...we're dragging it.
MoveDragPoint( event, r, zoomInfo, dB, dBRange, zoomMin, zoomMax);
return true;
}
if(!mEnvelope.GetDragPointValid())
// IF we already know we're deleting THEN no envelope point to update.
return false;
// Invalidate the point
mEnvelope.SetDragPointValid(false);
return true;
}
// Exit dragging mode and delete dragged point if neccessary.
bool EnvelopeEditor::HandleMouseButtonUp()
{
mEnvelope.ClearDragPoint();
mButton = wxMOUSE_BTN_NONE;
return true;
}
// Returns true if parent needs to be redrawn
bool EnvelopeEditor::MouseEvent(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax)
{
if (event.ButtonDown() && mButton == wxMOUSE_BTN_NONE)
return HandleMouseButtonDown( event, r, zoomInfo, dB, dBRange,
zoomMin, zoomMax);
if (event.Dragging() && mEnvelope.GetDragPoint() >= 0)
return HandleDragging( event, r, zoomInfo, dB, dBRange,
zoomMin, zoomMax);
if (event.ButtonUp() && event.GetButton() == mButton)
return HandleMouseButtonUp();
return false;
}

82
src/EnvelopeEditor.h Normal file
View File

@ -0,0 +1,82 @@
/**********************************************************************
Audacity: A Digital Audio Editor
EnvelopeEditor.h
Paul Licameli split this from Envelope.h
**********************************************************************/
#ifndef __AUDACITY_ENVELOPE_EDITOR__
#define __AUDACITY_ENVELOPE_EDITOR__
class wxMouseEvent;
class wxRect;
class Envelope;
class TrackPanelDrawingContext;
class ZoomInfo;
// A class that holds state for the duration of dragging
// of an envelope point.
class EnvelopeEditor
{
public:
static void DrawPoints(
const Envelope &env,
TrackPanelDrawingContext &context,
const wxRect & r,
bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored);
/** \brief Get many envelope points for pixel columns at once,
* but don't assume uniform time per pixel.
*/
static void GetValues
( const Envelope &env,
double aligned_time, double sampleDur,
double *buffer, int bufferLen, int leftOffset,
const ZoomInfo &zoomInfo);
EnvelopeEditor(Envelope &envelope, bool mirrored);
~EnvelopeEditor();
// Event Handlers
// Each of these returns true if the envelope needs to be redrawn
bool MouseEvent(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0);
private:
bool HandleMouseButtonDown(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0);
bool HandleDragging(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin = -1.0, float zoomMax = 1.0, float eMin = 0., float eMax = 2.);
bool HandleMouseButtonUp();
private:
float ValueOfPixel(int y, int height, bool upper,
bool dB, double dBRange,
float zoomMin, float zoomMax);
void MoveDragPoint(const wxMouseEvent & event, wxRect & r,
const ZoomInfo &zoomInfo, bool dB, double dBRange,
float zoomMin, float zoomMax);
Envelope &mEnvelope;
const bool mMirrored;
/** \brief Number of pixels contour is from the true envelope. */
int mContourOffset;
// double mInitialVal;
// int mInitialY;
bool mUpper;
int mButton;
bool mDirty;
};
#endif

View File

@ -143,6 +143,8 @@ audacity_SOURCES = \
Diags.h \ Diags.h \
Envelope.cpp \ Envelope.cpp \
Envelope.h \ Envelope.h \
EnvelopeEditor.cpp \
EnvelopeEditor.h \
Experimental.h \ Experimental.h \
FFmpeg.cpp \ FFmpeg.cpp \
FFmpeg.h \ FFmpeg.h \

View File

@ -299,38 +299,38 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \
CrashReport.cpp CrashReport.h Dependencies.cpp Dependencies.h \ CrashReport.cpp CrashReport.h Dependencies.cpp Dependencies.h \
DeviceChange.cpp DeviceChange.h DeviceManager.cpp \ DeviceChange.cpp DeviceChange.h DeviceManager.cpp \
DeviceManager.h Diags.cpp Diags.h Envelope.cpp Envelope.h \ DeviceManager.h Diags.cpp Diags.h Envelope.cpp Envelope.h \
Experimental.h FFmpeg.cpp FFmpeg.h FFT.cpp FFT.h \ EnvelopeEditor.cpp EnvelopeEditor.h Experimental.h FFmpeg.cpp \
FileException.cpp FileException.h FileIO.cpp FileIO.h \ FFmpeg.h FFT.cpp FFT.h FileException.cpp FileException.h \
FileNames.cpp FileNames.h float_cast.h FreqWindow.cpp \ FileIO.cpp FileIO.h FileNames.cpp FileNames.h float_cast.h \
FreqWindow.h HelpText.cpp HelpText.h HistoryWindow.cpp \ FreqWindow.cpp FreqWindow.h HelpText.cpp HelpText.h \
HistoryWindow.h HitTestResult.h ImageManipulation.cpp \ HistoryWindow.cpp HistoryWindow.h HitTestResult.h \
ImageManipulation.h InconsistencyException.cpp \ ImageManipulation.cpp ImageManipulation.h \
InconsistencyException.h InterpolateAudio.cpp \ InconsistencyException.cpp InconsistencyException.h \
InterpolateAudio.h KeyboardCapture.cpp KeyboardCapture.h \ InterpolateAudio.cpp InterpolateAudio.h KeyboardCapture.cpp \
LabelDialog.cpp LabelDialog.h LabelTrack.cpp LabelTrack.h \ KeyboardCapture.h LabelDialog.cpp LabelDialog.h LabelTrack.cpp \
LangChoice.cpp LangChoice.h Languages.cpp Languages.h \ LabelTrack.h LangChoice.cpp LangChoice.h Languages.cpp \
Legacy.cpp Legacy.h Lyrics.cpp Lyrics.h LyricsWindow.cpp \ Languages.h Legacy.cpp Legacy.h Lyrics.cpp Lyrics.h \
LyricsWindow.h MacroMagic.h Matrix.cpp Matrix.h MemoryX.h \ LyricsWindow.cpp LyricsWindow.h MacroMagic.h Matrix.cpp \
Menus.cpp Menus.h MissingAliasFileDialog.cpp \ Matrix.h MemoryX.h Menus.cpp Menus.h \
MissingAliasFileDialog.h Mix.cpp Mix.h MixerBoard.cpp \ MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \
MixerBoard.h ModuleManager.cpp ModuleManager.h NumberScale.h \ Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
PitchName.cpp PitchName.h PlatformCompatibility.cpp \ ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \
PlatformCompatibility.h PluginManager.cpp PluginManager.h \ PlatformCompatibility.cpp PlatformCompatibility.h \
Printing.cpp Printing.h Profiler.cpp Profiler.h Project.cpp \ PluginManager.cpp PluginManager.h Printing.cpp Printing.h \
Project.h ProjectAudioIO.cpp ProjectAudioIO.h \ Profiler.cpp Profiler.h Project.cpp Project.h \
ProjectAudioManager.cpp ProjectAudioManager.h \ ProjectAudioIO.cpp ProjectAudioIO.h ProjectAudioManager.cpp \
ProjectFileIO.cpp ProjectFileIO.h ProjectFileIORegistry.cpp \ ProjectAudioManager.h ProjectFileIO.cpp ProjectFileIO.h \
ProjectFileIORegistry.h ProjectFileManager.cpp \ ProjectFileIORegistry.cpp ProjectFileIORegistry.h \
ProjectFileManager.h ProjectFSCK.cpp ProjectFSCK.h \ ProjectFileManager.cpp ProjectFileManager.h ProjectFSCK.cpp \
ProjectHistory.cpp ProjectHistory.h ProjectManager.cpp \ ProjectFSCK.h ProjectHistory.cpp ProjectHistory.h \
ProjectManager.h ProjectSelectionManager.cpp \ ProjectManager.cpp ProjectManager.h \
ProjectSelectionManager.h ProjectSettings.cpp \ ProjectSelectionManager.cpp ProjectSelectionManager.h \
ProjectSettings.h ProjectWindow.cpp ProjectWindow.h \ ProjectSettings.cpp ProjectSettings.h ProjectWindow.cpp \
RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp RealFFTf48x.h \ ProjectWindow.h RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp \
RefreshCode.h Resample.cpp Resample.h RevisionIdent.h \ RealFFTf48x.h RefreshCode.h Resample.cpp Resample.h \
RingBuffer.cpp RingBuffer.h Screenshot.cpp Screenshot.h \ RevisionIdent.h RingBuffer.cpp RingBuffer.h Screenshot.cpp \
SelectedRegion.cpp SelectedRegion.h SelectionState.cpp \ Screenshot.h SelectedRegion.cpp SelectedRegion.h \
SelectionState.h Shuttle.cpp Shuttle.h \ SelectionState.cpp SelectionState.h Shuttle.cpp Shuttle.h \
ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \ ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \
ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \
SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \ SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \
@ -646,11 +646,11 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \
audacity-Dependencies.$(OBJEXT) \ audacity-Dependencies.$(OBJEXT) \
audacity-DeviceChange.$(OBJEXT) \ audacity-DeviceChange.$(OBJEXT) \
audacity-DeviceManager.$(OBJEXT) audacity-Diags.$(OBJEXT) \ audacity-DeviceManager.$(OBJEXT) audacity-Diags.$(OBJEXT) \
audacity-Envelope.$(OBJEXT) audacity-FFmpeg.$(OBJEXT) \ audacity-Envelope.$(OBJEXT) audacity-EnvelopeEditor.$(OBJEXT) \
audacity-FFT.$(OBJEXT) audacity-FileException.$(OBJEXT) \ audacity-FFmpeg.$(OBJEXT) audacity-FFT.$(OBJEXT) \
audacity-FileIO.$(OBJEXT) audacity-FileNames.$(OBJEXT) \ audacity-FileException.$(OBJEXT) audacity-FileIO.$(OBJEXT) \
audacity-FreqWindow.$(OBJEXT) audacity-HelpText.$(OBJEXT) \ audacity-FileNames.$(OBJEXT) audacity-FreqWindow.$(OBJEXT) \
audacity-HistoryWindow.$(OBJEXT) \ audacity-HelpText.$(OBJEXT) audacity-HistoryWindow.$(OBJEXT) \
audacity-ImageManipulation.$(OBJEXT) \ audacity-ImageManipulation.$(OBJEXT) \
audacity-InconsistencyException.$(OBJEXT) \ audacity-InconsistencyException.$(OBJEXT) \
audacity-InterpolateAudio.$(OBJEXT) \ audacity-InterpolateAudio.$(OBJEXT) \
@ -1375,38 +1375,38 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \
CrashReport.cpp CrashReport.h Dependencies.cpp Dependencies.h \ CrashReport.cpp CrashReport.h Dependencies.cpp Dependencies.h \
DeviceChange.cpp DeviceChange.h DeviceManager.cpp \ DeviceChange.cpp DeviceChange.h DeviceManager.cpp \
DeviceManager.h Diags.cpp Diags.h Envelope.cpp Envelope.h \ DeviceManager.h Diags.cpp Diags.h Envelope.cpp Envelope.h \
Experimental.h FFmpeg.cpp FFmpeg.h FFT.cpp FFT.h \ EnvelopeEditor.cpp EnvelopeEditor.h Experimental.h FFmpeg.cpp \
FileException.cpp FileException.h FileIO.cpp FileIO.h \ FFmpeg.h FFT.cpp FFT.h FileException.cpp FileException.h \
FileNames.cpp FileNames.h float_cast.h FreqWindow.cpp \ FileIO.cpp FileIO.h FileNames.cpp FileNames.h float_cast.h \
FreqWindow.h HelpText.cpp HelpText.h HistoryWindow.cpp \ FreqWindow.cpp FreqWindow.h HelpText.cpp HelpText.h \
HistoryWindow.h HitTestResult.h ImageManipulation.cpp \ HistoryWindow.cpp HistoryWindow.h HitTestResult.h \
ImageManipulation.h InconsistencyException.cpp \ ImageManipulation.cpp ImageManipulation.h \
InconsistencyException.h InterpolateAudio.cpp \ InconsistencyException.cpp InconsistencyException.h \
InterpolateAudio.h KeyboardCapture.cpp KeyboardCapture.h \ InterpolateAudio.cpp InterpolateAudio.h KeyboardCapture.cpp \
LabelDialog.cpp LabelDialog.h LabelTrack.cpp LabelTrack.h \ KeyboardCapture.h LabelDialog.cpp LabelDialog.h LabelTrack.cpp \
LangChoice.cpp LangChoice.h Languages.cpp Languages.h \ LabelTrack.h LangChoice.cpp LangChoice.h Languages.cpp \
Legacy.cpp Legacy.h Lyrics.cpp Lyrics.h LyricsWindow.cpp \ Languages.h Legacy.cpp Legacy.h Lyrics.cpp Lyrics.h \
LyricsWindow.h MacroMagic.h Matrix.cpp Matrix.h MemoryX.h \ LyricsWindow.cpp LyricsWindow.h MacroMagic.h Matrix.cpp \
Menus.cpp Menus.h MissingAliasFileDialog.cpp \ Matrix.h MemoryX.h Menus.cpp Menus.h \
MissingAliasFileDialog.h Mix.cpp Mix.h MixerBoard.cpp \ MissingAliasFileDialog.cpp MissingAliasFileDialog.h Mix.cpp \
MixerBoard.h ModuleManager.cpp ModuleManager.h NumberScale.h \ Mix.h MixerBoard.cpp MixerBoard.h ModuleManager.cpp \
PitchName.cpp PitchName.h PlatformCompatibility.cpp \ ModuleManager.h NumberScale.h PitchName.cpp PitchName.h \
PlatformCompatibility.h PluginManager.cpp PluginManager.h \ PlatformCompatibility.cpp PlatformCompatibility.h \
Printing.cpp Printing.h Profiler.cpp Profiler.h Project.cpp \ PluginManager.cpp PluginManager.h Printing.cpp Printing.h \
Project.h ProjectAudioIO.cpp ProjectAudioIO.h \ Profiler.cpp Profiler.h Project.cpp Project.h \
ProjectAudioManager.cpp ProjectAudioManager.h \ ProjectAudioIO.cpp ProjectAudioIO.h ProjectAudioManager.cpp \
ProjectFileIO.cpp ProjectFileIO.h ProjectFileIORegistry.cpp \ ProjectAudioManager.h ProjectFileIO.cpp ProjectFileIO.h \
ProjectFileIORegistry.h ProjectFileManager.cpp \ ProjectFileIORegistry.cpp ProjectFileIORegistry.h \
ProjectFileManager.h ProjectFSCK.cpp ProjectFSCK.h \ ProjectFileManager.cpp ProjectFileManager.h ProjectFSCK.cpp \
ProjectHistory.cpp ProjectHistory.h ProjectManager.cpp \ ProjectFSCK.h ProjectHistory.cpp ProjectHistory.h \
ProjectManager.h ProjectSelectionManager.cpp \ ProjectManager.cpp ProjectManager.h \
ProjectSelectionManager.h ProjectSettings.cpp \ ProjectSelectionManager.cpp ProjectSelectionManager.h \
ProjectSettings.h ProjectWindow.cpp ProjectWindow.h \ ProjectSettings.cpp ProjectSettings.h ProjectWindow.cpp \
RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp RealFFTf48x.h \ ProjectWindow.h RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp \
RefreshCode.h Resample.cpp Resample.h RevisionIdent.h \ RealFFTf48x.h RefreshCode.h Resample.cpp Resample.h \
RingBuffer.cpp RingBuffer.h Screenshot.cpp Screenshot.h \ RevisionIdent.h RingBuffer.cpp RingBuffer.h Screenshot.cpp \
SelectedRegion.cpp SelectedRegion.h SelectionState.cpp \ Screenshot.h SelectedRegion.cpp SelectedRegion.h \
SelectionState.h Shuttle.cpp Shuttle.h \ SelectionState.cpp SelectionState.h Shuttle.cpp Shuttle.h \
ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \ ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \
ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \
SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \ SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \
@ -2539,6 +2539,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-DirManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-DirManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Dither.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Dither.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Envelope.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-Envelope.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-EnvelopeEditor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FFT.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FFT.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FFmpeg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FFmpeg.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FileException.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-FileException.Po@am__quote@
@ -3566,6 +3567,20 @@ audacity-Envelope.obj: Envelope.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-Envelope.obj `if test -f 'Envelope.cpp'; then $(CYGPATH_W) 'Envelope.cpp'; else $(CYGPATH_W) '$(srcdir)/Envelope.cpp'; fi` @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-Envelope.obj `if test -f 'Envelope.cpp'; then $(CYGPATH_W) 'Envelope.cpp'; else $(CYGPATH_W) '$(srcdir)/Envelope.cpp'; fi`
audacity-EnvelopeEditor.o: EnvelopeEditor.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-EnvelopeEditor.o -MD -MP -MF $(DEPDIR)/audacity-EnvelopeEditor.Tpo -c -o audacity-EnvelopeEditor.o `test -f 'EnvelopeEditor.cpp' || echo '$(srcdir)/'`EnvelopeEditor.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-EnvelopeEditor.Tpo $(DEPDIR)/audacity-EnvelopeEditor.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EnvelopeEditor.cpp' object='audacity-EnvelopeEditor.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-EnvelopeEditor.o `test -f 'EnvelopeEditor.cpp' || echo '$(srcdir)/'`EnvelopeEditor.cpp
audacity-EnvelopeEditor.obj: EnvelopeEditor.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-EnvelopeEditor.obj -MD -MP -MF $(DEPDIR)/audacity-EnvelopeEditor.Tpo -c -o audacity-EnvelopeEditor.obj `if test -f 'EnvelopeEditor.cpp'; then $(CYGPATH_W) 'EnvelopeEditor.cpp'; else $(CYGPATH_W) '$(srcdir)/EnvelopeEditor.cpp'; fi`
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-EnvelopeEditor.Tpo $(DEPDIR)/audacity-EnvelopeEditor.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EnvelopeEditor.cpp' object='audacity-EnvelopeEditor.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-EnvelopeEditor.obj `if test -f 'EnvelopeEditor.cpp'; then $(CYGPATH_W) 'EnvelopeEditor.cpp'; else $(CYGPATH_W) '$(srcdir)/EnvelopeEditor.cpp'; fi`
audacity-FFmpeg.o: FFmpeg.cpp audacity-FFmpeg.o: FFmpeg.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-FFmpeg.o -MD -MP -MF $(DEPDIR)/audacity-FFmpeg.Tpo -c -o audacity-FFmpeg.o `test -f 'FFmpeg.cpp' || echo '$(srcdir)/'`FFmpeg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-FFmpeg.o -MD -MP -MF $(DEPDIR)/audacity-FFmpeg.Tpo -c -o audacity-FFmpeg.o `test -f 'FFmpeg.cpp' || echo '$(srcdir)/'`FFmpeg.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-FFmpeg.Tpo $(DEPDIR)/audacity-FFmpeg.Po @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-FFmpeg.Tpo $(DEPDIR)/audacity-FFmpeg.Po

View File

@ -25,6 +25,7 @@
#include "AColor.h" #include "AColor.h"
#include "widgets/Ruler.h" #include "widgets/Ruler.h"
#include "Envelope.h" #include "Envelope.h"
#include "EnvelopeEditor.h"
#include "Prefs.h" #include "Prefs.h"
#include "Project.h" #include "Project.h"
#include "ProjectSettings.h" #include "ProjectSettings.h"
@ -317,8 +318,8 @@ void TimeTrack::Draw
mRuler->Draw(dc, this); mRuler->Draw(dc, this);
Doubles envValues{ size_t(mid.width) }; Doubles envValues{ size_t(mid.width) };
GetEnvelope()->GetValues EnvelopeEditor::GetValues( *GetEnvelope(),
( 0, 0, envValues.get(), mid.width, 0, zoomInfo ); 0, 0, envValues.get(), mid.width, 0, zoomInfo );
wxPen &pen = highlight ? AColor::uglyPen : AColor::envelopePen; wxPen &pen = highlight ? AColor::uglyPen : AColor::envelopePen;
dc.SetPen( pen ); dc.SetPen( pen );

View File

@ -72,6 +72,7 @@ audio tracks.
#include "AColor.h" #include "AColor.h"
#include "BlockFile.h" #include "BlockFile.h"
#include "Envelope.h" #include "Envelope.h"
#include "EnvelopeEditor.h"
#include "NumberScale.h" #include "NumberScale.h"
#include "WaveClip.h" #include "WaveClip.h"
#include "LabelTrack.h" #include "LabelTrack.h"
@ -1809,14 +1810,14 @@ void TrackArt::DrawClipWaveform(TrackPanelDrawingContext &context,
std::vector<double> vEnv(mid.width); std::vector<double> vEnv(mid.width);
double *const env = &vEnv[0]; double *const env = &vEnv[0];
clip->GetEnvelope()->GetValues EnvelopeEditor::GetValues( *clip->GetEnvelope(),
( tOffset, tOffset,
// PRL: change back to make envelope evaluate only at sample times // PRL: change back to make envelope evaluate only at sample times
// and then interpolate the display // and then interpolate the display
0, // 1.0 / rate, 0, // 1.0 / rate,
env, mid.width, leftOffset, zoomInfo ); env, mid.width, leftOffset, zoomInfo );
// Draw the background of the track, outlining the shape of // Draw the background of the track, outlining the shape of
// the envelope and using a colored pen for the selected // the envelope and using a colored pen for the selected
@ -1949,14 +1950,14 @@ void TrackArt::DrawClipWaveform(TrackPanelDrawingContext &context,
if (!showIndividualSamples) { if (!showIndividualSamples) {
std::vector<double> vEnv2(rectPortion.width); std::vector<double> vEnv2(rectPortion.width);
double *const env2 = &vEnv2[0]; double *const env2 = &vEnv2[0];
clip->GetEnvelope()->GetValues EnvelopeEditor::GetValues( *clip->GetEnvelope(),
( tOffset, tOffset,
// PRL: change back to make envelope evaluate only at sample times // PRL: change back to make envelope evaluate only at sample times
// and then interpolate the display // and then interpolate the display
0, // 1.0 / rate, 0, // 1.0 / rate,
env2, rectPortion.width, leftOffset, zoomInfo ); env2, rectPortion.width, leftOffset, zoomInfo );
DrawMinMaxRMS( context, rectPortion, env2, DrawMinMaxRMS( context, rectPortion, env2,
zoomMin, zoomMax, zoomMin, zoomMax,
dB, dBRange, dB, dBRange,
@ -1984,8 +1985,8 @@ void TrackArt::DrawClipWaveform(TrackPanelDrawingContext &context,
if (drawEnvelope) { if (drawEnvelope) {
DrawEnvelope( DrawEnvelope(
context, mid, env, zoomMin, zoomMax, dB, dBRange, highlightEnvelope ); context, mid, env, zoomMin, zoomMax, dB, dBRange, highlightEnvelope );
clip->GetEnvelope()->DrawPoints EnvelopeEditor::DrawPoints( *clip->GetEnvelope(),
( context, rect, dB, dBRange, zoomMin, zoomMax, true ); context, rect, dB, dBRange, zoomMin, zoomMax, true );
} }
// Draw arrows on the left side if the track extends to the left of the // Draw arrows on the left side if the track extends to the left of the
@ -3262,9 +3263,9 @@ void TrackArt::DrawTimeTrack(TrackPanelDrawingContext &context,
lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / dbRange + 1.0; lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / dbRange + 1.0;
upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / dbRange + 1.0; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / dbRange + 1.0;
} }
track->GetEnvelope()->DrawPoints EnvelopeEditor::DrawPoints( *track->GetEnvelope(),
( context, envRect, context, envRect,
track->GetDisplayLog(), dbRange, lower, upper, false ); track->GetDisplayLog(), dbRange, lower, upper, false );
} }
void TrackArtist::UpdateSelectedPrefs( int id ) void TrackArtist::UpdateSelectedPrefs( int id )

View File

@ -93,6 +93,7 @@
#include "../PlatformCompatibility.h" #include "../PlatformCompatibility.h"
#include "../FileNames.h" #include "../FileNames.h"
#include "../Envelope.h" #include "../Envelope.h"
#include "../EnvelopeEditor.h"
#include "../widgets/LinkingHtmlWindow.h" #include "../widgets/LinkingHtmlWindow.h"
#include "../widgets/ErrorDialog.h" #include "../widgets/ErrorDialog.h"
#include "../FFT.h" #include "../FFT.h"
@ -3113,7 +3114,7 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
artist.pZoomInfo = &zoomInfo; artist.pZoomInfo = &zoomInfo;
TrackPanelDrawingContext context{ memDC, {}, {}, &artist }; TrackPanelDrawingContext context{ memDC, {}, {}, &artist };
mEffect->mEnvelope->DrawPoints( EnvelopeEditor::DrawPoints( *mEffect->mEnvelope,
context, mEnvRect, false, 0.0, context, mEnvRect, false, 0.0,
mEffect->mdBMin, mEffect->mdBMax, false); mEffect->mdBMin, mEffect->mdBMax, false);
} }

View File

@ -14,6 +14,7 @@ Paul Licameli split from TrackPanel.cpp
#include "../../Experimental.h" #include "../../Experimental.h"
#include "../../Envelope.h" #include "../../Envelope.h"
#include "../../EnvelopeEditor.h"
#include "../../HitTestResult.h" #include "../../HitTestResult.h"
#include "../../prefs/WaveformSettings.h" #include "../../prefs/WaveformSettings.h"
#include "../../ProjectAudioIO.h" #include "../../ProjectAudioIO.h"

View File

@ -164,6 +164,7 @@
<ClCompile Include="..\..\..\src\effects\Phaser.cpp" /> <ClCompile Include="..\..\..\src\effects\Phaser.cpp" />
<ClCompile Include="..\..\..\src\effects\VST\VSTControlMSW.cpp" /> <ClCompile Include="..\..\..\src\effects\VST\VSTControlMSW.cpp" />
<ClCompile Include="..\..\..\src\Envelope.cpp" /> <ClCompile Include="..\..\..\src\Envelope.cpp" />
<ClCompile Include="..\..\..\src\EnvelopeEditor.cpp" />
<ClCompile Include="..\..\..\src\FFmpeg.cpp" /> <ClCompile Include="..\..\..\src\FFmpeg.cpp" />
<ClCompile Include="..\..\..\src\FFT.cpp" /> <ClCompile Include="..\..\..\src\FFT.cpp" />
<ClCompile Include="..\..\..\src\FileException.cpp" /> <ClCompile Include="..\..\..\src\FileException.cpp" />
@ -624,6 +625,7 @@
<ClInclude Include="..\..\..\src\DirManager.h" /> <ClInclude Include="..\..\..\src\DirManager.h" />
<ClInclude Include="..\..\..\src\Dither.h" /> <ClInclude Include="..\..\..\src\Dither.h" />
<ClInclude Include="..\..\..\src\Envelope.h" /> <ClInclude Include="..\..\..\src\Envelope.h" />
<ClInclude Include="..\..\..\src\EnvelopeEditor.h" />
<ClInclude Include="..\..\..\src\Experimental.h" /> <ClInclude Include="..\..\..\src\Experimental.h" />
<ClInclude Include="..\..\..\src\FFmpeg.h" /> <ClInclude Include="..\..\..\src\FFmpeg.h" />
<ClInclude Include="..\..\..\src\FFT.h" /> <ClInclude Include="..\..\..\src\FFT.h" />

View File

@ -164,6 +164,9 @@
<ClCompile Include="..\..\..\src\Envelope.cpp"> <ClCompile Include="..\..\..\src\Envelope.cpp">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\src\EnvelopeEditor.cpp">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\..\..\src\FFmpeg.cpp"> <ClCompile Include="..\..\..\src\FFmpeg.cpp">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
@ -1249,6 +1252,9 @@
<ClInclude Include="..\..\..\src\Envelope.h"> <ClInclude Include="..\..\..\src\Envelope.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\src\EnvelopeEditor.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\..\..\src\Experimental.h"> <ClInclude Include="..\..\..\src\Experimental.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>