Audacity 3.2.0
Public Member Functions | Static Private Member Functions | Private Attributes | List of all members
MP3ExportProcessor Class Referencefinal
Inheritance diagram for MP3ExportProcessor:
[legend]
Collaboration diagram for MP3ExportProcessor:
[legend]

Public Member Functions

bool Initialize (AudacityProject &project, const Parameters &parameters, const wxFileNameWrapper &filename, double t0, double t1, bool selectedOnly, double sampleRate, unsigned channels, MixerOptions::Downmix *mixerSpec, const Tags *tags) override
 Called before start processing. More...
 
ExportResult Process (ExportProcessorDelegate &delegate) override
 
- Public Member Functions inherited from ExportProcessor
 ExportProcessor (const ExportProcessor &)=delete
 
ExportProcessoroperator= (const ExportProcessor &)=delete
 
 ExportProcessor ()=default
 
virtual ~ExportProcessor ()
 
virtual bool Initialize (AudacityProject &project, const Parameters &parameters, const wxFileNameWrapper &filename, double t0, double t1, bool selectedOnly, double rate, unsigned channels, MixerOptions::Downmix *mixerSpec=nullptr, const Tags *tags=nullptr)=0
 Called before start processing. More...
 
virtual ExportResult Process (ExportProcessorDelegate &delegate)=0
 

Static Private Member Functions

static int AskResample (int bitrate, int rate, int lowrate, int highrate)
 
static unsigned long AddTags (ArrayOf< char > &buffer, bool *endOfFile, const Tags *tags)
 

Private Attributes

struct {
   TranslatableString   status
 
   unsigned   channels
 
   double   t0
 
   double   t1
 
   MP3Exporter   exporter
 
   wxFFile   outFile
 
   ArrayOf< char >   id3buffer
 
   unsigned long   id3len
 
   wxFileOffset   infoTagPos
 
   size_t   bufferSize
 
   int   inSamples
 
