Stack-allocate where possible! ...

... Removed many unnecessary naked news and deletes.
This commit is contained in:
Paul Licameli 2016-01-31 20:39:24 -05:00
parent be1d9b7dd5
commit dbaa811577
43 changed files with 785 additions and 839 deletions

View File

@ -285,27 +285,28 @@ visit our <a href=\"http://forum.audacityteam.org/\">forum</a>.");
S.StartNotebookPage( wxT("Audacity") );
S.StartVerticalLay(1);
//v For now, change to AudacityLogoWithName via old-fashioned way, not Theme.
wxBitmap *const logo = new wxBitmap((const char **) AudacityLogoWithName_xpm); //v
{
//v For now, change to AudacityLogoWithName via old-fashioned way, not Theme.
wxBitmap logo(AudacityLogoWithName_xpm); //v
// JKC: Resize to 50% of size. Later we may use a smaller xpm as
// our source, but this allows us to tweak the size - if we want to.
// It also makes it easier to revert to full size if we decide to.
const float fScale=0.5f;// smaller size.
wxImage RescaledImage( logo->ConvertToImage() );
// wxIMAGE_QUALITY_HIGH not supported by wxWidgets 2.6.1, or we would use it here.
RescaledImage.Rescale( int(LOGOWITHNAME_WIDTH * fScale), int(LOGOWITHNAME_HEIGHT *fScale) );
wxBitmap RescaledBitmap( RescaledImage );
// JKC: Resize to 50% of size. Later we may use a smaller xpm as
// our source, but this allows us to tweak the size - if we want to.
// It also makes it easier to revert to full size if we decide to.
const float fScale = 0.5f;// smaller size.
wxImage RescaledImage(logo.ConvertToImage());
// wxIMAGE_QUALITY_HIGH not supported by wxWidgets 2.6.1, or we would use it here.
RescaledImage.Rescale(int(LOGOWITHNAME_WIDTH * fScale), int(LOGOWITHNAME_HEIGHT *fScale));
wxBitmap RescaledBitmap(RescaledImage);
icon =
safenew wxStaticBitmap(S.GetParent(), -1,
//*logo, //v
//v theTheme.Bitmap(bmpAudacityLogo), wxPoint(93, 10), wxSize(215, 190));
//v theTheme.Bitmap(bmpAudacityLogoWithName),
RescaledBitmap,
wxDefaultPosition,
wxSize(int(LOGOWITHNAME_WIDTH*fScale), int(LOGOWITHNAME_HEIGHT*fScale)));
delete logo;
icon =
safenew wxStaticBitmap(S.GetParent(), -1,
//*logo, //v
//v theTheme.Bitmap(bmpAudacityLogo), wxPoint(93, 10), wxSize(215, 190));
//v theTheme.Bitmap(bmpAudacityLogoWithName),
RescaledBitmap,
wxDefaultPosition,
wxSize(int(LOGOWITHNAME_WIDTH*fScale), int(LOGOWITHNAME_HEIGHT*fScale)));
}
S.Prop(0).AddWindow( icon );
HtmlWindow *html = safenew LinkingHtmlWindow(S.GetParent(), -1,

View File

@ -1159,7 +1159,7 @@ bool AudacityApp::OnInit()
#if defined(__WXMAC__)
// Disable window animation
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
wxSystemOptions::SetOption(wxMAC_WINDOW_PLAIN_TRANSITION, 1);
#endif
#ifdef AUDACITY_NAME
@ -1203,32 +1203,32 @@ bool AudacityApp::OnInit()
#ifdef AUDACITY_NAME
AddUniquePathToPathList(wxString::Format(wxT("%s/.%s-files"),
home.c_str(), wxT(AUDACITY_NAME)),
audacityPathList);
home.c_str(), wxT(AUDACITY_NAME)),
audacityPathList);
AddUniquePathToPathList(wxString::Format(wxT("%s/share/%s"),
wxT(INSTALL_PREFIX), wxT(AUDACITY_NAME)),
audacityPathList);
wxT(INSTALL_PREFIX), wxT(AUDACITY_NAME)),
audacityPathList);
AddUniquePathToPathList(wxString::Format(wxT("%s/share/doc/%s"),
wxT(INSTALL_PREFIX), wxT(AUDACITY_NAME)),
audacityPathList);
wxT(INSTALL_PREFIX), wxT(AUDACITY_NAME)),
audacityPathList);
#else //AUDACITY_NAME
AddUniquePathToPathList(wxString::Format(wxT("%s/.audacity-files"),
home.c_str()),
audacityPathList);
home.c_str()),
audacityPathList);
AddUniquePathToPathList(wxString::Format(wxT("%s/share/audacity"),
wxT(INSTALL_PREFIX)),
audacityPathList);
wxT(INSTALL_PREFIX)),
audacityPathList);
AddUniquePathToPathList(wxString::Format(wxT("%s/share/doc/audacity"),
wxT(INSTALL_PREFIX)),
audacityPathList);
wxT(INSTALL_PREFIX)),
audacityPathList);
#endif //AUDACITY_NAME
AddUniquePathToPathList(wxString::Format(wxT("%s/share/locale"),
wxT(INSTALL_PREFIX)),
audacityPathList);
wxT(INSTALL_PREFIX)),
audacityPathList);
AddUniquePathToPathList(wxString::Format(wxT("./locale")),
audacityPathList);
audacityPathList);
#endif //__WXGTK__
@ -1242,12 +1242,12 @@ bool AudacityApp::OnInit()
// On Windows, the path to the Audacity program is in argv[0]
wxString progPath = wxPathOnly(argv[0]);
AddUniquePathToPathList(progPath, audacityPathList);
AddUniquePathToPathList(progPath+wxT("\\Languages"), audacityPathList);
AddUniquePathToPathList(progPath + wxT("\\Languages"), audacityPathList);
// See bug #1271 for explanation of location
tmpDirLoc = FileNames::MkDir(wxStandardPaths::Get().GetUserLocalDataDir());
defaultTempDir.Printf(wxT("%s\\SessionData"),
tmpDirLoc.c_str());
tmpDirLoc.c_str());
#endif //__WXWSW__
#ifdef __WXMAC__
@ -1257,15 +1257,15 @@ bool AudacityApp::OnInit()
AddUniquePathToPathList(progPath, audacityPathList);
// If Audacity is a "bundle" package, then the root directory is
// the great-great-grandparent of the directory containing the executable.
AddUniquePathToPathList(progPath+wxT("/../../../"), audacityPathList);
AddUniquePathToPathList(progPath + wxT("/../../../"), audacityPathList);
// These allow for searching the "bundle"
AddUniquePathToPathList(progPath+wxT("/../"), audacityPathList);
AddUniquePathToPathList(progPath+wxT("/../Resources"), audacityPathList);
AddUniquePathToPathList(progPath + wxT("/../"), audacityPathList);
AddUniquePathToPathList(progPath + wxT("/../Resources"), audacityPathList);
defaultTempDir.Printf(wxT("%s/audacity-%s"),
tmpDirLoc.c_str(),
wxGetUserId().c_str());
tmpDirLoc.c_str(),
wxGetUserId().c_str());
#endif //__WXMAC__
// Define languanges for which we have translations, but that are not yet
@ -1283,9 +1283,9 @@ bool AudacityApp::OnInit()
// Initialize preferences and language
InitPreferences();
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) && !defined(__CYGWIN__)
this->AssociateFileTypes();
#endif
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) && !defined(__CYGWIN__)
this->AssociateFileTypes();
#endif
// TODO - read the number of files to store in history from preferences
mRecentFiles = new FileHistory(ID_RECENT_LAST - ID_RECENT_FIRST + 1, ID_RECENT_CLEAR);
@ -1303,10 +1303,10 @@ bool AudacityApp::OnInit()
return false;
}
//<<<< Try to avoid dialogs before this point.
// The reason is that InitTempDir starts the single instance checker.
// If we're waiitng in a dialog before then we can very easily
// start multiple instances, defeating the single instance checker.
//<<<< Try to avoid dialogs before this point.
// The reason is that InitTempDir starts the single instance checker.
// If we're waiitng in a dialog before then we can very easily
// start multiple instances, defeating the single instance checker.
// Initialize the CommandHandler
InitCommandHandler();
@ -1367,68 +1367,70 @@ bool AudacityApp::OnInit()
}
// BG: Create a temporary window to set as the top window
wxImage logoimage((const char **) AudacityLogoWithName_xpm);
wxImage logoimage((const char **)AudacityLogoWithName_xpm);
logoimage.Rescale(logoimage.GetWidth() / 2, logoimage.GetHeight() / 2);
wxBitmap logo(logoimage);
wxSplashScreen *temporarywindow =
new wxSplashScreen(logo,
wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT,
0,
NULL,
wxID_ANY,
wxDefaultPosition,
wxDefaultSize,
wxSTAY_ON_TOP);
temporarywindow->SetTitle(_("Audacity is starting up..."));
SetTopWindow(temporarywindow);
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
AudacityProject *project;
{
wxSplashScreen temporarywindow(
logo,
wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT,
0,
NULL,
wxID_ANY,
wxDefaultPosition,
wxDefaultSize,
wxSTAY_ON_TOP);
temporarywindow.SetTitle(_("Audacity is starting up..."));
SetTopWindow(&temporarywindow);
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
//JKC: Would like to put module loading here.
//JKC: Would like to put module loading here.
// More initialization
// More initialization
InitDitherers();
InitAudioIO();
InitDitherers();
InitAudioIO();
#ifdef __WXMAC__
// On the Mac, users don't expect a program to quit when you close the last window.
// Create a menubar that will show when all project windows are closed.
// On the Mac, users don't expect a program to quit when you close the last window.
// Create a menubar that will show when all project windows are closed.
wxMenu *fileMenu = new wxMenu();
wxMenu *recentMenu = new wxMenu();
fileMenu->Append(wxID_NEW, wxString(_("&New")) + wxT("\tCtrl+N"));
fileMenu->Append(wxID_OPEN, wxString(_("&Open...")) + wxT("\tCtrl+O"));
fileMenu->AppendSubMenu(recentMenu, _("Open &Recent..."));
fileMenu->Append(wxID_ABOUT, _("&About Audacity..."));
fileMenu->Append(wxID_PREFERENCES, wxString(_("&Preferences...")) + wxT("\tCtrl+,"));
wxMenu *fileMenu = new wxMenu();
wxMenu *recentMenu = new wxMenu();
fileMenu->Append(wxID_NEW, wxString(_("&New")) + wxT("\tCtrl+N"));
fileMenu->Append(wxID_OPEN, wxString(_("&Open...")) + wxT("\tCtrl+O"));
fileMenu->AppendSubMenu(recentMenu, _("Open &Recent..."));
fileMenu->Append(wxID_ABOUT, _("&About Audacity..."));
fileMenu->Append(wxID_PREFERENCES, wxString(_("&Preferences...")) + wxT("\tCtrl+,"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _("&File"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _("&File"));
wxMenuBar::MacSetCommonMenuBar(menuBar);
wxMenuBar::MacSetCommonMenuBar(menuBar);
mRecentFiles->UseMenu(recentMenu);
mRecentFiles->AddFilesToMenu(recentMenu);
mRecentFiles->UseMenu(recentMenu);
mRecentFiles->AddFilesToMenu(recentMenu);
SetExitOnFrameDelete(false);
SetExitOnFrameDelete(false);
#endif //__WXMAC__
AudacityProject *project = CreateNewAudacityProject();
mCmdHandler->SetProject(project);
wxWindow * pWnd = MakeHijackPanel() ;
if( pWnd )
{
project->Show( false );
pWnd->SetParent( project );
SetTopWindow(pWnd);
pWnd->Show( true );
}
project = CreateNewAudacityProject();
mCmdHandler->SetProject(project);
wxWindow * pWnd = MakeHijackPanel();
if (pWnd)
{
project->Show(false);
pWnd->SetParent(project);
SetTopWindow(pWnd);
pWnd->Show(true);
}
temporarywindow->Show(false);
delete temporarywindow;
temporarywindow.Show(false);
}
if( project->mShowSplashScreen )
project->OnHelpWelcome();

View File

@ -170,19 +170,19 @@ void AudacityLogger::Show(bool show)
frame->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
// loads either the XPM or the windows resource, depending on the platform
{
#if !defined(__WXMAC__) && !defined(__WXX11__)
wxIcon *ic;
#if defined(__WXMSW__)
ic = new wxIcon(wxICON(AudacityLogo));
#elif defined(__WXGTK__)
ic = new wxIcon(wxICON(AudacityLogoAlpha));
#else
ic = new wxIcon();
#if defined(__WXMSW__)
wxIcon ic{wxICON(AudacityLogo)};
#elif defined(__WXGTK__)
wxIcon ic{wxICON(AudacityLogoAlpha)};
#else
wxIcon ic{};
ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
#endif
frame->SetIcon(*ic);
delete ic;
#endif
frame->SetIcon(ic);
#endif
}
// Log text
ShuttleGui S(frame, eIsCreating);

View File

@ -248,9 +248,7 @@ bool ShowAutoRecoveryDialogIfNeeded(AudacityProject** pproj,
// This must be done before "dlg" is declared.
wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
AutoRecoveryDialog *dlg = new AutoRecoveryDialog(NULL); //*pproj);
int ret = dlg->ShowModal();
delete dlg;
int ret = AutoRecoveryDialog{nullptr}.ShowModal();
switch (ret)
{

View File

@ -188,9 +188,11 @@ void BatchProcessDialog::OnApplyToProject(wxCommandEvent & WXUNUSED(event))
// The disabler must get deleted before the EndModal() call. Otherwise,
// the menus on OSX will remain disabled.
wxWindowDisabler *wd = new wxWindowDisabler(pD);
bool success = mBatchCommands.ApplyChain();
delete wd;
bool success;
{
wxWindowDisabler wd(pD);
success = mBatchCommands.ApplyChain();
}
if (!success) {
Show();

View File

@ -344,8 +344,7 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
ZoomInfo zoomInfo(0.0, ZoomInfo::GetDefaultZoom());
DirManager *d = new DirManager();
TrackFactory *fact = new TrackFactory(d, &zoomInfo);
WaveTrack *t = fact->NewWaveTrack(int16Sample);
WaveTrack *const t = TrackFactory{ d, &zoomInfo }.NewWaveTrack(int16Sample);
Track *tmp = NULL;
t->SetRate(1);
@ -540,7 +539,6 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
delete[]small2;
delete[]block;
delete fact;
d->Deref();
Sequence::SetMaxDiskBlockSize(oldBlockSize);

View File

@ -165,9 +165,9 @@ static void RemoveDependencies(AudacityProject *project,
{
DirManager *dirManager = project->GetDirManager();
ProgressDialog *progress =
new ProgressDialog(_("Removing Dependencies"),
_("Copying audio data into project..."));
ProgressDialog progress
(_("Removing Dependencies"),
_("Copying audio data into project..."));
int updateResult = eProgressSuccess;
// Hash aliasedFiles based on their full paths and
@ -215,7 +215,7 @@ static void RemoveDependencies(AudacityProject *project,
// Update the progress bar
completedBytes += SAMPLE_SIZE(format) * len;
updateResult = progress->Update(completedBytes, totalBytesToProcess);
updateResult = progress.Update(completedBytes, totalBytesToProcess);
if (updateResult != eProgressSuccess)
break;
}
@ -235,8 +235,6 @@ static void RemoveDependencies(AudacityProject *project,
BlockFile *f = it->second;
dirManager->Deref(f);
}
delete progress;
}
//

View File

@ -445,64 +445,62 @@ bool DirManager::SetProject(wxString& newProjPath, wxString& newProjName, const
saved version of the old project must not be moved,
otherwise the old project would not be safe.) */
/*i18n-hint: This title appears on a dialog that indicates the progress in doing something.*/
ProgressDialog *progress = new ProgressDialog(_("Progress"),
_("Saving project data files"));
int total = mBlockFileHash.size();
int count=0;
BlockHash::iterator iter = mBlockFileHash.begin();
bool success = true;
while ((iter != mBlockFileHash.end()) && success)
{
BlockFile *b = iter->second;
/*i18n-hint: This title appears on a dialog that indicates the progress in doing something.*/
ProgressDialog progress(_("Progress"),
_("Saving project data files"));
if (b->IsLocked())
success = CopyToNewProjectDirectory(b);
else{
success = MoveToNewProjectDirectory(b);
}
progress->Update(count, total);
++iter;
count++;
}
if (!success) {
// If the move failed, we try to move/copy as many files
// back as possible so that no damage was done. (No sense
// in checking for errors this time around - there's nothing
// that could be done about it.)
// Likely causes: directory was not writeable, disk was full
projFull = oldLoc;
int total = mBlockFileHash.size();
BlockHash::iterator iter = mBlockFileHash.begin();
while (iter != mBlockFileHash.end())
bool success = true;
int count = 0;
while ((iter != mBlockFileHash.end()) && success)
{
BlockFile *b = iter->second;
MoveToNewProjectDirectory(b);
if (count>=0)
progress->Update(count, total);
if (b->IsLocked())
success = CopyToNewProjectDirectory(b);
else{
success = MoveToNewProjectDirectory(b);
}
progress.Update(count, total);
++iter;
count--;
count++;
}
this->projFull = oldFull;
this->projPath = oldPath;
this->projName = oldName;
if (!success) {
// If the move failed, we try to move/copy as many files
// back as possible so that no damage was done. (No sense
// in checking for errors this time around - there's nothing
// that could be done about it.)
// Likely causes: directory was not writeable, disk was full
delete progress;
projFull = oldLoc;
return false;
BlockHash::iterator iter = mBlockFileHash.begin();
while (iter != mBlockFileHash.end())
{
BlockFile *b = iter->second;
MoveToNewProjectDirectory(b);
if (count >= 0)
progress.Update(count, total);
++iter;
count--;
}
this->projFull = oldFull;
this->projPath = oldPath;
this->projName = oldName;
return false;
}
}
delete progress;
// Some subtlety; SetProject is used both to move a temp project
// into a permanent home as well as just set up path variables when
// loading a project; in this latter case, the movement code does
@ -515,7 +513,7 @@ bool DirManager::SetProject(wxString& newProjPath, wxString& newProjName, const
// NEW; rmdir will fail on non-empty dirs.
wxArrayString dirlist;
count = RecursivelyEnumerate(cleanupLoc1, dirlist, wxEmptyString, false, true);
const int count = RecursivelyEnumerate(cleanupLoc1, dirlist, wxEmptyString, false, true);
//This destroys the empty dirs of the OD block files, which are yet to come.
//Dont know if this will make the project dirty, but I doubt it. (mchinen)
@ -1653,13 +1651,12 @@ other projects. \
if ((nResult != FSCKstatus_CLOSE_REQ) && !ODManager::HasLoadedODFlag())
{
// Remove any empty directories.
ProgressDialog* pProgress =
new ProgressDialog(_("Progress"),
_("Cleaning up unused directories in project data"));
ProgressDialog pProgress
(_("Progress"),
_("Cleaning up unused directories in project data"));
// nDirCount is for updating pProgress. +1 because we may DELETE dirPath.
int nDirCount = RecursivelyCountSubdirs(dirPath) + 1;
RecursivelyRemoveEmptyDirs(dirPath, nDirCount, pProgress);
delete pProgress;
RecursivelyRemoveEmptyDirs(dirPath, nDirCount, &pProgress);
}
// Summarize and flush the log.

View File

@ -692,14 +692,9 @@ bool FFmpegLibs::LoadLibs(wxWindow * WXUNUSED(parent), bool showerr)
{
wxLogError(wxT("Failed to load libraries altogether."));
int dontShowDlg;
FFmpegNotFoundDialog *dlg;
gPrefs->Read(wxT("/FFmpeg/NotFoundDontShow"),&dontShowDlg,0);
if ((dontShowDlg == 0) && (showerr))
{
dlg = new FFmpegNotFoundDialog(NULL);
dlg->ShowModal();
delete dlg;
}
FFmpegNotFoundDialog{nullptr}.ShowModal();
}
*/
// Oh well, just give up

View File

@ -1001,14 +1001,14 @@ void FreqWindow::Recalc()
// just the mProgress window with the idea of preventing user interaction with the
// controls while the plot was being recalculated. This doesn't appear to be necessary
// so just use the the top level window instead.
wxWindowDisabler *blocker = new wxWindowDisabler(this);
wxYieldIfNeeded();
{
wxWindowDisabler blocker(this);
wxYieldIfNeeded();
mAnalyst->Calculate(alg, windowFunc, mWindowSize, mRate,
mData, mDataLen,
&mYMin, &mYMax, mProgress);
delete blocker;
mAnalyst->Calculate(alg, windowFunc, mWindowSize, mRate,
mData, mDataLen,
&mYMin, &mYMax, mProgress);
}
if (hadFocus) {
hadFocus->SetFocus();
}
@ -1033,16 +1033,14 @@ void FreqWindow::OnExport(wxCommandEvent & WXUNUSED(event))
wxString fName = _("spectrum.txt");
fName = FileSelector(_("Export Spectral Data As:"),
wxEmptyString, fName, wxT("txt"), wxT("*.txt"), wxFD_SAVE | wxRESIZE_BORDER, this);
wxEmptyString, fName, wxT("txt"), wxT("*.txt"), wxFD_SAVE | wxRESIZE_BORDER, this);
if (fName == wxT(""))
return;
wxTextFile f(fName);
#ifdef __WXMAC__
wxFile *temp = new wxFile();
temp->Create(fName);
delete temp;
wxFile{}.Create(fName);
#else
f.Create();
#endif

View File

@ -589,12 +589,12 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event))
wxString fName = mTrackNames[mTrackNames.GetCount() - 1].AfterFirst(wxT('-')).Mid(1);
fName = FileSelector(_("Export Labels As:"),
wxEmptyString,
fName.c_str(),
wxT("txt"),
wxT("*.txt"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
this);
wxEmptyString,
fName.c_str(),
wxT("txt"),
wxT("*.txt"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
this);
if (fName == wxT(""))
return;
@ -617,9 +617,7 @@ void LabelDialog::OnExport(wxCommandEvent & WXUNUSED(event))
wxTextFile f(fName);
#ifdef __WXMAC__
wxFile *temp = new wxFile();
temp->Create(fName);
delete temp;
wxFile{}.Create(fName);
#else
f.Create();
#endif

View File

@ -2013,42 +2013,42 @@ void LabelTrack::ShowContextMenu()
{
wxWindow *parent = wxWindow::FindFocus();
wxMenu *menu = new wxMenu();
menu->Bind(wxEVT_MENU, &LabelTrack::OnContextMenu, this);
menu->Append(OnCutSelectedTextID, _("Cu&t"));
menu->Append(OnCopySelectedTextID, _("&Copy"));
menu->Append(OnPasteSelectedTextID, _("&Paste"));
menu->Append(OnDeleteSelectedLabelID, _("&Delete Label"));
menu->Enable(OnCutSelectedTextID, IsTextSelected());
menu->Enable(OnCopySelectedTextID, IsTextSelected());
menu->Enable(OnPasteSelectedTextID, IsTextClipSupported());
menu->Enable(OnDeleteSelectedLabelID, true);
const LabelStruct *ls = GetLabel(mSelIndex);
wxClientDC dc(parent);
if (msFont.Ok())
{
dc.SetFont(msFont);
}
wxMenu menu;
menu.Bind(wxEVT_MENU, &LabelTrack::OnContextMenu, this);
int x;
if (mMouseXPos != -1)
{
x = mMouseXPos;
}
else
{
dc.GetTextExtent(ls->title.Left(mCurrentCursorPos), &x, NULL);
x += ls->xText;
}
menu.Append(OnCutSelectedTextID, _("Cu&t"));
menu.Append(OnCopySelectedTextID, _("&Copy"));
menu.Append(OnPasteSelectedTextID, _("&Paste"));
menu.Append(OnDeleteSelectedLabelID, _("&Delete Label"));
parent->PopupMenu(menu, x, ls->y + (mIconHeight / 2) - 1);
menu.Enable(OnCutSelectedTextID, IsTextSelected());
menu.Enable(OnCopySelectedTextID, IsTextSelected());
menu.Enable(OnPasteSelectedTextID, IsTextClipSupported());
menu.Enable(OnDeleteSelectedLabelID, true);
delete menu;
const LabelStruct *ls = GetLabel(mSelIndex);
wxClientDC dc(parent);
if (msFont.Ok())
{
dc.SetFont(msFont);
}
int x;
if (mMouseXPos != -1)
{
x = mMouseXPos;
}
else
{
dc.GetTextExtent(ls->title.Left(mCurrentCursorPos), &x, NULL);
x += ls->xText;
}
parent->PopupMenu(&menu, x, ls->y + (mIconHeight / 2) - 1);
}
// it's an invalid dragging event
SetWrongDragging(true);

View File

@ -66,15 +66,15 @@ LyricsWindow::LyricsWindow(AudacityProject *parent):
mProject = parent;
// loads either the XPM or the windows resource, depending on the platform
#if !defined(__WXMAC__) && !defined(__WXX11__)
wxIcon *ic;
#ifdef __WXMSW__
ic = new wxIcon(wxICON(AudacityLogo));
#else
ic = new wxIcon(wxICON(AudacityLogo48x48));
#endif
SetIcon(*ic);
delete ic;
#if !defined(__WXMAC__) && !defined(__WXX11__)
{
#ifdef __WXMSW__
wxIcon ic{ wxICON(AudacityLogo) };
#else
wxIcon ic{wxICON(AudacityLogo48x48)};
#endif
SetIcon(ic);
}
#endif
wxPoint panelPos(0, 0);

View File

@ -6148,38 +6148,38 @@ void AudacityProject::OnScoreAlign()
mTracks->GetWaveTracks(true /* selectionOnly */,
&numWaveTracksSelected, &waveTracks);
Mixer *mix = new Mixer(numWaveTracksSelected, // int numInputTracks
waveTracks, // WaveTrack **inputTracks
mTracks->GetTimeTrack(), // TimeTrack *timeTrack
0.0, // double startTime
endTime, // double stopTime
2, // int numOutChannels
44100, // int outBufferSize
true, // bool outInterleaved
mRate, // double outRate
floatSample, // sampleFormat outFormat
true, // bool highQuality = true
NULL); // MixerSpec *mixerSpec = NULL
delete [] waveTracks;
int result;
{
Mixer mix(numWaveTracksSelected, // int numInputTracks
waveTracks, // WaveTrack **inputTracks
mTracks->GetTimeTrack(), // TimeTrack *timeTrack
0.0, // double startTime
endTime, // double stopTime
2, // int numOutChannels
44100, // int outBufferSize
true, // bool outInterleaved
mRate, // double outRate
floatSample, // sampleFormat outFormat
true, // bool highQuality = true
NULL); // MixerSpec *mixerSpec = NULL
delete [] waveTracks;
ASAProgress *progress = new ASAProgress;
ASAProgress progress;
// There's a lot of adjusting made to incorporate the note track offset into
// the note track while preserving the position of notes within beats and
// measures. For debugging, you can see just the pre-scorealign note track
// manipulation by setting SKIP_ACTUAL_SCORE_ALIGNMENT. You could then, for
// example, save the modified note track in ".gro" form to read the details.
//#define SKIP_ACTUAL_SCORE_ALIGNMENT 1
// There's a lot of adjusting made to incorporate the note track offset into
// the note track while preserving the position of notes within beats and
// measures. For debugging, you can see just the pre-scorealign note track
// manipulation by setting SKIP_ACTUAL_SCORE_ALIGNMENT. You could then, for
// example, save the modified note track in ".gro" form to read the details.
//#define SKIP_ACTUAL_SCORE_ALIGNMENT 1
#ifndef SKIP_ACTUAL_SCORE_ALIGNMENT
int result = scorealign((void *) mix, &mixer_process,
2 /* channels */, 44100.0 /* srate */, endTime,
alignedNoteTrack->GetSequence(), progress, params);
result = scorealign((void *) &mix, &mixer_process,
2 /* channels */, 44100.0 /* srate */, endTime,
alignedNoteTrack->GetSequence(), &progress, params);
#else
int result = SA_SUCCESS;
result = SA_SUCCESS;
#endif
delete progress;
delete mix;
}
if (result == SA_SUCCESS) {
mTracks->Replace(nt, alignedNoteTrack, true);

View File

@ -161,39 +161,40 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
endTime = mixEndTime;
}
Mixer *mixer = new Mixer(numWaves, waveArray,
Mixer::WarpOptions(tracks->GetTimeTrack()),
startTime, endTime, mono ? 1 : 2, maxBlockLen, false,
rate, format);
Mixer mixer(numWaves, waveArray,
Mixer::WarpOptions(tracks->GetTimeTrack()),
startTime, endTime, mono ? 1 : 2, maxBlockLen, false,
rate, format);
::wxSafeYield();
ProgressDialog *progress = new ProgressDialog(_("Mix and Render"),
_("Mixing and rendering tracks"));
int updateResult = eProgressSuccess;
while(updateResult == eProgressSuccess) {
sampleCount blockLen = mixer->Process(maxBlockLen);
{
ProgressDialog progress(_("Mix and Render"),
_("Mixing and rendering tracks"));
if (blockLen == 0)
break;
while (updateResult == eProgressSuccess) {
sampleCount blockLen = mixer.Process(maxBlockLen);
if (mono) {
samplePtr buffer = mixer->GetBuffer();
mixLeft->Append(buffer, format, blockLen);
if (blockLen == 0)
break;
if (mono) {
samplePtr buffer = mixer.GetBuffer();
mixLeft->Append(buffer, format, blockLen);
}
else {
samplePtr buffer;
buffer = mixer.GetBuffer(0);
mixLeft->Append(buffer, format, blockLen);
buffer = mixer.GetBuffer(1);
mixRight->Append(buffer, format, blockLen);
}
updateResult = progress.Update(mixer.MixGetCurrentTime() - startTime, endTime - startTime);
}
else {
samplePtr buffer;
buffer = mixer->GetBuffer(0);
mixLeft->Append(buffer, format, blockLen);
buffer = mixer->GetBuffer(1);
mixRight->Append(buffer, format, blockLen);
}
updateResult = progress->Update(mixer->MixGetCurrentTime() - startTime, endTime - startTime);
}
delete progress;
mixLeft->Flush();
if (!mono)
mixRight->Flush();
@ -222,7 +223,6 @@ bool MixAndRender(TrackList *tracks, TrackFactory *trackFactory,
}
delete[] waveArray;
delete mixer;
return (updateResult == eProgressSuccess || updateResult == eProgressStopped);
}

View File

@ -1765,15 +1765,15 @@ MixerBoardFrame::MixerBoardFrame(AudacityProject* parent)
mMixerBoard->UpdateTrackClusters();
// loads either the XPM or the windows resource, depending on the platform
#if !defined(__WXMAC__) && !defined(__WXX11__)
wxIcon *ic;
#ifdef __WXMSW__
ic = new wxIcon(wxICON(AudacityLogo));
#else
ic = new wxIcon(wxICON(AudacityLogo48x48));
#endif
SetIcon(*ic);
delete ic;
#if !defined(__WXMAC__) && !defined(__WXX11__)
{
#ifdef __WXMSW__
wxIcon ic{ wxICON(AudacityLogo) };
#else
wxIcon ic{wxICON(AudacityLogo48x48)};
#endif
SetIcon(ic);
}
#endif
}

View File

@ -969,58 +969,58 @@ void PluginRegistrationDialog::OnOK(wxCommandEvent & WXUNUSED(evt))
// Make sure the progress dialog is deleted before we call EndModal() or
// we will leave the project window in an unusable state on OSX.
// See bug #1192.
ProgressDialog *progress = new ProgressDialog(GetTitle(), msg, pdlgHideStopButton);
progress->CenterOnParent();
int i = 0;
for (ItemDataMap::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
{
ItemData & item = iter->second;
wxString path = item.path;
ProgressDialog progress(GetTitle(), msg, pdlgHideStopButton);
progress.CenterOnParent();
if (item.state == STATE_Enabled && item.plugs[0]->GetPluginType() == PluginTypeStub)
int i = 0;
for (ItemDataMap::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
{
last3 = last3.AfterFirst(wxT('\n')) + item.path + wxT("\n");
int status = progress->Update(++i, enableCount, wxString::Format(_("Enabling effect:\n\n%s"), last3.c_str()));
if (!status)
{
break;
}
ItemData & item = iter->second;
wxString path = item.path;
// Try to register the plugin via each provider until one succeeds
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
if (item.state == STATE_Enabled && item.plugs[0]->GetPluginType() == PluginTypeStub)
{
if (mm.RegisterPlugin(item.plugs[j]->GetProviderID(), path))
last3 = last3.AfterFirst(wxT('\n')) + item.path + wxT("\n");
int status = progress.Update(++i, enableCount, wxString::Format(_("Enabling effect:\n\n%s"), last3.c_str()));
if (!status)
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
pm.mPlugins.erase(item.plugs[j]->GetProviderID() + wxT("_") + path);
}
break;
}
// Try to register the plugin via each provider until one succeeds
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
if (mm.RegisterPlugin(item.plugs[j]->GetProviderID(), path))
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
pm.mPlugins.erase(item.plugs[j]->GetProviderID() + wxT("_") + path);
}
break;
}
}
}
else if (item.state == STATE_New)
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
item.plugs[j]->SetValid(false);
}
}
else if (item.state != STATE_New)
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
item.plugs[j]->SetEnabled(item.state == STATE_Enabled);
item.plugs[j]->SetValid(item.valid);
}
}
}
else if (item.state == STATE_New)
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
item.plugs[j]->SetValid(false);
}
}
else if (item.state != STATE_New)
{
for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++)
{
item.plugs[j]->SetEnabled(item.state == STATE_Enabled);
item.plugs[j]->SetValid(item.valid);
}
}
pm.Save();
}
pm.Save();
delete progress;
EndModal(wxID_OK);
}

