mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-02 16:49:41 +02:00
bug 26 followup - warn of missing alias on variety of instances (export/import/effect/mix,) in addition to first time the read fails.\nIn addition make sure there is only one warning on the screen at a time, bringing the old one to the foreground (although for things like export/effect there will be a progress bar in front of it, the missing files dialog will be above the project window when it finishes)
This commit is contained in:
parent
686f3796ae
commit
dc12d8a8f4
@ -479,14 +479,15 @@ void DeinitAudioIO()
|
||||
|
||||
void AudioIO::MarkAliasedFilesMissingWarning()
|
||||
{
|
||||
// only show the warning when we are playing or recording
|
||||
if (IsStreamActive()) {
|
||||
m_aliasMissingWarning = true;
|
||||
}
|
||||
m_aliasMissingWarning = true;
|
||||
}
|
||||
|
||||
void AudioIO::SetMissingAliasedFileWarningShouldShow(bool b)
|
||||
{
|
||||
// Note that this is can be called by both the main thread and other threads.
|
||||
// I don't believe we need a mutex because we are checking zero vs non-zero,
|
||||
// and the setting from other threads will always be non-zero (true), and the
|
||||
// setting from the main thread is always false.
|
||||
m_aliasMissingWarningShouldShow = b;
|
||||
// reset the warnings as they were probably marked by a previous run
|
||||
if (m_aliasMissingWarningShouldShow) {
|
||||
@ -501,6 +502,17 @@ bool AudioIO::ShouldShowMissingAliasedFileWarning()
|
||||
return ret;
|
||||
}
|
||||
|
||||
void AudioIO::SetMissingAliasFileDialog(wxDialog *dialog)
|
||||
{
|
||||
m_aliasMissingWarningDialog = dialog;
|
||||
}
|
||||
|
||||
wxDialog *AudioIO::GetMissingAliasFileDialog()
|
||||
{
|
||||
return m_aliasMissingWarningDialog;
|
||||
}
|
||||
|
||||
|
||||
wxString DeviceName(const PaDeviceInfo* info)
|
||||
{
|
||||
wxString infoName(info->name, wxConvLocal);
|
||||
@ -534,8 +546,9 @@ AudioIO::AudioIO()
|
||||
mAudioThreadFillBuffersLoopActive = false;
|
||||
mPortStreamV19 = NULL;
|
||||
|
||||
m_aliasMissingWarningShouldShow = false;
|
||||
m_aliasMissingWarningShouldShow = true;
|
||||
m_aliasMissingWarning = false;
|
||||
m_aliasMissingWarningDialog = NULL;
|
||||
|
||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||
mMidiStream = NULL;
|
||||
|
@ -43,6 +43,7 @@ class TimeTrack;
|
||||
class AudioThread;
|
||||
class Meter;
|
||||
class TimeTrack;
|
||||
class wxDialog;
|
||||
|
||||
extern AUDACITY_DLL_API AudioIO *gAudioIO;
|
||||
|
||||
@ -320,6 +321,15 @@ class AUDACITY_DLL_API AudioIO {
|
||||
/** \brief Returns true if the user should be notified of missing alias warnings
|
||||
*/
|
||||
bool ShouldShowMissingAliasedFileWarning();
|
||||
|
||||
/** \brief Sets the wxDialog that is being displayed
|
||||
* Used by the custom dialog warning constructor and destructor
|
||||
*/
|
||||
void SetMissingAliasFileDialog(wxDialog *dialog);
|
||||
|
||||
/** \brief returns a pointer to the wxDialog if it is displayed, NULL otherwise.
|
||||
*/
|
||||
wxDialog *GetMissingAliasFileDialog();
|
||||
|
||||
/** \brief Function to automatically set an acceptable volume
|
||||
*
|
||||
@ -527,6 +537,7 @@ private:
|
||||
|
||||
bool m_aliasMissingWarningShouldShow;
|
||||
bool m_aliasMissingWarning;
|
||||
wxDialog *m_aliasMissingWarningDialog;
|
||||
|
||||
#ifdef EXPERIMENTAL_MIDI_OUT
|
||||
volatile bool mMidiThreadFillBuffersLoopRunning;
|
||||
|
@ -2665,6 +2665,9 @@ bool AudacityProject::OnEffect(int type,
|
||||
wxString params,
|
||||
bool saveState)
|
||||
{
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
|
||||
TrackListIterator iter(mTracks);
|
||||
Track *t = iter.First();
|
||||
WaveTrack *newTrack = NULL;
|
||||
@ -3024,6 +3027,8 @@ void AudacityProject::OnExport()
|
||||
{
|
||||
Exporter e;
|
||||
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
e.Process(this, false, 0.0, mTracks->GetEndTime());
|
||||
}
|
||||
|
||||
@ -3031,6 +3036,8 @@ void AudacityProject::OnExportSelection()
|
||||
{
|
||||
Exporter e;
|
||||
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
e.Process(this, true, mViewInfo.sel0, mViewInfo.sel1);
|
||||
}
|
||||
|
||||
@ -3038,6 +3045,8 @@ void AudacityProject::OnExportMultiple()
|
||||
{
|
||||
ExportMultiple em(this);
|
||||
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
em.ShowModal();
|
||||
}
|
||||
|
||||
@ -4603,6 +4612,11 @@ void AudacityProject::OnSimplifiedView()
|
||||
|
||||
void AudacityProject::OnImport()
|
||||
{
|
||||
// An import trigger for the alias missing dialog might not be intuitive, but
|
||||
// this serves to track the file if the users zooms in and such.
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
|
||||
wxArrayString selectedFiles = ShowOpenDialog(wxT(""));
|
||||
if (selectedFiles.GetCount() == 0) {
|
||||
gPrefs->Write(wxT("/LastOpenType"),wxT(""));
|
||||
@ -4748,6 +4762,9 @@ void AudacityProject::HandleMixAndRender(bool toNewTrack)
|
||||
WaveTrack *newLeft = NULL;
|
||||
WaveTrack *newRight = NULL;
|
||||
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
|
||||
if (::MixAndRender(mTracks, mTrackFactory, mRate, mDefaultFormat, 0.0, 0.0,
|
||||
&newLeft, &newRight)) {
|
||||
|
||||
|
@ -760,6 +760,9 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
mStatusBar = CreateStatusBar(2);
|
||||
mStatusBar->SetStatusWidths(2, widths);
|
||||
|
||||
if (gAudioIO)
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(true);
|
||||
|
||||
// MM: DirManager is created dynamically, freed on demand via ref-counting
|
||||
// MM: We don't need to Ref() here because it start with refcount=1
|
||||
mDirManager = new DirManager();
|
||||
@ -3905,16 +3908,22 @@ void AudacityProject::OnTimer(wxTimerEvent& event)
|
||||
|
||||
// Check if a warning for missing aliased files should be displayed
|
||||
if (gAudioIO->ShouldShowMissingAliasedFileWarning()) {
|
||||
wxString errorMessage = _(
|
||||
if (gAudioIO->GetMissingAliasFileDialog()) {
|
||||
// if it is already shown, just bring it to the front instead of
|
||||
// creating a new one.
|
||||
gAudioIO->GetMissingAliasFileDialog()->Raise();
|
||||
} else {
|
||||
wxString errorMessage = _(
|
||||
"One or more external audio files could not be found.\n\
|
||||
It is possible they were moved, deleted, or the drive they \
|
||||
were on was unmounted.\n\
|
||||
Silence is being substituted for the affected audio.\n\
|
||||
Choose File > Check Dependencies to view the \
|
||||
original location of the missing files.");
|
||||
ShowModelessErrorDialog(this, _("Files Missing"),
|
||||
errorMessage, wxT(""), true);
|
||||
// Only show this warning once per playback.
|
||||
ShowAliasMissingDialog(this, _("Files Missing"),
|
||||
errorMessage, wxT(""), true);
|
||||
// Only show this warning once per playback.
|
||||
}
|
||||
gAudioIO->SetMissingAliasedFileWarningShouldShow(false);
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,9 @@ Gives an Error message with an option for help.
|
||||
#include "../Internat.h"
|
||||
#include "../Project.h"
|
||||
#include "../Prefs.h"
|
||||
#include "../AudioIO.h"
|
||||
|
||||
|
||||
|
||||
class ErrorDialog : public wxDialog
|
||||
{
|
||||
@ -46,6 +49,8 @@ class ErrorDialog : public wxDialog
|
||||
const wxString & helpURL,
|
||||
const bool Close = true, const bool modal = true);
|
||||
|
||||
virtual ~ErrorDialog(){}
|
||||
|
||||
private:
|
||||
wxString dhelpURL;
|
||||
bool dClose;
|
||||
@ -57,11 +62,39 @@ private:
|
||||
|
||||
};
|
||||
|
||||
// special case for alias missing dialog because we keep track of if it exists.
|
||||
class AliasedFileMissingDialog : public ErrorDialog
|
||||
{
|
||||
public:
|
||||
AliasedFileMissingDialog(wxWindow *parent,
|
||||
const wxString & dlogTitle,
|
||||
const wxString & message,
|
||||
const wxString & helpURL,
|
||||
const bool Close = true, const bool modal = true);
|
||||
virtual ~AliasedFileMissingDialog();
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(ErrorDialog, wxDialog)
|
||||
EVT_BUTTON( wxID_OK, ErrorDialog::OnOk)
|
||||
EVT_BUTTON( wxID_HELP, ErrorDialog::OnHelp)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
AliasedFileMissingDialog::AliasedFileMissingDialog(wxWindow *parent,
|
||||
const wxString & dlogTitle,
|
||||
const wxString & message,
|
||||
const wxString & helpURL,
|
||||
const bool Close, const bool modal):
|
||||
ErrorDialog(parent, dlogTitle, message, helpURL, Close, modal)
|
||||
{
|
||||
gAudioIO->SetMissingAliasFileDialog(this);
|
||||
}
|
||||
|
||||
AliasedFileMissingDialog::~AliasedFileMissingDialog()
|
||||
{
|
||||
gAudioIO->SetMissingAliasFileDialog(NULL);
|
||||
}
|
||||
|
||||
ErrorDialog::ErrorDialog(
|
||||
wxWindow *parent,
|
||||
const wxString & dlogTitle,
|
||||
@ -272,6 +305,27 @@ void ShowModelessErrorDialog(wxWindow *parent,
|
||||
dlog->Show();
|
||||
}
|
||||
|
||||
void ShowAliasMissingDialog(wxWindow *parent,
|
||||
const wxString &dlogTitle,
|
||||
const wxString &message,
|
||||
const wxString &helpURL,
|
||||
const bool Close)
|
||||
{
|
||||
ErrorDialog *dlog = new AliasedFileMissingDialog(parent, dlogTitle, message, helpURL, Close, false);
|
||||
// Don't center because in many cases (effect, export, etc) there will be a progress bar in the center that blocks this.
|
||||
// instead put it just above or on the top of the project.
|
||||
wxPoint point;
|
||||
point.x = 0;
|
||||
|
||||
point.y = parent ? parent->GetPosition().y - 200 : 100;
|
||||
|
||||
if (point.y < 100)
|
||||
point.y = 100;
|
||||
dlog->SetPosition(point);
|
||||
dlog->CentreOnParent(wxHORIZONTAL);
|
||||
|
||||
dlog->Show();
|
||||
}
|
||||
|
||||
/// Mostly we use this so that we have the code for resizability
|
||||
/// in one place. Other considerations like screen readers are also
|
||||
|
@ -30,6 +30,13 @@ void ShowModelessErrorDialog(wxWindow *parent,
|
||||
const wxString &helpURL,
|
||||
bool Close = true);
|
||||
|
||||
/// Displays a custom modeless error dialog for aliased file errors
|
||||
void ShowAliasMissingDialog(wxWindow *parent,
|
||||
const wxString &dlogTitle,
|
||||
const wxString &message,
|
||||
const wxString &helpURL,
|
||||
const bool Close = true);
|
||||
|
||||
/// Displays cutable information in a text ctrl, with an OK button.
|
||||
void ShowInfoDialog( wxWindow *parent,
|
||||
const wxString &dlogTitle,
|
||||
|
Loading…
x
Reference in New Issue
Block a user