   std::unique_ptr< Mixer >   mixer
 
context
 

Additional Inherited Members

- Public Types inherited from ExportProcessor
using Parameters = std::vector< std::tuple< ExportOptionID, ExportValue > >
 

Detailed Description

Definition at line 1593 of file ExportMP3.cpp.

Member Function Documentation

◆ AddTags()

unsigned long MP3ExportProcessor::AddTags ( ArrayOf< char > &  buffer,
bool *  endOfFile,
const Tags tags 
)
staticprivate

Definition at line 2129 of file ExportMP3.cpp.

2130{
2131#ifdef USE_LIBID3TAG
2132 id3_tag_holder tp { id3_tag_new() };
2133
2134 for (const auto &pair : tags->GetRange()) {
2135 const auto &n = pair.first;
2136 const auto &v = pair.second;
2137 const char *name = "TXXX";
2138
2139 if (n.CmpNoCase(TAG_TITLE) == 0) {
2140 name = ID3_FRAME_TITLE;
2141 }
2142 else if (n.CmpNoCase(TAG_ARTIST) == 0) {
2143 name = ID3_FRAME_ARTIST;
2144 }
2145 else if (n.CmpNoCase(TAG_ALBUM) == 0) {
2146 name = ID3_FRAME_ALBUM;
2147 }
2148 else if (n.CmpNoCase(TAG_YEAR) == 0) {
2149 // LLL: Some apps do not like the newer frame ID (ID3_FRAME_YEAR),
2150 // so we add old one as well.
2151 AddFrame(tp.get(), n, v, "TYER");
2152 name = ID3_FRAME_YEAR;
2153 }
2154 else if (n.CmpNoCase(TAG_GENRE) == 0) {
2155 name = ID3_FRAME_GENRE;
2156 }
2157 else if (n.CmpNoCase(TAG_COMMENTS) == 0) {
2158 name = ID3_FRAME_COMMENT;
2159 }
2160 else if (n.CmpNoCase(TAG_TRACK) == 0) {
2161 name = ID3_FRAME_TRACK;
2162 }
2163
2164 AddFrame(tp.get(), n, v, name);
2165 }
2166
2167 tp->options &= (~ID3_TAG_OPTION_COMPRESSION); // No compression
2168
2169 // If this version of libid3tag supports it, use v2.3 ID3
2170 // tags instead of the newer, but less well supported, v2.4
2171 // that libid3tag uses by default.
2172 #ifdef ID3_TAG_HAS_TAG_OPTION_ID3V2_3
2173 tp->options |= ID3_TAG_OPTION_ID3V2_3;
2174 #endif
2175
2176 *endOfFile = false;
2177
2178 unsigned long len;
2179
2180 len = id3_tag_render(tp.get(), 0);
2181 buffer.reinit(len);
2182 len = id3_tag_render(tp.get(), (id3_byte_t *)buffer.get());
2183
2184 return len;
2185#else //ifdef USE_LIBID3TAG
2186 return 0;
2187#endif
2188}
const TranslatableString name
Definition: Distortion.cpp:76
#define TAG_TRACK
Definition: Tags.h:61
#define TAG_COMMENTS
Definition: Tags.h:64
#define TAG_GENRE
Definition: Tags.h:63
#define TAG_ALBUM
Definition: Tags.h:60
#define TAG_YEAR
Definition: Tags.h:62
#define TAG_TITLE
Definition: Tags.h:58
#define TAG_ARTIST
Definition: Tags.h:59
void reinit(Integral count, bool initialize=false)
Definition: MemoryX.h:59
Iterators GetRange() const
Definition: Tags.cpp:426

References Tags::GetRange(), name, ArrayOf< X >::reinit(), TAG_ALBUM, TAG_ARTIST, TAG_COMMENTS, TAG_GENRE, TAG_TITLE, TAG_TRACK, and TAG_YEAR.

Referenced by Initialize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AskResample()

int MP3ExportProcessor::AskResample ( int  bitrate,
int  rate,
int  lowrate,
int  highrate 
)
staticprivate

Definition at line 2054 of file ExportMP3.cpp.

2055{
2056 wxDialogWrapper d(nullptr, wxID_ANY, XO("Invalid sample rate"));
2057 d.SetName();
2058 wxChoice *choice;
2060
2061 int selected = -1;
2062
2063 S.StartVerticalLay();
2064 {
2065 S.SetBorder(10);
2066 S.StartStatic(XO("Resample"));
2067 {
2068 S.StartHorizontalLay(wxALIGN_CENTER, false);
2069 {
2070 S.AddTitle(
2071 ((bitrate == 0)
2072 ? XO(
2073"The project sample rate (%d) is not supported by the MP3\nfile format. ")
2074 .Format( rate )
2075 : XO(
2076"The project sample rate (%d) and bit rate (%d kbps) combination is not\nsupported by the MP3 file format. ")
2077 .Format( rate, bitrate ))
2078 + XO("You may resample to one of the rates below.")
2079 );
2080 }
2081 S.EndHorizontalLay();
2082
2083 S.StartHorizontalLay(wxALIGN_CENTER, false);
2084 {
2085 choice = S.AddChoice(XXO("Sample Rates"),
2086 [&]{
2087 TranslatableStrings choices;
2088 for (size_t ii = 0, nn = sampRates.size(); ii < nn; ++ii) {
2089 int label = sampRates[ii];
2090 if (label >= lowrate && label <= highrate) {
2091 choices.push_back( Verbatim( "%d" ).Format( label ) );
2092 if (label <= rate)
2093 selected = ii;
2094 }
2095 }
2096 return choices;
2097 }(),
2098 std::max( 0, selected )
2099 );
2100 }
2101 S.EndHorizontalLay();
2102 }
2103 S.EndStatic();
2104
2105 S.AddStandardButtons();
2106 }
2107 S.EndVerticalLay();
2108
2109 d.Layout();
2110 d.Fit();
2111 d.SetMinSize(d.GetSize());
2112 d.Center();
2113
2114 if (d.ShowModal() == wxID_CANCEL) {
2115 return 0;
2116 }
2117
2118 return wxAtoi(choice->GetStringSelection());
2119}
static const std::vector< int > sampRates
Definition: ExportMP3.cpp:201
XO("Cut/Copy/Paste")
XXO("&Cut/Copy/Paste Toolbar")
@ eIsCreating
Definition: ShuttleGui.h:37
#define S(N)
Definition: ToChars.cpp:64
std::vector< TranslatableString > TranslatableStrings
Abstract base class used in importing a file.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:640

References eIsCreating, S, sampRates, wxDialogWrapper::SetName(), XO(), and XXO().

Referenced by Initialize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Initialize()

bool MP3ExportProcessor::Initialize ( AudacityProject project,
const Parameters parameters,
const wxFileNameWrapper filename,
double  t0,
double  t1,
bool  selectedOnly,
double  rate,
unsigned  channels,
MixerOptions::Downmix mixerSpec,
const Tags tags 
)
overridevirtual

Called before start processing.

Parameters
projectProcessor may access project data, take care to exclude any data race
parametersA format-dependent set of parameters used in exporting
selectedOnlySet to true if all tracks should be mixed, to false if only the selected tracks should be mixed and exported.
tagsA Tags object that will over-ride the one in *project and be used to tag the file that is exported. @retern Implementations may simply return false without any error reporting. This is to temporarily preserve old behavior, which is to be removed in the nearest future.

Implements ExportProcessor.

Definition at line 1777 of file ExportMP3.cpp.

1784{
1785 context.t0 = t0;
1786 context.t1 = t1;
1787 context.channels = channels;
1788
1789 int rate = lrint(sampleRate);
1790#ifndef DISABLE_DYNAMIC_LOADING_LAME
1791 wxWindow *parent = FindProjectFrame(&project);
1792#endif // DISABLE_DYNAMIC_LOADING_LAME
1793 const auto &tracks = TrackList::Get( project );
1794 auto& exporter = context.exporter;
1795
1796#ifdef DISABLE_DYNAMIC_LOADING_LAME
1797 if (!exporter.InitLibrary(wxT(""))) {
1798 gPrefs->Write(wxT("/MP3/MP3LibPath"), wxString(wxT("")));
1799 gPrefs->Flush();
1800 throw ExportException(_("Could not initialize MP3 encoding library!"));
1801 }
1802#else
1803 if (!exporter.LoadLibrary(parent, MP3Exporter::Maybe)) {
1804 gPrefs->Write(wxT("/MP3/MP3LibPath"), wxString(wxT("")));
1805 gPrefs->Flush();
1806 throw ExportException(_("Could not open MP3 encoding library!"));
1807 }
1808
1810 gPrefs->Write(wxT("/MP3/MP3LibPath"), wxString(wxT("")));
1811 gPrefs->Flush();
1812 throw ExportException(_("Not a valid or supported MP3 encoding library!"));
1813 }
1814#endif // DISABLE_DYNAMIC_LOADING_LAME
1815
1816 // Retrieve preferences
1817 int highrate = 48000;
1818 int lowrate = 8000;
1819 int bitrate = 0;
1820 int quality;
1821
1823 parameters,
1825 std::string("CBR"));
1826 // Set the bitrate/quality and mode
1827 if (rmode == "SET") {
1828 quality = ExportPluginHelpers::GetParameterValue<int>(
1829 parameters,
1833 exporter.SetQuality(quality);
1834 }
1835 else if (rmode == "VBR") {
1836 quality = ExportPluginHelpers::GetParameterValue<int>(
1837 parameters,
1839 QUALITY_2);
1841 exporter.SetQuality(quality);
1842 }
1843 else if (rmode == "ABR") {
1845 parameters,
1847 128);
1849 exporter.SetBitrate(bitrate);
1850 if (bitrate > 160) {
1851 lowrate = 32000;
1852 }
1853 else if (bitrate < 32 || bitrate == 144) {
1854 highrate = 24000;
1855 }
1856 }
1857 else {
1860 exporter.SetBitrate(bitrate);
1861
1862 if (bitrate > 160) {
1863 lowrate = 32000;
1864 }
1865 else if (bitrate < 32 || bitrate == 144) {
1866 highrate = 24000;
1867 }
1868 }
1869
1870 // Verify sample rate
1871 if (!make_iterator_range( sampRates ).contains( rate ) ||
1872 (rate < lowrate) || (rate > highrate)) {
1873 // Force valid sample rate in macros.
1874 if (project.mBatchMode) {
1875 if (!make_iterator_range( sampRates ).contains( rate )) {
1876 auto const bestRateIt = std::lower_bound(sampRates.begin(),
1877 sampRates.end(), rate);
1878 rate = (bestRateIt == sampRates.end()) ? highrate : *bestRateIt;
1879 }
1880 if (rate < lowrate) {
1881 rate = lowrate;
1882 }
1883 else if (rate > highrate) {
1884 rate = highrate;
1885 }
1886 }
1887 // else validate or prompt
1888 else {
1889 if (!make_iterator_range( sampRates ).contains( rate ) ||
1890 (rate < lowrate) || (rate > highrate)) {
1891 //This call should go away once export project rate option
1892 //is available as an export dialog option
1893 rate = AskResample(bitrate, rate, lowrate, highrate);
1894 }
1895 if (rate == 0) {
1896 return false;
1897 }
1898 }
1899 }
1900
1901 context.inSamples = exporter.InitializeStream(channels, rate);
1902 if (context.inSamples < 0) {
1903 throw ExportException(_("Unable to initialize MP3 stream"));
1904 }
1905
1906 // Put ID3 tags at beginning of file
1907 if (metadata == nullptr)
1908 metadata = &Tags::Get( project );
1909
1910 // Open file for writing
1911 if (!context.outFile.Open(fName.GetFullPath(), wxT("w+b"))) {
1912 throw ExportException(_("Unable to open target file for writing"));
1913 }
1914
1915 bool endOfFile;
1916 context.id3len = AddTags(context.id3buffer, &endOfFile, metadata);
1917 if (context.id3len && !endOfFile) {
1918 if (context.id3len > context.outFile.Write(context.id3buffer.get(), context.id3len)) {
1919 // TODO: more precise message
1920 throw ExportErrorException("MP3:1882");
1921 }
1922 context.id3len = 0;
1923 context.id3buffer.reset();
1924 }
1925
1926 context.infoTagPos = context.outFile.Tell();
1927
1928 context.bufferSize = std::max(0, exporter.GetOutBufferSize());
1929 if (context.bufferSize == 0) {
1930 // TODO: more precise message
1931 throw ExportErrorException("MP3:1849");
1932 }
1933
1934 if (rmode == "SET") {
1935 context.status = (selectionOnly ?
1936 XO("Exporting selected audio with %s preset") :
1937 XO("Exporting the audio with %s preset"))
1938 .Format( setRateNamesShort[quality] );
1939 }
1940 else if (rmode == "VBR") {
1941 context.status = (selectionOnly ?
1942 XO("Exporting selected audio with VBR quality %s") :
1943 XO("Exporting the audio with VBR quality %s"))
1944 .Format( varRateNames[quality] );
1945 }
1946 else {
1947 context.status = (selectionOnly ?
1948 XO("Exporting selected audio at %d Kbps") :
1949 XO("Exporting the audio at %d Kbps"))
1950 .Format( bitrate );
1951 }
1952
1953 context.mixer = ExportPluginHelpers::CreateMixer(tracks, selectionOnly,
1954 t0, t1,
1955 channels, context.inSamples, true,
1956 rate, floatSample, mixerSpec);
1957
1958 return true;
1959}
wxT("CloseDown"))
static const TranslatableStrings varRateNames
Definition: ExportMP3.cpp:167
@ MP3OptionIDQualityABR
Definition: ExportMP3.cpp:217
@ MP3OptionIDQualityVBR
Definition: ExportMP3.cpp:216
@ MP3OptionIDQualityCBR
Definition: ExportMP3.cpp:218
@ MP3OptionIDQualitySET
Definition: ExportMP3.cpp:215
@ MP3OptionIDMode
Definition: ExportMP3.cpp:214
@ QUALITY_2
Definition: ExportMP3.cpp:111
@ PRESET_STANDARD
Definition: ExportMP3.cpp:118
static const TranslatableStrings setRateNamesShort
Definition: ExportMP3.cpp:193
@ MODE_SET
Definition: ExportMP3.h:19
@ MODE_ABR
Definition: ExportMP3.h:21
@ MODE_VBR
Definition: ExportMP3.h:20
@ MODE_CBR
Definition: ExportMP3.h:22
#define _(s)
Definition: Internat.h:73
IteratorRange< Iterator > make_iterator_range(const Iterator &i1, const Iterator &i2)
Definition: IteratorX.h:210
audacity::BasicSettings * gPrefs
Definition: Prefs.cpp:68
wxFrame * FindProjectFrame(AudacityProject *project)
Get a pointer to the window associated with a project, or null if the given pointer is null,...
const auto tracks
const auto project
static T GetParameterValue(const ExportProcessor::Parameters &parameters, int id, T defaultValue=T())
static std::unique_ptr< Mixer > CreateMixer(const TrackList &tracks, bool selectionOnly, double startTime, double stopTime, unsigned numOutChannels, size_t outBufferSize, bool outInterleaved, double outRate, sampleFormat outFormat, MixerOptions::Downmix *mixerSpec)
MP3Exporter exporter
Definition: ExportMP3.cpp:1601
static int AskResample(int bitrate, int rate, int lowrate, int highrate)
Definition: ExportMP3.cpp:2054
static unsigned long AddTags(ArrayOf< char > &buffer, bool *endOfFile, const Tags *tags)
Definition: ExportMP3.cpp:2129
struct MP3ExportProcessor::@176 context
int GetOutBufferSize()
Definition: ExportMP3.cpp:1270
void SetBitrate(int rate)
Definition: ExportMP3.cpp:963
bool ValidLibraryLoaded()
Definition: ExportMP3.cpp:951
bool LoadLibrary(wxWindow *parent, AskUser askuser)
Definition: ExportMP3.cpp:888
bool InitLibrary(wxString libpath)
Definition: ExportMP3.cpp:973
void SetMode(int mode)
Definition: ExportMP3.cpp:958
int InitializeStream(unsigned channels, int sampleRate)
Definition: ExportMP3.cpp:1172
void SetQuality(int q)
Definition: ExportMP3.cpp:968
static Tags & Get(AudacityProject &project)
Definition: Tags.cpp:214
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:314
virtual bool Flush() noexcept=0
virtual bool Write(const wxString &key, bool value)=0
#define lrint(dbl)
Definition: float_cast.h:169