View File

@ -1026,17 +1026,17 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
// loads either the XPM or the windows resource, depending on the platform
#if !defined(__WXMAC__) && !defined(__WXX11__)
wxIcon *ic;
#if defined(__WXMSW__)
ic = new wxIcon(wxICON(AudacityLogo));
#elif defined(__WXGTK__)
ic = new wxIcon(wxICON(AudacityLogoAlpha));
#else
ic = new wxIcon();
{
#if defined(__WXMSW__)
wxIcon ic{ wxICON(AudacityLogo) };
#elif defined(__WXGTK__)
wxIcon ic{wxICON(AudacityLogoAlpha)};
#else
wxIcon ic{};
ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
#endif
SetIcon(*ic);
delete ic;
#endif
SetIcon(ic);
}
#endif
mIconized = false;
@ -1473,9 +1473,8 @@ void AudacityProject::FinishAutoScroll()
// Call our Scroll method which updates our ViewInfo variables
// to reflect the positions of the scrollbars
wxScrollEvent *dummy = new wxScrollEvent();
OnScroll(*dummy);
delete dummy;
wxScrollEvent dummy;
OnScroll(dummy);
mAutoScrolling = false;
}
@ -1590,9 +1589,8 @@ void AudacityProject::TP_ScrollWindow(double scrollto)
// Call our Scroll method which updates our ViewInfo variables
// to reflect the positions of the scrollbars
wxScrollEvent *dummy = new wxScrollEvent();
OnScroll(*dummy);
delete dummy;
wxScrollEvent dummy;
OnScroll(dummy);
}
//
@ -2643,25 +2641,24 @@ void AudacityProject::OpenFile(wxString fileName, bool addtohistory)
// for a long time searching for line breaks. So, we look for our
// signature at the beginning of the file first:
wxFFile *ff = new wxFFile(fileName, wxT("rb"));
if (!ff->IsOpened()) {
wxMessageBox(_("Could not open file: ") + fileName,
_("Error opening file"),
wxOK | wxCENTRE, this);
}
char buf[16];
int numRead = ff->Read(buf, 15);
if (numRead != 15) {
wxMessageBox(wxString::Format(_("File may be invalid or corrupted: \n%s"),
(const wxChar*)fileName), _("Error Opening File or Project"),
wxOK | wxCENTRE, this);
ff->Close();
delete ff;
return;
{
wxFFile ff(fileName, wxT("rb"));
if (!ff.IsOpened()) {
wxMessageBox(_("Could not open file: ") + fileName,
_("Error opening file"),
wxOK | wxCENTRE, this);
}
int numRead = ff.Read(buf, 15);
if (numRead != 15) {
wxMessageBox(wxString::Format(_("File may be invalid or corrupted: \n%s"),
(const wxChar*)fileName), _("Error Opening File or Project"),
wxOK | wxCENTRE, this);
ff.Close();
return;
}
buf[15] = 0;
}
buf[15] = 0;
ff->Close();
delete ff;
wxString temp = LAT1CTOWX(buf);
@ -3617,21 +3614,19 @@ bool AudacityProject::Save(bool overwrite /* = true */ ,
WaveTrack* pWaveTrack;
TrackListOfKindIterator iter(Track::Wave, mTracks);
unsigned int numWaveTracks = 0;
TrackList* pSavedTrackList = new TrackList();
TrackList pSavedTrackList(true);
for (pTrack = iter.First(); pTrack != NULL; pTrack = iter.Next())
{
numWaveTracks++;
pWaveTrack = (WaveTrack*)pTrack;
pSavedTrack = mTrackFactory->DuplicateWaveTrack(*pWaveTrack);
pSavedTrackList->Add(pSavedTrack);
pSavedTrackList.Add(pSavedTrack);
}
if (numWaveTracks == 0)
{
// Nothing to save compressed => success. Delete the copies and go.
delete pSavedTrackList;
return true;
}
// Okay, now some bold state-faking to default values.
for (pTrack = iter.First(); pTrack != NULL; pTrack = iter.Next())
@ -3683,7 +3678,7 @@ bool AudacityProject::Save(bool overwrite /* = true */ ,
}
// Restore the saved track states and clean up.
TrackListIterator savedTrackIter(pSavedTrackList);
TrackListIterator savedTrackIter(&pSavedTrackList);
for (pTrack = iter.First(), pSavedTrack = savedTrackIter.First();
((pTrack != NULL) && (pSavedTrack != NULL));
pTrack = iter.Next(), pSavedTrack = savedTrackIter.Next())
@ -3697,9 +3692,6 @@ bool AudacityProject::Save(bool overwrite /* = true */ ,
pWaveTrack->SetPan(((WaveTrack*)pSavedTrack)->GetPan());
}
pSavedTrackList->Clear(true);
delete pSavedTrackList;
return bSuccess;
}
#endif

View File

@ -2162,10 +2162,10 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &waveTrackCache,
// and then paint this directly to our offscreen
// bitmap. Note that this could be optimized even
// more, but for now this is not bad. -dmazzoni
wxImage *image = new wxImage((int)mid.width, (int)mid.height);
if (!image)
wxImage image((int)mid.width, (int)mid.height);
if (!image.IsOk())
return;
unsigned char *data = image->GetData();
unsigned char *data = image.GetData();
const int half = settings.GetFFTLength() / 2;
const double binUnit = rate / (2 * half);
@ -2471,7 +2471,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &waveTrackCache,
} // each yy
} // each xx
wxBitmap converted = wxBitmap(*image);
wxBitmap converted = wxBitmap(image);
wxMemoryDC memDC;
@ -2479,7 +2479,6 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &waveTrackCache,
dc.Blit(mid.x, mid.y, mid.width, mid.height, &memDC, 0, 0, wxCOPY, FALSE);
delete image;
#ifdef EXPERIMENTAL_FFT_Y_GRID
delete[] yGrid;
#endif //EXPERIMENTAL_FFT_Y_GRID

