2010-01-23 19:44:49 +00:00
|
|
|
/**********************************************************************
|
|
|
|
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
|
|
|
|
Export.h
|
|
|
|
|
|
|
|
Dominic Mazzoni
|
|
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
|
#ifndef __AUDACITY_EXPORT__
|
|
|
|
#define __AUDACITY_EXPORT__
|
|
|
|
|
2019-07-29 19:43:41 +00:00
|
|
|
#include <functional>
|
2016-03-31 04:46:22 +00:00
|
|
|
#include <vector>
|
2019-03-31 19:51:54 +00:00
|
|
|
#include <wx/filename.h> // member variable
|
2021-05-23 03:20:14 +00:00
|
|
|
#include "Identifier.h"
|
2010-10-07 23:01:49 +00:00
|
|
|
#include "../SampleFormat.h"
|
2019-03-30 19:06:57 +00:00
|
|
|
#include "../widgets/wxPanelWrapper.h" // to inherit
|
2019-12-20 18:02:31 +00:00
|
|
|
#include "../FileNames.h" // for FileTypes
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2020-05-26 21:22:44 +00:00
|
|
|
#include "../Registry.h"
|
2020-02-01 12:00:03 +00:00
|
|
|
|
2018-11-12 00:47:44 +00:00
|
|
|
class wxArrayString;
|
2017-10-12 19:41:52 +00:00
|
|
|
class FileDialogWrapper;
|
2017-08-02 16:41:29 +00:00
|
|
|
class wxFileCtrlEvent;
|
2010-01-23 19:44:49 +00:00
|
|
|
class wxMemoryDC;
|
2018-11-14 20:53:31 +00:00
|
|
|
class wxSimplebook;
|
2010-01-23 19:44:49 +00:00
|
|
|
class wxStaticText;
|
|
|
|
class AudacityProject;
|
|
|
|
class WaveTrack;
|
2019-03-31 19:51:54 +00:00
|
|
|
class Tags;
|
2010-01-23 19:44:49 +00:00
|
|
|
class TrackList;
|
|
|
|
class MixerSpec;
|
2018-01-25 20:58:37 +00:00
|
|
|
class ProgressDialog;
|
2017-10-20 15:48:12 +00:00
|
|
|
class ShuttleGui;
|
2010-10-07 23:01:49 +00:00
|
|
|
class Mixer;
|
2017-08-24 15:44:36 +00:00
|
|
|
using WaveTrackConstArray = std::vector < std::shared_ptr < const WaveTrack > >;
|
2016-12-24 15:43:25 +00:00
|
|
|
enum class ProgressResult : unsigned;
|
2019-12-13 18:18:18 +00:00
|
|
|
class wxFileNameWrapper;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2014-01-13 21:09:14 +00:00
|
|
|
class AUDACITY_DLL_API FormatInfo
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
public:
|
2018-02-02 18:24:53 +00:00
|
|
|
FormatInfo() {}
|
|
|
|
FormatInfo( const FormatInfo & ) = default;
|
|
|
|
FormatInfo &operator = ( const FormatInfo & ) = default;
|
2018-02-22 17:26:20 +00:00
|
|
|
//FormatInfo( FormatInfo && ) = default;
|
|
|
|
//FormatInfo &operator = ( FormatInfo && ) = default;
|
2018-02-02 18:24:53 +00:00
|
|
|
~FormatInfo() {}
|
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
wxString mFormat;
|
2018-03-29 20:26:31 +00:00
|
|
|
TranslatableString mDescription;
|
2016-01-26 18:48:37 +00:00
|
|
|
// wxString mExtension;
|
2019-03-07 16:29:42 +00:00
|
|
|
FileExtensions mExtensions;
|
2019-12-20 18:02:31 +00:00
|
|
|
FileNames::FileTypes mMask;
|
2016-09-02 19:53:09 +00:00
|
|
|
unsigned mMaxChannels;
|
2010-01-23 19:44:49 +00:00
|
|
|
bool mCanMetaData;
|
|
|
|
};
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// ExportPlugin
|
|
|
|
//----------------------------------------------------------------------------
|
2016-02-24 06:06:39 +00:00
|
|
|
class AUDACITY_DLL_API ExportPlugin /* not final */
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
ExportPlugin();
|
|
|
|
virtual ~ExportPlugin();
|
|
|
|
|
|
|
|
int AddFormat();
|
|
|
|
void SetFormat(const wxString & format, int index);
|
2018-03-29 20:26:31 +00:00
|
|
|
void SetDescription(const TranslatableString & description, int index);
|
2019-12-27 21:14:25 +00:00
|
|
|
void AddExtension(const FileExtension &extension, int index);
|
2019-03-07 16:29:42 +00:00
|
|
|
void SetExtensions(FileExtensions extensions, int index);
|
2019-12-20 18:02:31 +00:00
|
|
|
void SetMask(FileNames::FileTypes mask, int index);
|
2016-09-02 19:53:09 +00:00
|
|
|
void SetMaxChannels(unsigned maxchannels, unsigned index);
|
2010-01-23 19:44:49 +00:00
|
|
|
void SetCanMetaData(bool canmetadata, int index);
|
2014-06-03 20:30:19 +00:00
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
virtual int GetFormatCount();
|
|
|
|
virtual wxString GetFormat(int index);
|
2019-12-29 18:48:19 +00:00
|
|
|
TranslatableString GetDescription(int index);
|
2010-01-23 19:44:49 +00:00
|
|
|
/** @brief Return the (first) file name extension for the sub-format.
|
|
|
|
* @param index The sub-format for which the extension is wanted */
|
2019-03-07 16:29:42 +00:00
|
|
|
virtual FileExtension GetExtension(int index = 0);
|
2010-01-23 19:44:49 +00:00
|
|
|
/** @brief Return all the file name extensions used for the sub-format.
|
|
|
|
* @param index the sub-format for which the extension is required */
|
2019-03-07 16:29:42 +00:00
|
|
|
virtual FileExtensions GetExtensions(int index = 0);
|
2019-12-20 18:02:31 +00:00
|
|
|
FileNames::FileTypes GetMask(int index);
|
2016-09-02 19:53:09 +00:00
|
|
|
virtual unsigned GetMaxChannels(int index);
|
2010-01-23 19:44:49 +00:00
|
|
|
virtual bool GetCanMetaData(int index);
|
2014-06-03 20:30:19 +00:00
|
|
|
|
2019-12-27 21:14:25 +00:00
|
|
|
virtual bool IsExtension(const FileExtension & ext, int index);
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
virtual bool DisplayOptions(wxWindow *parent, int format = 0);
|
2016-02-14 07:54:25 +00:00
|
|
|
|
2017-10-20 15:48:12 +00:00
|
|
|
virtual void OptionsCreate(ShuttleGui &S, int format) = 0;
|
2015-07-13 17:36:40 +00:00
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
virtual bool CheckFileName(wxFileName &filename, int format = 0);
|
2016-04-12 20:58:08 +00:00
|
|
|
/** @brief Exporter plug-ins may override this to specify the number
|
|
|
|
* of channels in exported file. -1 for unspecified */
|
|
|
|
virtual int SetNumExportChannels() { return -1; }
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
/** \brief called to export audio into a file.
|
|
|
|
*
|
2018-01-25 20:58:37 +00:00
|
|
|
* @param pDialog To be initialized with pointer to a NEW ProgressDialog if
|
|
|
|
* it was null, otherwise gives an existing dialog to be reused
|
|
|
|
* (working around a problem in wxWidgets for Mac; see bug 1600)
|
2010-01-23 19:44:49 +00:00
|
|
|
* @param selectedOnly Set to true if all tracks should be mixed, to false
|
|
|
|
* if only the selected tracks should be mixed and exported.
|
|
|
|
* @param metadata A Tags object that will over-ride the one in *project and
|
|
|
|
* be used to tag the file that is exported.
|
|
|
|
* @param subformat Control which of the multiple formats this exporter is
|
|
|
|
* capable of exporting should be used. Used where a single export plug-in
|
|
|
|
* handles a number of related formats, but they have separate
|
|
|
|
* entries in the Format drop-down list box. For example, the options to
|
|
|
|
* export to "Other PCM", "AIFF 16 Bit" and "WAV 16 Bit" are all the same
|
|
|
|
* libsndfile export plug-in, but with subformat set to 0, 1, and 2
|
|
|
|
* respectively.
|
2018-01-20 20:19:20 +00:00
|
|
|
* @return ProgressResult::Failed or ProgressResult::Cancelled if export
|
|
|
|
* fails to complete for any reason, in which case this function is
|
|
|
|
* responsible for alerting the user. Otherwise ProgressResult::Success or
|
|
|
|
* ProgressResult::Stopped
|
2010-01-23 19:44:49 +00:00
|
|
|
*/
|
2016-12-24 15:43:25 +00:00
|
|
|
virtual ProgressResult Export(AudacityProject *project,
|
2018-01-25 20:58:37 +00:00
|
|
|
std::unique_ptr<ProgressDialog> &pDialog,
|
2016-09-02 19:53:09 +00:00
|
|
|
unsigned channels,
|
2019-12-13 18:18:18 +00:00
|
|
|
const wxFileNameWrapper &fName,
|
2010-01-23 19:44:49 +00:00
|
|
|
bool selectedOnly,
|
|
|
|
double t0,
|
|
|
|
double t1,
|
|
|
|
MixerSpec *mixerSpec = NULL,
|
2016-02-08 20:59:50 +00:00
|
|
|
const Tags *metadata = NULL,
|
2016-02-23 02:17:04 +00:00
|
|
|
int subformat = 0) = 0;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2010-10-07 23:01:49 +00:00
|
|
|
protected:
|
2019-05-24 14:11:52 +00:00
|
|
|
std::unique_ptr<Mixer> CreateMixer(const TrackList &tracks,
|
|
|
|
bool selectionOnly,
|
2010-10-07 23:01:49 +00:00
|
|
|
double startTime, double stopTime,
|
2017-02-25 23:12:04 +00:00
|
|
|
unsigned numOutChannels, size_t outBufferSize, bool outInterleaved,
|
2010-10-07 23:01:49 +00:00
|
|
|
double outRate, sampleFormat outFormat,
|
2020-11-30 20:14:20 +00:00
|
|
|
MixerSpec *mixerSpec);
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2018-01-25 20:58:37 +00:00
|
|
|
// Create or recycle a dialog.
|
|
|
|
static void InitProgress(std::unique_ptr<ProgressDialog> &pDialog,
|
2019-12-08 03:37:02 +00:00
|
|
|
const TranslatableString &title, const TranslatableString &message);
|
2019-12-13 18:18:18 +00:00
|
|
|
static void InitProgress(std::unique_ptr<ProgressDialog> &pDialog,
|
2019-12-08 03:37:02 +00:00
|
|
|
const wxFileNameWrapper &title, const TranslatableString &message);
|
2018-01-25 20:58:37 +00:00
|
|
|
|
2010-10-07 23:01:49 +00:00
|
|
|
private:
|
2018-02-02 18:24:53 +00:00
|
|
|
std::vector<FormatInfo> mFormatInfos;
|
2010-01-23 19:44:49 +00:00
|
|
|
};
|
|
|
|
|
2018-04-16 17:47:44 +00:00
|
|
|
using ExportPluginArray = std::vector < std::unique_ptr< ExportPlugin > > ;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Exporter
|
|
|
|
//----------------------------------------------------------------------------
|
2018-08-06 14:56:56 +00:00
|
|
|
|
|
|
|
// For a file suffix change from the options.
|
2020-09-28 12:50:18 +00:00
|
|
|
wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API,
|
|
|
|
AUDACITY_FILE_SUFFIX_EVENT, wxCommandEvent);
|
2018-08-06 14:56:56 +00:00
|
|
|
|
2016-02-24 06:06:39 +00:00
|
|
|
class AUDACITY_DLL_API Exporter final : public wxEvtHandler
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2019-07-29 19:43:41 +00:00
|
|
|
using ExportPluginFactory =
|
|
|
|
std::function< std::unique_ptr< ExportPlugin >() >;
|
|
|
|
|
|
|
|
// Objects of this type are statically constructed in files implementing
|
|
|
|
// subclasses of ExportPlugin
|
|
|
|
// Register factories, not plugin objects themselves, which allows them
|
|
|
|
// to have some fresh state variables each time export begins again
|
|
|
|
// and to compute translated strings for the current locale
|
2020-09-28 12:50:18 +00:00
|
|
|
struct AUDACITY_DLL_API RegisteredExportPlugin{
|
2020-02-01 12:00:03 +00:00
|
|
|
RegisteredExportPlugin(
|
|
|
|
const Identifier &id, // an internal string naming the plug-in
|
|
|
|
const ExportPluginFactory&,
|
|
|
|
const Registry::Placement &placement = { wxEmptyString, {} } );
|
2019-07-29 19:43:41 +00:00
|
|
|
};
|
|
|
|
|
2019-06-06 23:46:14 +00:00
|
|
|
static bool DoEditMetadata(AudacityProject &project,
|
2019-12-08 17:11:31 +00:00
|
|
|
const TranslatableString &title,
|
|
|
|
const TranslatableString &shortUndoDescription, bool force);
|
2019-06-06 23:46:14 +00:00
|
|
|
|
2019-05-22 00:16:20 +00:00
|
|
|
Exporter( AudacityProject &project );
|
2010-01-23 19:44:49 +00:00
|
|
|
virtual ~Exporter();
|
|
|
|
|
2019-12-20 17:13:39 +00:00
|
|
|
void SetFileDialogTitle( const TranslatableString & DialogTitle );
|
2019-12-27 21:14:25 +00:00
|
|
|
void SetDefaultFormat( const FileExtension & Format ){ mFormatName = Format;};
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2019-05-22 00:16:20 +00:00
|
|
|
bool Process(bool selectedOnly,
|
2010-01-23 19:44:49 +00:00
|
|
|
double t0, double t1);
|
2019-05-22 00:16:20 +00:00
|
|
|
bool Process(unsigned numChannels,
|
2019-12-27 21:14:25 +00:00
|
|
|
const FileExtension &type, const wxString & filename,
|
2010-01-23 19:44:49 +00:00
|
|
|
bool selectedOnly, double t0, double t1);
|
|
|
|
|
|
|
|
void DisplayOptions(int index);
|
|
|
|
int FindFormatIndex(int exportindex);
|
|
|
|
|
2016-03-31 04:46:22 +00:00
|
|
|
const ExportPluginArray &GetPlugins();
|
2010-01-23 19:44:49 +00:00
|
|
|
|
2016-02-25 13:47:48 +00:00
|
|
|
// Auto Export from Timer Recording
|
2019-05-22 00:16:20 +00:00
|
|
|
bool ProcessFromTimerRecording(bool selectedOnly,
|
2016-02-25 13:47:48 +00:00
|
|
|
double t0,
|
|
|
|
double t1,
|
|
|
|
wxFileName fnFile,
|
|
|
|
int iFormat,
|
|
|
|
int iSubFormat,
|
|
|
|
int iFilterIndex);
|
2019-05-22 00:16:20 +00:00
|
|
|
bool SetAutoExportOptions();
|
2016-02-25 13:47:48 +00:00
|
|
|
int GetAutoExportFormat();
|
|
|
|
int GetAutoExportSubFormat();
|
|
|
|
int GetAutoExportFilterIndex();
|
|
|
|
wxFileName GetAutoExportFileName();
|
2018-08-10 08:39:41 +00:00
|
|
|
void OnExtensionChanged(wxCommandEvent &evt);
|
|
|
|
void OnHelp(wxCommandEvent &evt);
|
2016-02-25 13:47:48 +00:00
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
private:
|
|
|
|
bool ExamineTracks();
|
|
|
|
bool GetFilename();
|
|
|
|
bool CheckFilename();
|
2020-04-04 08:48:49 +00:00
|
|
|
bool CheckMix(bool prompt = true);
|
2010-01-23 19:44:49 +00:00
|
|
|
bool ExportTracks();
|
|
|
|
|
2015-07-13 17:36:40 +00:00
|
|
|
static void CreateUserPaneCallback(wxWindow *parent, wxUIntPtr userdata);
|
|
|
|
void CreateUserPane(wxWindow *parent);
|
|
|
|
void OnFilterChanged(wxFileCtrlEvent & evt);
|
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
private:
|
2019-12-27 21:14:25 +00:00
|
|
|
FileExtension mFormatName;
|
2017-10-12 19:41:52 +00:00
|
|
|
FileDialogWrapper *mDialog;
|
2019-12-20 17:13:39 +00:00
|
|
|
TranslatableString mFileDialogTitle;
|
2010-01-23 19:44:49 +00:00
|
|
|
AudacityProject *mProject;
|
2016-04-09 20:09:19 +00:00
|
|
|
std::unique_ptr<MixerSpec> mMixerSpec;
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
ExportPluginArray mPlugins;
|
|
|
|
|
|
|
|
wxFileName mFilename;
|
|
|
|
wxFileName mActualName;
|
|
|
|
|
|
|
|
double mT0;
|
|
|
|
double mT1;
|
|
|
|
int mFilterIndex;
|
|
|
|
int mFormat;
|
|
|
|
int mSubFormat;
|
|
|
|
int mNumSelected;
|
2016-09-02 19:53:09 +00:00
|
|
|
unsigned mNumLeft;
|
|
|
|
unsigned mNumRight;
|
|
|
|
unsigned mNumMono;
|
|
|
|
unsigned mChannels;
|
2010-01-23 19:44:49 +00:00
|
|
|
bool mSelectedOnly;
|
2015-07-13 17:36:40 +00:00
|
|
|
|
2015-08-05 07:28:42 +00:00
|
|
|
wxSimplebook *mBook;
|
2015-07-13 17:36:40 +00:00
|
|
|
|
2016-09-18 14:26:29 +00:00
|
|
|
DECLARE_EVENT_TABLE()
|
2010-01-23 19:44:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// ExportMixerPanel
|
|
|
|
//----------------------------------------------------------------------------
|
2016-06-25 18:18:23 +00:00
|
|
|
class ExportMixerPanel final : public wxPanelWrapper
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
public:
|
2017-10-20 16:06:29 +00:00
|
|
|
ExportMixerPanel( wxWindow *parent, wxWindowID id,
|
|
|
|
MixerSpec *mixerSpec, wxArrayString trackNames,
|
|
|
|
const wxPoint& pos = wxDefaultPosition,
|
2010-01-23 19:44:49 +00:00
|
|
|
const wxSize& size = wxDefaultSize);
|
|
|
|
virtual ~ExportMixerPanel();
|
|
|
|
|
|
|
|
void OnMouseEvent(wxMouseEvent & event);
|
|
|
|
void OnPaint(wxPaintEvent & event);
|
|
|
|
|
|
|
|
private:
|
2016-04-09 20:09:19 +00:00
|
|
|
std::unique_ptr<wxBitmap> mBitmap;
|
2010-01-23 19:44:49 +00:00
|
|
|
wxRect mEnvRect;
|
|
|
|
int mWidth;
|
|
|
|
int mHeight;
|
|
|
|
MixerSpec *mMixerSpec;
|
2016-04-14 15:56:09 +00:00
|
|
|
ArrayOf<wxRect> mChannelRects;
|
|
|
|
ArrayOf<wxRect> mTrackRects;
|
2010-01-23 19:44:49 +00:00
|
|
|
int mSelectedTrack, mSelectedChannel;
|
|
|
|
wxArrayString mTrackNames;
|
|
|
|
int mBoxWidth, mChannelHeight, mTrackHeight;
|
|
|
|
|
2016-02-23 02:17:04 +00:00
|
|
|
void SetFont( wxMemoryDC &memDC, const wxString &text, int width, int height );
|
2010-01-23 19:44:49 +00:00
|
|
|
double Distance( wxPoint &a, wxPoint &b );
|
|
|
|
bool IsOnLine( wxPoint p, wxPoint la, wxPoint lb );
|
|
|
|
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
|
|
};
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
|
// ExportMixerDialog
|
|
|
|
//----------------------------------------------------------------------------
|
2016-07-10 21:10:50 +00:00
|
|
|
class ExportMixerDialog final : public wxDialogWrapper
|
2010-01-23 19:44:49 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
// constructors and destructors
|
2016-09-02 19:53:09 +00:00
|
|
|
ExportMixerDialog( const TrackList * tracks, bool selectedOnly, unsigned maxNumChannels,
|
2019-12-08 05:25:47 +00:00
|
|
|
wxWindow *parent, wxWindowID id, const TranslatableString &title,
|
2010-01-23 19:44:49 +00:00
|
|
|
const wxPoint& pos = wxDefaultPosition,
|
2014-06-03 20:30:19 +00:00
|
|
|
const wxSize& size = wxDefaultSize,
|
2010-01-23 19:44:49 +00:00
|
|
|
long style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
|
|
|
|
virtual ~ExportMixerDialog();
|
|
|
|
|
2016-04-09 20:09:19 +00:00
|
|
|
MixerSpec* GetMixerSpec() { return mMixerSpec.get(); }
|
2010-01-23 19:44:49 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
wxStaticText *mChannelsText;
|
2016-04-09 20:09:19 +00:00
|
|
|
std::unique_ptr<MixerSpec> mMixerSpec;
|
2010-01-23 19:44:49 +00:00
|
|
|
wxArrayString mTrackNames;
|
2014-06-03 20:30:19 +00:00
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
private:
|
|
|
|
void OnOk( wxCommandEvent &event );
|
|
|
|
void OnCancel( wxCommandEvent &event );
|
2018-08-09 20:25:29 +00:00
|
|
|
void OnMixerPanelHelp( wxCommandEvent &event );
|
2010-01-23 19:44:49 +00:00
|
|
|
void OnSlider( wxCommandEvent &event );
|
|
|
|
void OnSize( wxSizeEvent &event );
|
|
|
|
|
|
|
|
private:
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
|
|
};
|
2020-09-21 11:43:31 +00:00
|
|
|
|
2020-09-28 12:50:18 +00:00
|
|
|
AUDACITY_DLL_API TranslatableString AudacityExportCaptionStr();
|
|
|
|
AUDACITY_DLL_API TranslatableString AudacityExportMessageStr();
|
2020-09-21 11:43:31 +00:00
|
|
|
|
|
|
|
/// We have many Export errors that are essentially anonymous
|
|
|
|
/// and are distinguished only by an error code number.
|
|
|
|
/// Rather than repeat the code, we have it just once.
|
2020-09-28 12:50:18 +00:00
|
|
|
AUDACITY_DLL_API void ShowExportErrorDialog(wxString ErrorCode,
|
2020-09-21 11:43:31 +00:00
|
|
|
TranslatableString message = AudacityExportMessageStr(),
|
|
|
|
const TranslatableString& caption = AudacityExportCaptionStr());
|
|
|
|
|
2020-09-28 12:50:18 +00:00
|
|
|
AUDACITY_DLL_API
|
2020-12-06 19:20:02 +00:00
|
|
|
void ShowDiskFullExportErrorDialog(const wxFileNameWrapper &fileName);
|
2020-09-21 11:43:31 +00:00
|
|
|
|
2010-01-23 19:44:49 +00:00
|
|
|
#endif
|