References _, AddTags(), AskResample(), channels, context, ExportPluginHelpers::CreateMixer(), exporter, FindProjectFrame(), floatSample, audacity::BasicSettings::Flush(), Tags::Get(), TrackList::Get(), MP3Exporter::GetOutBufferSize(), ExportPluginHelpers::GetParameterValue(), gPrefs, MP3Exporter::InitializeStream(), MP3Exporter::InitLibrary(), MP3Exporter::LoadLibrary(), lrint, make_iterator_range(), MP3Exporter::Maybe, MODE_ABR, MODE_CBR, MODE_SET, MODE_VBR, MP3OptionIDMode, MP3OptionIDQualityABR, MP3OptionIDQualityCBR, MP3OptionIDQualitySET, MP3OptionIDQualityVBR, PRESET_STANDARD, project, QUALITY_2, anonymous_namespace{ClipSegmentTest.cpp}::sampleRate, sampRates, MP3Exporter::SetBitrate(), MP3Exporter::SetMode(), MP3Exporter::SetQuality(), setRateNamesShort, t0, t1, tracks, MP3Exporter::ValidLibraryLoaded(), varRateNames, audacity::BasicSettings::Write(), wxT(), and XO().

Here is the call graph for this function:

◆ Process()

ExportResult MP3ExportProcessor::Process ( ExportProcessorDelegate delegate)
overridevirtual