View File

@ -1430,53 +1430,52 @@ void TrackPanel::OnPaint(wxPaintEvent & /* event */)
wxStopWatch sw;
#endif
// Construct the paint DC on the heap so that it may be deleted
// early
wxPaintDC *dc = new wxPaintDC(this);
// Retrieve the damage rectangle
wxRect box = GetUpdateRegion().GetBox();
// Recreate the backing bitmap if we have a full refresh
// (See TrackPanel::Refresh())
if (mRefreshBacking || (box == GetRect()))
{
// Reset (should a mutex be used???)
mRefreshBacking = false;
wxPaintDC dc(this);
if (mResizeBacking)
// Retrieve the damage rectangle
wxRect box = GetUpdateRegion().GetBox();
// Recreate the backing bitmap if we have a full refresh
// (See TrackPanel::Refresh())
if (mRefreshBacking || (box == GetRect()))
{
// Reset
mResizeBacking = false;
// Reset (should a mutex be used???)
mRefreshBacking = false;
// Delete the backing bitmap
if (mBacking)
if (mResizeBacking)
{
mBackingDC.SelectObject(wxNullBitmap);
delete mBacking;
mBacking = NULL;
// Reset
mResizeBacking = false;
// Delete the backing bitmap
if (mBacking)
{
mBackingDC.SelectObject(wxNullBitmap);
delete mBacking;
mBacking = NULL;
}
wxSize sz = GetClientSize();
mBacking = new wxBitmap();
mBacking->Create(sz.x, sz.y); //, *dc);
mBackingDC.SelectObject(*mBacking);
}
wxSize sz = GetClientSize();
mBacking = new wxBitmap();
mBacking->Create(sz.x, sz.y); //, *dc);
mBackingDC.SelectObject(*mBacking);
// Redraw the backing bitmap
DrawTracks(&mBackingDC);
// Copy it to the display
dc.Blit(0, 0, mBacking->GetWidth(), mBacking->GetHeight(), &mBackingDC, 0, 0);
}
else
{
// Copy full, possibly clipped, damage rectangle
dc.Blit(box.x, box.y, box.width, box.height, &mBackingDC, box.x, box.y);
}
// Redraw the backing bitmap
DrawTracks(&mBackingDC);
// Copy it to the display
dc->Blit(0, 0, mBacking->GetWidth(), mBacking->GetHeight(), &mBackingDC, 0, 0);
// Done with the clipped DC
}
else
{
// Copy full, possibly clipped, damage rectangle
dc->Blit(box.x, box.y, box.width, box.height, &mBackingDC, box.x, box.y);
}
// Done with the clipped DC
delete dc;
// Drawing now goes directly to the client area. It can't use the paint DC
// becuase the paint DC might be clipped and DrawOverlays() may need to draw

View File

@ -57,15 +57,14 @@ void UndoManager::CalculateSpaceUsage()
space.Clear();
space.Add(0, stack.GetCount());
Set *prev = new Set;
Set *cur = new Set;
Set s1, s2;
Set *prev = &s1;
Set *cur = &s2;
for (size_t i = 0, cnt = stack.GetCount(); i < cnt; i++)
{
// Swap map pointers
Set *swap = prev;
prev = cur;
cur = swap;
std::swap(cur, prev);
// And clean out the NEW current map
cur->clear();
@ -102,8 +101,6 @@ void UndoManager::CalculateSpaceUsage()
}
}
delete cur;
delete prev;
TIMER_STOP( space_calc );
}

View File

@ -827,13 +827,12 @@ void VoiceKey::CalibrateNoise(WaveTrack & t, sampleCount start, sampleCount len)
/* i18n-hint: %1.4f is replaced by a number. sd stands for 'Standard Deviations'*/
text += wxString::Format(_("Energy -- mean: %1.4f sd: (%1.4f)\n"),mEnergyMean,mEnergySD);
text+= wxString::Format(_("Sign Changes -- mean: %1.4f sd: (%1.4f)\n"),mSignChangesMean,mSignChangesSD);
text+= wxString::Format(_("Direction Changes -- mean: %1.4f sd: (%1.4f)\n"),mDirectionChangesMean,mDirectionChangesSD);
wxMessageDialog * stats = new wxMessageDialog(NULL, text,
wxT("Calibration Complete"),
wxOK | wxICON_INFORMATION,
wxPoint(-1,-1));
stats->ShowModal();
delete stats;
text += wxString::Format(_("Direction Changes -- mean: %1.4f sd: (%1.4f)\n"), mDirectionChangesMean, mDirectionChangesSD);
wxMessageDialog{ NULL, text,
wxT("Calibration Complete"),
wxOK | wxICON_INFORMATION,
wxPoint(-1, -1) }
.ShowModal();
AdjustThreshold(mThresholdAdjustment);
}

View File