Implements ExportProcessor.

Definition at line 1961 of file ExportMP3.cpp.

1962{
1963 delegate.SetStatusString(context.status);
1964
1965 auto& exporter = context.exporter;
1966 int bytes = 0;
1967
1968 ArrayOf<unsigned char> buffer{ context.bufferSize };
1969 wxASSERT(buffer);
1970
1971 auto exportResult = ExportResult::Success;
1972
1973 {
1974 while (exportResult == ExportResult::Success) {
1975 auto blockLen = context.mixer->Process();
1976 if (blockLen == 0)
1977 break;
1978
1979 float *mixed = (float *)context.mixer->GetBuffer();
1980
1981 if ((int)blockLen < context.inSamples) {
1982 if (context.channels > 1) {
1983 bytes = exporter.EncodeRemainder(mixed, blockLen, buffer.get());
1984 }
1985 else {
1986 bytes = exporter.EncodeRemainderMono(mixed, blockLen, buffer.get());
1987 }
1988 }
1989 else {
1990 if (context.channels > 1) {
1991 bytes = exporter.EncodeBuffer(mixed, buffer.get());
1992 }
1993 else {
1994 bytes = exporter.EncodeBufferMono(mixed, buffer.get());
1995 }
1996 }
1997
1998 if (bytes < 0) {
1999 throw ExportException(XO("Error %ld returned from MP3 encoder")
2000 .Format( bytes )
2001 .Translation());
2002 }
2003
2004 if (bytes > (int)context.outFile.Write(buffer.get(), bytes)) {
2005 // TODO: more precise message
2006 throw ExportDiskFullError(context.outFile.GetName());
2007 }
2008
2009 if(exportResult == ExportResult::Success)
2011 delegate, *context.mixer, context.t0, context.t1);
2012 }
2013 }
2014
2015 if (exportResult == ExportResult::Success) {
2016 bytes = exporter.FinishStream(buffer.get());
2017
2018 if (bytes < 0) {
2019 // TODO: more precise message
2020 throw ExportErrorException("MP3:1981");
2021 }
2022
2023 if (bytes > 0) {
2024 if (bytes > (int)context.outFile.Write(buffer.get(), bytes)) {
2025 // TODO: more precise message
2026 throw ExportErrorException("MP3:1988");
2027 }
2028 }
2029
2030 // Write ID3 tag if it was supposed to be at the end of the file
2031 if (context.id3len > 0) {
2032 if (bytes > (int)context.outFile.Write(context.id3buffer.get(), context.id3len)) {
2033 // TODO: more precise message
2034 throw ExportErrorException("MP3:1997");
2035 }
2036 }
2037
2038 // Always write the info (Xing/Lame) tag. Until we stop supporting Lame
2039 // versions before 3.98, we must do this after the MP3 file has been
2040 // closed.
2041 //
2042 // Also, if beWriteInfoTag() is used, mGF will no longer be valid after
2043 // this call, so do not use it.
2044 if (!exporter.PutInfoTag(context.outFile, context.infoTagPos) ||
2045 !context.outFile.Flush() ||
2046 !context.outFile.Close()) {
2047 // TODO: more precise message
2048 throw ExportErrorException("MP3:2012");
2049 }
2050 }
2051 return exportResult;
2052}
This simplifies arrays of arrays, each array separately allocated with NEW[] But it might be better t...
Definition: MemoryX.h:29
static ExportResult UpdateProgress(ExportProcessorDelegate &delegate, Mixer &mixer, double t0, double t1)
Sends progress update to delegate and retrieves state update from it. Typically used inside each expo...
virtual void SetStatusString(const TranslatableString &str)=0
int EncodeBufferMono(float inbuffer[], unsigned char outbuffer[])
Definition: ExportMP3.cpp:1299
int EncodeRemainderMono(float inbuffer[], int nSamples, unsigned char outbuffer[])
Definition: ExportMP3.cpp:1309
bool PutInfoTag(wxFFile &f, wxFileOffset off)
Definition: ExportMP3.cpp:1346
int EncodeBuffer(float inbuffer[], unsigned char outbuffer[])
Definition: ExportMP3.cpp:1278
int FinishStream(unsigned char outbuffer[])
Definition: ExportMP3.cpp:1320
int EncodeRemainder(float inbuffer[], int nSamples, unsigned char outbuffer[])
Definition: ExportMP3.cpp:1288