@ -1731,7 +1731,7 @@ bool WaveClip::Resample(int rate, ProgressDialog *progress)
return true; // Nothing to do
double factor = (double)rate / (double)mRate;
::Resample* resample = new ::Resample(true, factor, factor); // constant rate resampling
::Resample resample(true, factor, factor); // constant rate resampling
int bufsize = 65536;
float* inBuffer = new float[bufsize];
@ -1764,7 +1764,7 @@ bool WaveClip::Resample(int rate, ProgressDialog *progress)
}
int inBufferUsed = 0;
outGenerated = resample->Process(factor, inBuffer, inLen, isLast,
outGenerated = resample.Process(factor, inBuffer, inLen, isLast,
&inBufferUsed, outBuffer, bufsize);
pos += inBufferUsed;
@ -1795,7 +1795,6 @@ bool WaveClip::Resample(int rate, ProgressDialog *progress)
delete[] inBuffer;
delete[] outBuffer;
delete resample;
if (error)
{

View File

@ -826,11 +826,12 @@ bool WaveTrack::ClearAndPaste(double t0, // Start of time to clear
}
// If provided time warper was NULL, use a default one that does nothing
IdentityTimeWarper localWarper;
TimeWarper *warper = NULL;
if (effectWarper != NULL) {
warper = effectWarper;
} else {
warper = new IdentityTimeWarper();
warper = &localWarper;
}
// Align to a sample
@ -974,10 +975,6 @@ bool WaveTrack::ClearAndPaste(double t0, // Start of time to clear
for (int ii = cuts.GetCount(); ii--;)
delete cuts[ii];
// If we created a default time warper, we need to DELETE it
if (effectWarper == NULL)
delete warper;
return true;
}
@ -1645,9 +1642,7 @@ sampleCount WaveTrack::GetMaxBlockSize() const
{
// We really need the maximum block size, so create a
// temporary sequence to get it.
Sequence *tempseq = new Sequence(mDirManager, mFormat);
maxblocksize = tempseq->GetMaxBlockSize();
delete tempseq;
maxblocksize = Sequence{ mDirManager, mFormat }.GetMaxBlockSize();
}
wxASSERT(maxblocksize > 0);

View File

@ -476,9 +476,7 @@ void ContrastDialog::OnExport(wxCommandEvent & WXUNUSED(event))
wxTextFile f(fName);
#ifdef __WXMAC__
wxFile *temp = new wxFile();
temp->Create(fName);
delete temp;
wxFile{}.Create(fName);
#else
f.Create();
#endif

View File

@ -1154,6 +1154,16 @@ void Effect::SetBatchProcessing(bool start)
}
}
namespace {
struct SetProgress {
SetProgress(ProgressDialog *& mProgress_, ProgressDialog *progress)
: mProgress(mProgress_)
{ mProgress = progress; }
~SetProgress() { mProgress = nullptr; }
ProgressDialog *& mProgress;
};
}
bool Effect::DoEffect(wxWindow *parent,
double projectRate,
TrackList *list,
@ -1230,12 +1240,11 @@ bool Effect::DoEffect(wxWindow *parent,
bool skipFlag = CheckWhetherSkipEffect();
if (skipFlag == false)
{
mProgress = new ProgressDialog(GetName(),
wxString::Format(_("Applying %s..."), GetName().c_str()),
pdlgHideStopButton);
ProgressDialog progress(GetName(),
wxString::Format(_("Applying %s..."), GetName().c_str()),
pdlgHideStopButton);
SetProgress sp(mProgress, &progress);
returnVal = Process();
delete mProgress;
mProgress = NULL;
}
End();
@ -1870,22 +1879,20 @@ bool Effect::ProcessTrack(int count,
if (isGenerator)
{
AudacityProject *p = GetActiveProject();
StepTimeWarper *warper = new StepTimeWarper(mT0 + genLength, genLength - (mT1 - mT0));
StepTimeWarper warper(mT0 + genLength, genLength - (mT1 - mT0));
// Transfer the data from the temporary tracks to the actual ones
genLeft->Flush();
// mT1 gives us the NEW selection. We want to replace up to GetSel1().
left->ClearAndPaste(mT0, p->GetSel1(), genLeft, true, true, warper);
left->ClearAndPaste(mT0, p->GetSel1(), genLeft, true, true, &warper);
delete genLeft;
if (genRight)
{
genRight->Flush();
right->ClearAndPaste(mT0, mT1, genRight, true, true, warper);
right->ClearAndPaste(mT0, mT1, genRight, true, true, &warper);
delete genRight;
}
delete warper;
}
// Allow the plugin to cleanup
@ -2529,14 +2536,13 @@ void Effect::Preview(bool dryOnly)
// Apply effect
if (!dryOnly) {
mProgress = new ProgressDialog(GetName(),
_("Preparing preview"),
pdlgHideCancelButton); // Have only "Stop" button.
ProgressDialog progress(GetName(),
_("Preparing preview"),
pdlgHideCancelButton); // Have only "Stop" button.
SetProgress sp(mProgress, &progress);
mIsPreview = true;
success = Process();
mIsPreview = false;
delete mProgress;
mProgress = NULL;
}
if (success)
@ -2570,16 +2576,16 @@ void Effect::Preview(bool dryOnly)
// The progress dialog must be deleted before stopping the stream
// to allow events to flow to the app during StopStream processing.
// The progress dialog blocks these events.
ProgressDialog *progress =
new ProgressDialog(GetName(), _("Previewing"), pdlgHideCancelButton);
{
ProgressDialog progress
(GetName(), _("Previewing"), pdlgHideCancelButton);
while (gAudioIO->IsStreamActive(token) && previewing == eProgressSuccess) {
::wxMilliSleep(100);
previewing = progress->Update(gAudioIO->GetStreamTime() - mT0, t1 - mT0);
while (gAudioIO->IsStreamActive(token) && previewing == eProgressSuccess) {
::wxMilliSleep(100);
previewing = progress.Update(gAudioIO->GetStreamTime() - mT0, t1 - mT0);
}
}
delete progress;
gAudioIO->StopStream();
while (gAudioIO->IsBusy()) {
@ -3207,14 +3213,14 @@ void EffectUIHost::OnDebug(wxCommandEvent & evt)
void EffectUIHost::OnMenu(wxCommandEvent & WXUNUSED(evt))
{
wxMenu *menu = new wxMenu();
wxMenu menu;
wxMenu *sub;
LoadUserPresets();
if (mUserPresets.GetCount() == 0)
{
menu->Append(kUserPresetsDummyID, _("User Presets"))->Enable(false);
menu.Append(kUserPresetsDummyID, _("User Presets"))->Enable(false);
}
else
{
@ -3223,14 +3229,14 @@ void EffectUIHost::OnMenu(wxCommandEvent & WXUNUSED(evt))
{
sub->Append(kUserPresetsID + i, mUserPresets[i]);
}
menu->Append(0, _("User Presets"), sub);
menu.Append(0, _("User Presets"), sub);
}
menu->Append(kSaveAsID, _("Save Preset..."));
menu.Append(kSaveAsID, _("Save Preset..."));
if (mUserPresets.GetCount() == 0)
{
menu->Append(kDeletePresetDummyID, _("Delete Preset"))->Enable(false);
menu.Append(kDeletePresetDummyID, _("Delete Preset"))->Enable(false);
}
else
{
@ -3239,10 +3245,10 @@ void EffectUIHost::OnMenu(wxCommandEvent & WXUNUSED(evt))
{
sub->Append(kDeletePresetID + i, mUserPresets[i]);
}
menu->Append(0, _("Delete Preset"), sub);
menu.Append(0, _("Delete Preset"), sub);
}
menu->AppendSeparator();
menu.AppendSeparator();
wxArrayString factory = mEffect->GetFactoryPresets();
@ -3262,14 +3268,14 @@ void EffectUIHost::OnMenu(wxCommandEvent & WXUNUSED(evt))
sub->Append(kFactoryPresetsID + i, label);
}
}
menu->Append(0, _("Factory Presets"), sub);
menu.Append(0, _("Factory Presets"), sub);
menu->AppendSeparator();
menu->Append(kImportID, _("Import..."))->Enable(mClient->CanExportPresets());
menu->Append(kExportID, _("Export..."))->Enable(mClient->CanExportPresets());
menu->AppendSeparator();
menu->Append(kOptionsID, _("Options..."))->Enable(mClient->HasOptions());
menu->AppendSeparator();
menu.AppendSeparator();
menu.Append(kImportID, _("Import..."))->Enable(mClient->CanExportPresets());
menu.Append(kExportID, _("Export..."))->Enable(mClient->CanExportPresets());
menu.AppendSeparator();
menu.Append(kOptionsID, _("Options..."))->Enable(mClient->HasOptions());
menu.AppendSeparator();
sub = new wxMenu();
@ -3279,13 +3285,11 @@ void EffectUIHost::OnMenu(wxCommandEvent & WXUNUSED(evt))
sub->Append(kDummyID, wxString::Format(_("Vendor: %s"), mEffect->GetVendor().c_str()));
sub->Append(kDummyID, wxString::Format(_("Description: %s"), mEffect->GetDescription().c_str()));
menu->Append(0, _("About"), sub);
menu.Append(0, _("About"), sub);
wxWindow *btn = FindWindow(kMenuID);
wxRect r = btn->GetRect();
btn->PopupMenu(menu, r.GetLeft(), r.GetBottom());
delete menu;
btn->PopupMenu(&menu, r.GetLeft(), r.GetBottom());
}
void EffectUIHost::OnEnable(wxCommandEvent & WXUNUSED(evt))

View File

@ -362,7 +362,7 @@ protected:
// may be needed by any particular subclass of Effect.
//
protected:
ProgressDialog *mProgress;
ProgressDialog *mProgress; // Temporary pointer, NOT deleted in destructor.
double mProjectRate; // Sample rate of the project - NEW tracks should
// be created with this rate...
double mSampleRate;

View File

@ -2161,24 +2161,23 @@ void EffectEqualization::ErrMin(void)
double correction = 1.6;
bool flag;
int j=0;
Envelope *testEnvelope;
testEnvelope = new Envelope();
testEnvelope->SetInterpolateDB(false);
testEnvelope->Mirror(false);
testEnvelope->SetRange(-120.0, 60.0);
testEnvelope->Flatten(0.);
testEnvelope->SetTrackLen(1.0);
testEnvelope->CopyFrom(mLogEnvelope, 0.0, 1.0);
Envelope testEnvelope;
testEnvelope.SetInterpolateDB(false);
testEnvelope.Mirror(false);
testEnvelope.SetRange(-120.0, 60.0);
testEnvelope.Flatten(0.);
testEnvelope.SetTrackLen(1.0);
testEnvelope.CopyFrom(mLogEnvelope, 0.0, 1.0);
for(i=0; i < NUM_PTS; i++)
vals[i] = testEnvelope->GetValue(mWhens[i]);
vals[i] = testEnvelope.GetValue(mWhens[i]);
// Do error minimisation
error = 0.;
GraphicEQ(testEnvelope);
GraphicEQ(&testEnvelope);
for(i=0; i < NUM_PTS; i++) //calc initial error
{
double err = vals[i] - testEnvelope->GetValue(mWhens[i]);
double err = vals[i] - testEnvelope.GetValue(mWhens[i]);
error += err*err;
}
oldError = error;
@ -2208,11 +2207,11 @@ void EffectEqualization::ErrMin(void)
mEQVals[i] = -20.;
flag = false;
}
GraphicEQ(testEnvelope); //calculate envelope
GraphicEQ(&testEnvelope); //calculate envelope
error = 0.;
for(int k=0; k < NUM_PTS; k++) //calculate error
{
double err = vals[k] - testEnvelope->GetValue(mWhens[k]);
double err = vals[k] - testEnvelope.GetValue(mWhens[k]);
error += err*err;
}
}
@ -2231,9 +2230,8 @@ void EffectEqualization::ErrMin(void)
if( error > .0025 * mBandsInUse ) // not within 0.05dB on each slider, on average
{
Select( (int) mCurves.GetCount()-1 );
EnvelopeUpdated(testEnvelope, false);
EnvelopeUpdated(&testEnvelope, false);
}
delete testEnvelope;
}
void EffectEqualization::GraphicEQ(Envelope *env)

View File

@ -332,8 +332,8 @@ bool EffectEqualization48x::TrackCompare()
wxArrayPtrVoid SecondOMap;
SecondIMap.Clear();
SecondOMap.Clear();
TrackList *SecondOutputTracks = new TrackList();
TrackList SecondOutputTracks(true);
//iterate over tracks of type trackType (All types if Track::All)
TrackListOfKindIterator aIt(mEffectEqualization->mOutputTracksType, mEffectEqualization->mTracks);
@ -345,14 +345,14 @@ bool EffectEqualization48x::TrackCompare()
(mEffectEqualization->mOutputTracksType == Track::All && aTrack->IsSyncLockSelected()))
{
Track *o = aTrack->Duplicate();
SecondOutputTracks->Add(o);
SecondOutputTracks.Add(o);
SecondIMap.Add(aTrack);
SecondIMap.Add(o);
}
}
for(int i=0;i<2;i++) {
SelectedTrackListOfKindIterator iter(Track::Wave, i?mEffectEqualization->mOutputTracks:SecondOutputTracks);
SelectedTrackListOfKindIterator iter(Track::Wave, i ? mEffectEqualization->mOutputTracks : &SecondOutputTracks);
i?sMathPath=sMathPath:sMathPath=0;
WaveTrack *track = (WaveTrack *) iter.First();
int count = 0;
@ -375,7 +375,7 @@ bool EffectEqualization48x::TrackCompare()
}
}
SelectedTrackListOfKindIterator iter(Track::Wave, mEffectEqualization->mOutputTracks);
SelectedTrackListOfKindIterator iter2(Track::Wave, SecondOutputTracks);
SelectedTrackListOfKindIterator iter2(Track::Wave, &SecondOutputTracks);
WaveTrack *track = (WaveTrack *) iter.First();
WaveTrack *track2 = (WaveTrack *) iter2.First();
while (track) {
@ -393,7 +393,6 @@ bool EffectEqualization48x::TrackCompare()
track = (WaveTrack *) iter.Next();
track2 = (WaveTrack *) iter2.Next();
}
delete SecondOutputTracks;
FreeBuffersWorkers();
mEffectEqualization->ReplaceProcessedTracks(!bBreakLoop);
return bBreakLoop;

View File

@ -290,11 +290,11 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun
WaveTrack * outputTrack = mFactory->NewWaveTrack(track->GetSampleFormat(),track->GetRate());
PaulStretch *stretch=new PaulStretch(amount,stretch_buf_size,track->GetRate());
PaulStretch stretch(amount,stretch_buf_size,track->GetRate());
sampleCount nget=stretch->get_nsamples_for_fill();
sampleCount nget=stretch.get_nsamples_for_fill();
int bufsize=stretch->poolsize;
int bufsize=stretch.poolsize;
float *buffer0=new float[bufsize];
float *bufferptr0=buffer0;
sampleCount outs=0;
@ -308,13 +308,13 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun
while (s<len){
track->Get((samplePtr)bufferptr0,floatSample,start+s,nget);
stretch->process(buffer0,nget);
stretch.process(buffer0,nget);
if (first_time) {
stretch->process(buffer0,0);
stretch.process(buffer0,0);
};
outs+=stretch->out_bufsize;
outs+=stretch.out_bufsize;
s+=nget;
if (first_time){//blend the the start of the selection
@ -322,7 +322,7 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun
first_time=false;
for (int i=0;i<fade_len;i++){
float fi=(float)i/(float)fade_len;
stretch->out_buf[i]=stretch->out_buf[i]*fi+(1.0-fi)*fade_track_smps[i];
stretch.out_buf[i]=stretch.out_buf[i]*fi+(1.0-fi)*fade_track_smps[i];
};
};
if (s>=len){//blend the end of the selection
@ -330,13 +330,13 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun
for (int i=0;i<fade_len;i++){
float fi=(float)i/(float)fade_len;
int i2=bufsize/2-1-i;
stretch->out_buf[i2]=stretch->out_buf[i2]*fi+(1.0-fi)*fade_track_smps[fade_len-1-i];
stretch.out_buf[i2]=stretch.out_buf[i2]*fi+(1.0-fi)*fade_track_smps[fade_len-1-i];
};
};
outputTrack->Append((samplePtr)stretch->out_buf,floatSample,stretch->out_bufsize);
outputTrack->Append((samplePtr)stretch.out_buf,floatSample,stretch.out_bufsize);
nget=stretch->get_nsamples();
nget=stretch.get_nsamples();
if (TrackProgress(count, (s / (double) len))) {
cancelled=true;
break;
@ -352,7 +352,6 @@ bool EffectPaulstretch::ProcessOne(WaveTrack *track,double t0,double t1,int coun
m_t1 = mT0 + outputTrack->GetEndTime();
}
delete stretch;
delete []buffer0;
delete outputTrack;

View File

@ -470,25 +470,24 @@ bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxStrin
wxString cmd;
cmd.Printf(wxT("\"%s\" %s \"%s;%s\""), cmdpath.c_str(), VSTCMDKEY, path.c_str(), effectID.c_str());
VSTSubProcess *proc = new VSTSubProcess();
VSTSubProcess proc;
try
{
int flags = wxEXEC_SYNC | wxEXEC_NODISABLE;
#if defined(__WXMSW__)
flags += wxEXEC_NOHIDE;
#endif
wxExecute(cmd, flags, proc);
wxExecute(cmd, flags, &proc);
}
catch (...)
{
wxLogMessage(_("VST plugin registration failed for %s\n"), path.c_str());
delete proc;
return false;
}
wxString output;
wxStringOutputStream ss(&output);
proc->GetInputStream()->Read(ss);
proc.GetInputStream()->Read(ss);
int keycount = 0;
bool haveBegin = false;
@ -519,7 +518,7 @@ bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxStrin
if (idCnt > 3)
{
progress = new wxProgressDialog(_("Scanning Shell VST"),
wxString::Format(_("Registering %d of %d: %-64.64s"), 0, idCnt, proc->GetName().c_str()),
wxString::Format(_("Registering %d of %d: %-64.64s"), 0, idCnt, proc.GetName().c_str()),
idCnt,
NULL,
wxPD_APP_MODAL |
@ -538,44 +537,44 @@ bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxStrin
break;
case kKeyName:
proc->mName = val;
proc.mName = val;
keycount++;
break;
case kKeyPath:
proc->mPath = val;
proc.mPath = val;
keycount++;
break;
case kKeyVendor:
proc->mVendor = val;
proc.mVendor = val;
keycount++;
break;
case kKeyVersion:
proc->mVersion = val;
proc.mVersion = val;
keycount++;
break;
case kKeyDescription:
proc->mDescription = val;
proc.mDescription = val;
keycount++;
break;
case kKeyEffectType:
long type;
val.ToLong(&type);
proc->mType = (EffectType) type;
proc.mType = (EffectType) type;
keycount++;
break;
case kKeyInteractive:
proc->mInteractive = val.IsSameAs(wxT("1"));
proc.mInteractive = val.IsSameAs(wxT("1"));
keycount++;
break;
case kKeyAutomatable:
proc->mAutomatable = val.IsSameAs(wxT("1"));
proc.mAutomatable = val.IsSameAs(wxT("1"));
keycount++;
break;
@ -593,13 +592,13 @@ bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxStrin
{
idNdx++;
cont = progress->Update(idNdx,
wxString::Format(_("Registering %d of %d: %-64.64s"), idNdx, idCnt, proc->GetName().c_str()));
wxString::Format(_("Registering %d of %d: %-64.64s"), idNdx, idCnt, proc.GetName().c_str()));
}
if (!skip && cont)
{
valid = true;
pm.RegisterPlugin(this, proc);
pm.RegisterPlugin(this, &proc);
}
}
break;
@ -610,8 +609,6 @@ bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxStrin
break;
}
}
delete proc;
}
if (progress)
@ -656,47 +653,42 @@ void VSTEffectsModule::DeleteInstance(IdentInterface *instance)
// Called from reinvokation of Audacity or DLL to check in a separate process
void VSTEffectsModule::Check(const wxChar *path)
{
VSTEffect *effect = new VSTEffect(path);
if (effect)
VSTEffect effect(path);
if (effect.SetHost(NULL))
{
if (effect->SetHost(NULL))
wxArrayInt effectIDs = effect.GetEffectIDs();
wxString out;
if (effectIDs.GetCount() > 0)
{
wxArrayInt effectIDs = effect->GetEffectIDs();
wxString out;
wxString subids;
if (effectIDs.GetCount() > 0)
for (size_t i = 0, cnt = effectIDs.GetCount(); i < cnt; i++)
{
wxString subids;
for (size_t i = 0, cnt = effectIDs.GetCount(); i < cnt; i++)
{
subids += wxString::Format(wxT("%d;"), effectIDs[i]);
}
out = wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeySubIDs, subids.RemoveLast().c_str());
}
else
{
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyBegin, wxEmptyString);
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyPath, effect->GetPath().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyName, effect->GetName().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyVendor, effect->GetVendor().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyVersion, effect->GetVersion().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyDescription, effect->GetDescription().c_str());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyEffectType, effect->GetType());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyInteractive, effect->IsInteractive());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyAutomatable, effect->SupportsAutomation());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyEnd, wxEmptyString);
subids += wxString::Format(wxT("%d;"), effectIDs[i]);
}
// We want to output info in one chunk to prevent output
// from the effect intermixing with the info
const wxCharBuffer buf = out.ToUTF8();
fwrite(buf, 1, strlen(buf), stdout);
fflush(stdout);
out = wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeySubIDs, subids.RemoveLast().c_str());
}
else
{
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyBegin, wxEmptyString);
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyPath, effect.GetPath().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyName, effect.GetName().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyVendor, effect.GetVendor().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyVersion, effect.GetVersion().c_str());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyDescription, effect.GetDescription().c_str());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyEffectType, effect.GetType());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyInteractive, effect.IsInteractive());
out += wxString::Format(wxT("%s%d=%d\n"), OUTPUTKEY, kKeyAutomatable, effect.SupportsAutomation());
out += wxString::Format(wxT("%s%d=%s\n"), OUTPUTKEY, kKeyEnd, wxEmptyString);
}
delete effect;
// We want to output info in one chunk to prevent output
// from the effect intermixing with the info
const wxCharBuffer buf = out.ToUTF8();
fwrite(buf, 1, strlen(buf), stdout);
fflush(stdout);
}
}

View File

@ -440,59 +440,59 @@ int ExportCL::Export(AudacityProject *project,
samplePtr mixed = NULL;
int updateResult = eProgressSuccess;
// Prepare the progress display
ProgressDialog *progress = new ProgressDialog(_("Export"),
selectionOnly ?
_("Exporting the selected audio using command-line encoder") :
_("Exporting the entire project using command-line encoder"));
{
// Prepare the progress display
ProgressDialog progress(_("Export"),
selectionOnly ?
_("Exporting the selected audio using command-line encoder") :
_("Exporting the entire project using command-line encoder"));
// Start piping the mixed data to the command
while (updateResult == eProgressSuccess && process.IsActive() && os->IsOk()) {
// Capture any stdout and stderr from the command
Drain(process.GetInputStream(), &output);
Drain(process.GetErrorStream(), &output);
// Start piping the mixed data to the command
while (updateResult == eProgressSuccess && process.IsActive() && os->IsOk()) {
// Capture any stdout and stderr from the command
Drain(process.GetInputStream(), &output);
Drain(process.GetErrorStream(), &output);
// Need to mix another block
if (numBytes == 0) {
sampleCount numSamples = mixer->Process(maxBlockLen);
if (numSamples == 0) {
break;
}
// Need to mix another block
if (numBytes == 0) {
sampleCount numSamples = mixer->Process(maxBlockLen);
if (numSamples == 0) {
break;
}
mixed = mixer->GetBuffer();
numBytes = numSamples * channels;
mixed = mixer->GetBuffer();
numBytes = numSamples * channels;
// Byte-swapping is neccesary on big-endian machines, since
// WAV files are little-endian
// Byte-swapping is neccesary on big-endian machines, since
// WAV files are little-endian
#if wxBYTE_ORDER == wxBIG_ENDIAN
wxUint16 *buffer = (wxUint16 *) mixed;
for (int i = 0; i < numBytes; i++) {
buffer[i] = wxUINT16_SWAP_ON_BE(buffer[i]);
}
wxUint16 *buffer = (wxUint16 *) mixed;
for (int i = 0; i < numBytes; i++) {
buffer[i] = wxUINT16_SWAP_ON_BE(buffer[i]);
}
#endif
numBytes *= SAMPLE_SIZE(int16Sample);
}
// Don't write too much at once...pipes may not be able to handle it
size_t bytes = wxMin(numBytes, 4096);
numBytes -= bytes;
while (bytes > 0) {
os->Write(mixed, bytes);
if (!os->IsOk()) {
break;
numBytes *= SAMPLE_SIZE(int16Sample);
}
bytes -= os->LastWrite();
mixed += os->LastWrite();
// Don't write too much at once...pipes may not be able to handle it
size_t bytes = wxMin(numBytes, 4096);
numBytes -= bytes;
while (bytes > 0) {
os->Write(mixed, bytes);
if (!os->IsOk()) {
break;
}
bytes -= os->LastWrite();
mixed += os->LastWrite();
}
// Update the progress display
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
// Update the progress display
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
// Done with the progress display
}
// Done with the progress display
delete progress;
// Should make the process die
process.CloseOutput();

View File

@ -831,30 +831,29 @@ int ExportFFmpeg::Export(AudacityProject *project,
t0, t1,
channels, pcmBufferSize, true,
mSampleRate, int16Sample, true, mixerSpec);
delete [] waveTracks;
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting selected audio as %s"), ExportFFmpegOptions::fmts[mSubFormat].description) :
wxString::Format(_("Exporting entire file as %s"), ExportFFmpegOptions::fmts[mSubFormat].description));
delete[] waveTracks;
int updateResult = eProgressSuccess;
{
ProgressDialog progress(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting selected audio as %s"), ExportFFmpegOptions::fmts[mSubFormat].description) :
wxString::Format(_("Exporting entire file as %s"), ExportFFmpegOptions::fmts[mSubFormat].description));
while(updateResult == eProgressSuccess) {
sampleCount pcmNumSamples = mixer->Process(pcmBufferSize);
while (updateResult == eProgressSuccess) {
sampleCount pcmNumSamples = mixer->Process(pcmBufferSize);
if (pcmNumSamples == 0)
break;
if (pcmNumSamples == 0)
break;
short *pcmBuffer = (short *)mixer->GetBuffer();
short *pcmBuffer = (short *)mixer->GetBuffer();
EncodeAudioFrame(pcmBuffer,(pcmNumSamples)*sizeof(int16_t)*mChannels);
EncodeAudioFrame(pcmBuffer, (pcmNumSamples)*sizeof(int16_t)*mChannels);
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
}
delete progress;
delete mixer;
Finalize();

View File

@ -325,38 +325,38 @@ int ExportFLAC::Export(AudacityProject *project,
tmpsmplbuf[i] = (FLAC__int32 *) calloc(SAMPLES_PER_RUN, sizeof(FLAC__int32));
}
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
{
ProgressDialog progress(wxFileName(fName).GetName(),
selectionOnly ?
_("Exporting the selected audio as FLAC") :
_("Exporting the entire project as FLAC"));
while (updateResult == eProgressSuccess) {
sampleCount samplesThisRun = mixer->Process(SAMPLES_PER_RUN);
if (samplesThisRun == 0) { //stop encoding
break;
}
else {
for (i = 0; i < numChannels; i++) {
samplePtr mixed = mixer->GetBuffer(i);
if (format == int24Sample) {
for (j = 0; j < samplesThisRun; j++) {
tmpsmplbuf[i][j] = ((int *) mixed)[j];
}
}
else {
for (j = 0; j < samplesThisRun; j++) {
tmpsmplbuf[i][j] = ((short *) mixed)[j];
}
}
while (updateResult == eProgressSuccess) {
sampleCount samplesThisRun = mixer->Process(SAMPLES_PER_RUN);
if (samplesThisRun == 0) { //stop encoding
break;
}
encoder.process(tmpsmplbuf, samplesThisRun);
else {
for (i = 0; i < numChannels; i++) {
samplePtr mixed = mixer->GetBuffer(i);
if (format == int24Sample) {
for (j = 0; j < samplesThisRun; j++) {
tmpsmplbuf[i][j] = ((int *)mixed)[j];
}
}
else {
for (j = 0; j < samplesThisRun; j++) {
tmpsmplbuf[i][j] = ((short *)mixed)[j];
}
}
}
encoder.process(tmpsmplbuf, samplesThisRun);
}
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
f.Detach(); // libflac closes the file
encoder.finish();
}
f.Detach(); // libflac closes the file
encoder.finish();
delete progress;
for (i = 0; i < numChannels; i++) {
free(tmpsmplbuf[i]);

View File

@ -272,36 +272,36 @@ int ExportMP2::Export(AudacityProject *project,
t0, t1,
stereo? 2: 1, pcmBufferSize, true,
rate, int16Sample, true, mixerSpec);
delete [] waveTracks;
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting selected audio at %ld kbps"), bitrate) :
wxString::Format(_("Exporting entire file at %ld kbps"), bitrate));
delete[] waveTracks;
int updateResult = eProgressSuccess;
while(updateResult == eProgressSuccess) {
sampleCount pcmNumSamples = mixer->Process(pcmBufferSize);
{
ProgressDialog progress(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting selected audio at %ld kbps"), bitrate) :
wxString::Format(_("Exporting entire file at %ld kbps"), bitrate));
if (pcmNumSamples == 0)
break;
while (updateResult == eProgressSuccess) {
sampleCount pcmNumSamples = mixer->Process(pcmBufferSize);
short *pcmBuffer = (short *)mixer->GetBuffer();
if (pcmNumSamples == 0)
break;
int mp2BufferNumBytes = twolame_encode_buffer_interleaved(
short *pcmBuffer = (short *)mixer->GetBuffer();
int mp2BufferNumBytes = twolame_encode_buffer_interleaved(
encodeOptions,
pcmBuffer,
pcmNumSamples,
mp2Buffer,
mp2BufferSize);
outFile.Write(mp2Buffer, mp2BufferNumBytes);
outFile.Write(mp2Buffer, mp2BufferNumBytes);
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
}
delete progress;
delete mixer;
int mp2BufferNumBytes = twolame_encode_flush(

View File

@ -1792,48 +1792,48 @@ int ExportMP3::Export(AudacityProject *project,
brate);
}
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(), title);
{
ProgressDialog progress(wxFileName(fName).GetName(), title);
while (updateResult == eProgressSuccess) {
sampleCount blockLen = mixer->Process(inSamples);
while (updateResult == eProgressSuccess) {
sampleCount blockLen = mixer->Process(inSamples);
if (blockLen == 0) {
break;
}
if (blockLen == 0) {
break;
}
short *mixed = (short *)mixer->GetBuffer();
short *mixed = (short *)mixer->GetBuffer();
if (blockLen < inSamples) {
if (channels > 1) {
bytes = exporter.EncodeRemainder(mixed, blockLen , buffer);
if (blockLen < inSamples) {
if (channels > 1) {
bytes = exporter.EncodeRemainder(mixed, blockLen, buffer);
}
else {
bytes = exporter.EncodeRemainderMono(mixed, blockLen, buffer);
}
}
else {
bytes = exporter.EncodeRemainderMono(mixed, blockLen , buffer);
if (channels > 1) {
bytes = exporter.EncodeBuffer(mixed, buffer);
}
else {
bytes = exporter.EncodeBufferMono(mixed, buffer);
}
}
}
else {
if (channels > 1) {
bytes = exporter.EncodeBuffer(mixed, buffer);
}
else {
bytes = exporter.EncodeBufferMono(mixed, buffer);
if (bytes < 0) {
wxString msg;
msg.Printf(_("Error %ld returned from MP3 encoder"), bytes);
wxMessageBox(msg);
break;
}
outFile.Write(buffer, bytes);
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
if (bytes < 0) {
wxString msg;
msg.Printf(_("Error %ld returned from MP3 encoder"), bytes);
wxMessageBox(msg);
break;
}
outFile.Write(buffer, bytes);
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
}
delete progress;
delete mixer;
bytes = exporter.FinishStream(buffer);

View File

@ -253,74 +253,74 @@ int ExportOGG::Export(AudacityProject *project,
t0, t1,
numChannels, SAMPLES_PER_RUN, false,
rate, floatSample, true, mixerSpec);
delete [] waveTracks;
delete[] waveTracks;
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
selectionOnly ?
_("Exporting the selected audio as Ogg Vorbis") :
_("Exporting the entire project as Ogg Vorbis"));
{
ProgressDialog progress(wxFileName(fName).GetName(),
selectionOnly ?
_("Exporting the selected audio as Ogg Vorbis") :
_("Exporting the entire project as Ogg Vorbis"));
while (updateResult == eProgressSuccess && !eos) {
float **vorbis_buffer = vorbis_analysis_buffer(&dsp, SAMPLES_PER_RUN);
sampleCount samplesThisRun = mixer->Process(SAMPLES_PER_RUN);
while (updateResult == eProgressSuccess && !eos) {
float **vorbis_buffer = vorbis_analysis_buffer(&dsp, SAMPLES_PER_RUN);
sampleCount samplesThisRun = mixer->Process(SAMPLES_PER_RUN);
if (samplesThisRun == 0) {
// Tell the library that we wrote 0 bytes - signalling the end.
vorbis_analysis_wrote(&dsp, 0);
}
else {
if (samplesThisRun == 0) {
// Tell the library that we wrote 0 bytes - signalling the end.
vorbis_analysis_wrote(&dsp, 0);
}
else {
for (int i = 0; i < numChannels; i++) {
float *temp = (float *)mixer->GetBuffer(i);
memcpy(vorbis_buffer[i], temp, sizeof(float)*SAMPLES_PER_RUN);
for (int i = 0; i < numChannels; i++) {
float *temp = (float *)mixer->GetBuffer(i);
memcpy(vorbis_buffer[i], temp, sizeof(float)*SAMPLES_PER_RUN);
}
// tell the encoder how many samples we have
vorbis_analysis_wrote(&dsp, samplesThisRun);
}
// tell the encoder how many samples we have
vorbis_analysis_wrote(&dsp, samplesThisRun);
}
// I don't understand what this call does, so here is the comment
// from the example, verbatim:
//
// vorbis does some data preanalysis, then divvies up blocks
// for more involved (potentially parallel) processing. Get
// a single block for encoding now
while (vorbis_analysis_blockout(&dsp, &block) == 1) {
// I don't understand what this call does, so here is the comment
// from the example, verbatim:
//
// vorbis does some data preanalysis, then divvies up blocks
// for more involved (potentially parallel) processing. Get
// a single block for encoding now
while (vorbis_analysis_blockout(&dsp, &block) == 1) {
// analysis, assume we want to use bitrate management
vorbis_analysis(&block, NULL);
vorbis_bitrate_addblock(&block);
// analysis, assume we want to use bitrate management
vorbis_analysis(&block, NULL);
vorbis_bitrate_addblock(&block);
while (vorbis_bitrate_flushpacket(&dsp, &packet)) {
while (vorbis_bitrate_flushpacket(&dsp, &packet)) {
// add the packet to the bitstream
ogg_stream_packetin(&stream, &packet);
// add the packet to the bitstream
ogg_stream_packetin(&stream, &packet);
// From vorbis-tools-1.0/oggenc/encode.c:
// If we've gone over a page boundary, we can do actual output,
// so do so (for however many pages are available).
// From vorbis-tools-1.0/oggenc/encode.c:
// If we've gone over a page boundary, we can do actual output,
// so do so (for however many pages are available).
while (!eos) {
int result = ogg_stream_pageout(&stream, &page);
if (!result) {
break;
}
while (!eos) {
int result = ogg_stream_pageout(&stream, &page);
if (!result) {
break;
}
outFile.Write(page.header, page.header_len);
outFile.Write(page.body, page.body_len);
outFile.Write(page.header, page.header_len);
outFile.Write(page.body, page.body_len);
if (ogg_page_eos(&page)) {
eos = 1;
if (ogg_page_eos(&page)) {
eos = 1;
}
}
}
}
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
}
delete progress;;
delete mixer;
ogg_stream_clear(&stream);

View File

@ -493,47 +493,47 @@ int ExportPCM::Export(AudacityProject *project,
info.channels, maxBlockLen, true,
rate, format, true, mixerSpec);
ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting the selected audio as %s"),
formatStr.c_str()) :
wxString::Format(_("Exporting the entire project as %s"),
formatStr.c_str()));
{
ProgressDialog progress(wxFileName(fName).GetName(),
selectionOnly ?
wxString::Format(_("Exporting the selected audio as %s"),
formatStr.c_str()) :
wxString::Format(_("Exporting the entire project as %s"),
formatStr.c_str()));
while(updateResult == eProgressSuccess) {
sampleCount samplesWritten;
sampleCount numSamples = mixer->Process(maxBlockLen);
while (updateResult == eProgressSuccess) {
sampleCount samplesWritten;
sampleCount numSamples = mixer->Process(maxBlockLen);
if (numSamples == 0)
break;
if (numSamples == 0)
break;
samplePtr mixed = mixer->GetBuffer();
samplePtr mixed = mixer->GetBuffer();
ODManager::LockLibSndFileMutex();
if (format == int16Sample)
samplesWritten = sf_writef_short(sf, (short *)mixed, numSamples);
else
samplesWritten = sf_writef_float(sf, (float *)mixed, numSamples);
ODManager::UnlockLibSndFileMutex();
ODManager::LockLibSndFileMutex();
if (format == int16Sample)
samplesWritten = sf_writef_short(sf, (short *)mixed, numSamples);
else
samplesWritten = sf_writef_float(sf, (float *)mixed, numSamples);
ODManager::UnlockLibSndFileMutex();
if (samplesWritten != numSamples) {
char buffer2[1000];
sf_error_str(sf, buffer2, 1000);
wxMessageBox(wxString::Format(
/* i18n-hint: %s will be the error message from libsndfile, which
* is usually something unhelpful (and untranslated) like "system
* error" */
_("Error while writing %s file (disk full?).\nLibsndfile says \"%s\""),
formatStr.c_str(),
wxString::FromAscii(buffer2).c_str()));
break;
if (samplesWritten != numSamples) {
char buffer2[1000];
sf_error_str(sf, buffer2, 1000);
wxMessageBox(wxString::Format(
/* i18n-hint: %s will be the error message from libsndfile, which
* is usually something unhelpful (and untranslated) like "system
* error" */
_("Error while writing %s file (disk full?).\nLibsndfile says \"%s\""),
formatStr.c_str(),
wxString::FromAscii(buffer2).c_str()));
break;
}
updateResult = progress.Update(mixer->MixGetCurrentTime() - t0, t1 - t0);
}
updateResult = progress->Update(mixer->MixGetCurrentTime()-t0, t1-t0);
}
delete progress;
delete mixer;
delete[] waveTracks;

View File

@ -310,15 +310,12 @@ ImportFileHandle *FFmpegImportPlugin::Open(wxString filename)
if (!FFmpegLibsInst->ValidLibsLoaded())
{
int dontShowDlg;
FFmpegNotFoundDialog *dlg;
gPrefs->Read(wxT("/FFmpeg/NotFoundDontShow"),&dontShowDlg,0);
if (dontShowDlg == 0 && newsession)
{
gPrefs->Write(wxT("/NewImportingSession"), false);
gPrefs->Flush();
dlg = new FFmpegNotFoundDialog(NULL);
dlg->ShowModal();
delete dlg;
FFmpegNotFoundDialog{ nullptr }.ShowModal();
}
}
}

View File

@ -832,7 +832,8 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
// If SHIFT key was down, the user wants append to tracks
int recordingChannels = 0;
TrackList *tracksCopy = NULL;
TrackList tracksCopy(true);
bool tracksCopied = false;
bool shifted = mRecord->WasShiftDown();
if (shifted) {
bool sel = false;
@ -872,12 +873,12 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
playbackTracks.Remove(wt);
t1 = wt->GetEndTime();
if (t1 < t0) {
if (!tracksCopy) {
tracksCopy = new TrackList();
if (!tracksCopied) {
tracksCopied = true;
TrackListIterator iter(t);
Track *trk = iter.First();
while (trk) {
tracksCopy->Add(trk->Duplicate());
tracksCopy.Add(trk->Duplicate());
trk = iter.Next();
}
}
@ -1000,17 +1001,13 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
if (success) {
p->SetAudioIOToken(token);
mBusyProject = p;
if (shifted && tracksCopy) {
tracksCopy->Clear(true);
delete tracksCopy;
}
}
else {
if (shifted) {
// Restore the tracks to remove any inserted silence
if (tracksCopy) {
if (tracksCopied) {
t->Clear(true);
TrackListIterator iter(tracksCopy);
TrackListIterator iter(&tracksCopy);
Track *trk = iter.First();
while (trk)
{
@ -1018,7 +1015,6 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt)
trk = iter.RemoveCurrent();
t->Add(tmp);
}
delete tracksCopy;
}
}
else {

View File

@ -156,9 +156,9 @@ void HelpSystem::ShowHtmlText(wxWindow *pParent,
// If this section (providing an icon) causes compilation errors on linux, comment it out for now.
// it will just mean that the icon is missing. Works OK on Windows.
#ifdef __WXMSW__
wxIcon ic(wxICON(AudacityLogo));
wxIcon ic{ wxICON(AudacityLogo) };
#else
wxIcon ic;
wxIcon ic{};
ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
#endif
pWnd->SetIcon( ic );

View File

@ -679,18 +679,18 @@ void Meter::OnMouse(wxMouseEvent &evt)
if (evt.RightDown() ||
(evt.ButtonDown() && mIconRect.Contains(evt.m_x, evt.m_y)))
{
wxMenu *menu = new wxMenu();
wxMenu menu;
// Note: these should be kept in the same order as the enum
if (mIsInput) {
wxMenuItem *mi;
if (mMonitoring)
mi = menu->Append(OnMonitorID, _("Stop Monitoring"));
mi = menu.Append(OnMonitorID, _("Stop Monitoring"));
else
mi = menu->Append(OnMonitorID, _("Start Monitoring"));
mi = menu.Append(OnMonitorID, _("Start Monitoring"));
mi->Enable(!mActive || mMonitoring);
}
menu->Append(OnPreferencesID, _("Preferences..."));
menu.Append(OnPreferencesID, _("Preferences..."));
if (evt.RightDown()) {
ShowMenu(evt.GetPosition());
@ -698,8 +698,6 @@ void Meter::OnMouse(wxMouseEvent &evt)
else {
ShowMenu(wxPoint(mIconRect.x + 1, mIconRect.y + mIconRect.height + 1));
}
delete menu;
}
else if (evt.LeftDown()) {
if (mIsInput) {
@ -1863,22 +1861,22 @@ void Meter::RestoreState(void *state)
void Meter::ShowMenu(const wxPoint & pos)
{
wxMenu *menu = new wxMenu();
wxMenu menu;
// Note: these should be kept in the same order as the enum
if (mIsInput) {
wxMenuItem *mi;
if (mMonitoring)
mi = menu->Append(OnMonitorID, _("Stop Monitoring"));
mi = menu.Append(OnMonitorID, _("Stop Monitoring"));
else
mi = menu->Append(OnMonitorID, _("Start Monitoring"));
mi = menu.Append(OnMonitorID, _("Start Monitoring"));
mi->Enable(!mActive || mMonitoring);
}
menu->Append(OnPreferencesID, _("Preferences..."));
menu.Append(OnPreferencesID, _("Preferences..."));
mAccSilent = true; // temporarily make screen readers say (close to) nothing on focus events
PopupMenu(menu, pos);
PopupMenu(&menu, pos);
/* if stop/start monitoring was chosen in the menu, then by this point
OnMonitoring has been called and variables which affect the accessibility
@ -1891,8 +1889,6 @@ void Meter::ShowMenu(const wxPoint & pos)
wxOBJID_CLIENT,
wxACC_SELF);
#endif
delete menu;
}
void Meter::OnMonitor(wxCommandEvent & WXUNUSED(event))

View File

@ -2237,42 +2237,43 @@ void AdornedRulerPanel::OnCaptureLost(wxMouseCaptureLostEvent & WXUNUSED(evt))
void AdornedRulerPanel::ShowMenu(const wxPoint & pos)
{
wxMenu *rulerMenu = new wxMenu();
{
wxMenu rulerMenu;
if (mQuickPlayEnabled)
rulerMenu->Append(OnToggleQuickPlayID, _("Disable Quick-Play"));
else
rulerMenu->Append(OnToggleQuickPlayID, _("Enable Quick-Play"));
if (mQuickPlayEnabled)
rulerMenu.Append(OnToggleQuickPlayID, _("Disable Quick-Play"));
else
rulerMenu.Append(OnToggleQuickPlayID, _("Enable Quick-Play"));
wxMenuItem *dragitem;
if (mPlayRegionDragsSelection && !mProject->IsPlayRegionLocked())
dragitem = rulerMenu->Append(OnSyncQuickPlaySelID, _("Disable dragging selection"));
else
dragitem = rulerMenu->Append(OnSyncQuickPlaySelID, _("Enable dragging selection"));
dragitem->Enable(mQuickPlayEnabled && !mProject->IsPlayRegionLocked());
wxMenuItem *dragitem;
if (mPlayRegionDragsSelection && !mProject->IsPlayRegionLocked())
dragitem = rulerMenu.Append(OnSyncQuickPlaySelID, _("Disable dragging selection"));
else
dragitem = rulerMenu.Append(OnSyncQuickPlaySelID, _("Enable dragging selection"));
dragitem->Enable(mQuickPlayEnabled && !mProject->IsPlayRegionLocked());
#if wxUSE_TOOLTIPS
if (mTimelineToolTip)
rulerMenu->Append(OnTimelineToolTipID, _("Disable Timeline Tooltips"));
else
rulerMenu->Append(OnTimelineToolTipID, _("Enable Timeline Tooltips"));
if (mTimelineToolTip)
rulerMenu.Append(OnTimelineToolTipID, _("Disable Timeline Tooltips"));
else
rulerMenu.Append(OnTimelineToolTipID, _("Enable Timeline Tooltips"));
#endif
if (mViewInfo->bUpdateTrackIndicator)
rulerMenu->Append(OnAutoScrollID, _("Do not scroll while playing"));
else
rulerMenu->Append(OnAutoScrollID, _("Update display while playing"));
if (mViewInfo->bUpdateTrackIndicator)
rulerMenu.Append(OnAutoScrollID, _("Do not scroll while playing"));
else
rulerMenu.Append(OnAutoScrollID, _("Update display while playing"));
wxMenuItem *prlitem;
if (!mProject->IsPlayRegionLocked())
prlitem = rulerMenu->Append(OnLockPlayRegionID, _("Lock Play Region"));
else
prlitem = rulerMenu->Append(OnLockPlayRegionID, _("Unlock Play Region"));
prlitem->Enable(mProject->IsPlayRegionLocked() || (mPlayRegionStart != mPlayRegionEnd));
wxMenuItem *prlitem;
if (!mProject->IsPlayRegionLocked())
prlitem = rulerMenu.Append(OnLockPlayRegionID, _("Lock Play Region"));
else
prlitem = rulerMenu.Append(OnLockPlayRegionID, _("Unlock Play Region"));
prlitem->Enable(mProject->IsPlayRegionLocked() || (mPlayRegionStart != mPlayRegionEnd));
PopupMenu(rulerMenu, pos);
PopupMenu(&rulerMenu, pos);
}
delete rulerMenu;
// dismiss and clear Quick-Play indicator
mQuickPlayInd = false;
DrawQuickPlayIndicator(NULL);