References context, MP3Exporter::EncodeBuffer(), MP3Exporter::EncodeBufferMono(), MP3Exporter::EncodeRemainder(), MP3Exporter::EncodeRemainderMono(), exporter, MP3Exporter::FinishStream(), MP3Exporter::PutInfoTag(), ExportProcessorDelegate::SetStatusString(), Success, ExportPluginHelpers::UpdateProgress(), and XO().

Here is the call graph for this function:

Member Data Documentation

◆ bufferSize

size_t MP3ExportProcessor::bufferSize

Definition at line 1606 of file ExportMP3.cpp.

◆ channels

unsigned MP3ExportProcessor::channels

Definition at line 1598 of file ExportMP3.cpp.

Referenced by Initialize().

◆ 

struct { ... } MP3ExportProcessor::context

Referenced by Initialize(), and Process().

◆ exporter

MP3Exporter MP3ExportProcessor::exporter

Definition at line 1601 of file ExportMP3.cpp.

Referenced by Initialize(), and Process().

◆ id3buffer

ArrayOf<char> MP3ExportProcessor::id3buffer

Definition at line 1603 of file ExportMP3.cpp.

◆ id3len

unsigned long MP3ExportProcessor::id3len

Definition at line 1604 of file ExportMP3.cpp.

◆ infoTagPos

wxFileOffset MP3ExportProcessor::infoTagPos

Definition at line 1605 of file ExportMP3.cpp.

◆ inSamples

int MP3ExportProcessor::inSamples

Definition at line 1607 of file ExportMP3.cpp.

◆ mixer

std::unique_ptr<Mixer> MP3ExportProcessor::mixer

Definition at line 1608 of file ExportMP3.cpp.

◆ outFile

wxFFile MP3ExportProcessor::outFile

Definition at line 1602 of file ExportMP3.cpp.

◆ status

TranslatableString MP3ExportProcessor::status

Definition at line 1597 of file ExportMP3.cpp.

◆ t0

double MP3ExportProcessor::t0

Definition at line 1599 of file ExportMP3.cpp.

Referenced by Initialize().

◆ t1

double MP3ExportProcessor::t1

Definition at line 1600 of file ExportMP3.cpp.

Referenced by Initialize().


The documentation for this class was generated from the following file: