mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-24 08:10:05 +02:00
Enable Eq factory presets to be updated on upgrade
This commit is contained in:
parent
7e83dc6a4c
commit
b5d2528c03
@ -140,6 +140,11 @@ enum kInterpolations
|
|||||||
kNumInterpolations
|
kNumInterpolations
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Increment whenever EQCurves.xml is updated
|
||||||
|
#define EQCURVES_VERSION 1
|
||||||
|
#define EQCURVES_REVISION 0
|
||||||
|
#define UPDATE_ALL 0 // 0 = merge new presets only, 1 = Update all factory presets.
|
||||||
|
|
||||||
static const wxString kInterpStrings[kNumInterpolations] =
|
static const wxString kInterpStrings[kNumInterpolations] =
|
||||||
{
|
{
|
||||||
/* i18n-hint: Technical term for a kind of curve.*/
|
/* i18n-hint: Technical term for a kind of curve.*/
|
||||||
@ -1373,8 +1378,21 @@ void EffectEqualization::LoadCurves(const wxString &fileName, bool append)
|
|||||||
// expects the ".audacity" portion to be a directory.
|
// expects the ".audacity" portion to be a directory.
|
||||||
// MJS: I don't know what the above means, or if I have broken it.
|
// MJS: I don't know what the above means, or if I have broken it.
|
||||||
wxFileName fn;
|
wxFileName fn;
|
||||||
if(fileName == wxT(""))
|
|
||||||
|
if(fileName == wxT("")) {
|
||||||
|
// Check if presets are up to date.
|
||||||
|
wxString eqCurvesCurrentVersion = wxString(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
|
||||||
|
wxString eqCurvesInstalledVersion = wxT("");
|
||||||
|
gPrefs->Read(wxT("/Effects/Equalization/PresetVersion"), &eqCurvesInstalledVersion, wxT(""));
|
||||||
|
|
||||||
|
bool needUpdate = (eqCurvesCurrentVersion == eqCurvesInstalledVersion);
|
||||||
|
|
||||||
|
// UpdateDefaultCurves allows us to import new factory presets only,
|
||||||
|
// or update all factory preset curves.
|
||||||
|
if (needUpdate)
|
||||||
|
this->UpdateDefaultCurves( UPDATE_ALL != 0 );
|
||||||
fn = wxFileName( FileNames::DataDir(), wxT("EQCurves.xml") );
|
fn = wxFileName( FileNames::DataDir(), wxT("EQCurves.xml") );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
fn = wxFileName(fileName); // user is loading a specific set of curves
|
fn = wxFileName(fileName); // user is loading a specific set of curves
|
||||||
|
|
||||||
@ -1458,6 +1476,123 @@ void EffectEqualization::LoadCurves(const wxString &fileName, bool append)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update presets to match Audacity version.
|
||||||
|
//
|
||||||
|
void EffectEqualization::UpdateDefaultCurves(bool updateAll /* false */)
|
||||||
|
{
|
||||||
|
if (mCurves.GetCount() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* i18n-hint: name of the 'unnamed' custom curve */
|
||||||
|
wxString unnamed = _("unnamed");
|
||||||
|
|
||||||
|
// Save the "unnamed" curve and remove it so we can add it back as the final curve.
|
||||||
|
EQCurve userUnnamed(wxT("temp"));
|
||||||
|
userUnnamed = mCurves.Last();
|
||||||
|
mCurves.RemoveAt(mCurves.Count()-1);
|
||||||
|
|
||||||
|
EQCurveArray userCurves = mCurves;
|
||||||
|
mCurves.Clear();
|
||||||
|
wxFileName fn;
|
||||||
|
|
||||||
|
XMLFileReader reader;
|
||||||
|
fn = wxFileName( FileNames::DataDir(), wxT("EQDefaultCurves.xml") );
|
||||||
|
|
||||||
|
if(!fn.FileExists() || !reader.Parse(this, fn.GetFullPath())) {
|
||||||
|
wxLogError(wxT("%s could not be read."), fn.GetFullPath().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQCurveArray defaultCurves = mCurves;
|
||||||
|
mCurves.Clear(); // clear now so that we can sort then add back.
|
||||||
|
|
||||||
|
// Remove "unnamed" if it exists.
|
||||||
|
if (defaultCurves.Last().Name == unnamed) {
|
||||||
|
defaultCurves.RemoveAt(defaultCurves.Count()-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wxLogError(wxT("Error in EQDefaultCurves.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
int numUserCurves = userCurves.GetCount();
|
||||||
|
int numDefaultCurves = defaultCurves.GetCount();
|
||||||
|
EQCurve tempCurve(wxT("test"));
|
||||||
|
|
||||||
|
if (updateAll) {
|
||||||
|
// Update all factory preset curves.
|
||||||
|
// Sort and add factory defaults first;
|
||||||
|
mCurves = defaultCurves;
|
||||||
|
mCurves.Sort(SortCurvesByName);
|
||||||
|
// then add remaining user curves:
|
||||||
|
for (int curveCount = 0; curveCount < numUserCurves; curveCount++) {
|
||||||
|
bool isCustom = true;
|
||||||
|
tempCurve = userCurves[curveCount];
|
||||||
|
// is the name in the dfault set?
|
||||||
|
for (int defCurveCount = 0; defCurveCount < numDefaultCurves; defCurveCount++) {
|
||||||
|
if (tempCurve.Name == mCurves[defCurveCount].Name) {
|
||||||
|
isCustom = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if tempCurve is not in the default set, add it to mCurves.
|
||||||
|
if (isCustom) {
|
||||||
|
mCurves.Add(tempCurve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Import new factory defaults but retain all user modified curves.
|
||||||
|
for (int defCurveCount = 0; defCurveCount < numDefaultCurves; defCurveCount++) {
|
||||||
|
bool isUserCurve = false;
|
||||||
|
// Add if the curve is in the user's set (preserve user's copy)
|
||||||
|
for (int userCurveCount = 0; userCurveCount < numUserCurves; userCurveCount++) {
|
||||||
|
if (userCurves[userCurveCount].Name == defaultCurves[defCurveCount].Name) {
|
||||||
|
isUserCurve = true;
|
||||||
|
mCurves.Add(userCurves[userCurveCount]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isUserCurve) {
|
||||||
|
mCurves.Add(defaultCurves[defCurveCount]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mCurves.Sort(SortCurvesByName);
|
||||||
|
// now add the rest of the user's curves.
|
||||||
|
for (int userCurveCount = 0; userCurveCount < numUserCurves; userCurveCount++) {
|
||||||
|
bool isDefaultCurve = false;
|
||||||
|
tempCurve = userCurves[userCurveCount];
|
||||||
|
for (int defCurveCount = 0; defCurveCount < numDefaultCurves; defCurveCount++) {
|
||||||
|
if (tempCurve.Name == defaultCurves[defCurveCount].Name) {
|
||||||
|
isDefaultCurve = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isDefaultCurve) {
|
||||||
|
mCurves.Add(tempCurve);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defaultCurves.Clear();
|
||||||
|
userCurves.Clear();
|
||||||
|
|
||||||
|
// Add back old "unnamed"
|
||||||
|
if(userUnnamed.Name == unnamed) {
|
||||||
|
mCurves.Add( userUnnamed ); // we always need a default curve to use
|
||||||
|
}
|
||||||
|
|
||||||
|
SaveCurves();
|
||||||
|
|
||||||
|
// Write current EqCurve version number
|
||||||
|
// TODO: Probably better if we used pluginregistry.cfg
|
||||||
|
wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
|
||||||
|
gPrefs->Write(wxT("/Effects/Equalization/PresetVersion"), eqCurvesCurrentVersion);
|
||||||
|
gPrefs->Flush();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Save curves to external file
|
// Save curves to external file
|
||||||
//
|
//
|
||||||
|
@ -143,6 +143,8 @@ private:
|
|||||||
|
|
||||||
void LoadCurves(const wxString &fileName = wxEmptyString, bool append = false);
|
void LoadCurves(const wxString &fileName = wxEmptyString, bool append = false);
|
||||||
void SaveCurves(const wxString &fileName = wxEmptyString);
|
void SaveCurves(const wxString &fileName = wxEmptyString);
|
||||||
|
// Merge new curves only or update all factory presets.
|
||||||
|
void UpdateDefaultCurves( bool updateAll = false);
|
||||||
void Select(int sel);
|
void Select(int sel);
|
||||||
void setCurve(int currentCurve);
|
void setCurve(int currentCurve);
|
||||||
void setCurve(const wxString &curveName);
|
void setCurve(const wxString &curveName);
|
||||||
@ -258,6 +260,11 @@ private:
|
|||||||
wxSlider *mdBMaxSlider;
|
wxSlider *mdBMaxSlider;
|
||||||
wxSlider *mSliders[NUMBER_OF_BANDS];
|
wxSlider *mSliders[NUMBER_OF_BANDS];
|
||||||
|
|
||||||
|
static int wxCMPFUNC_CONV SortCurvesByName (EQCurve **first, EQCurve **second)
|
||||||
|
{
|
||||||
|
return (*first)->Name.CmpNoCase((*second)->Name);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_EQ_SSE_THREADED
|
#ifdef EXPERIMENTAL_EQ_SSE_THREADED
|
||||||
wxRadioButton *mMathProcessingType[5]; // default, sse, sse threaded, AVX, AVX threaded (note AVX is not implemented yet
|
wxRadioButton *mMathProcessingType[5]; // default, sse, sse threaded, AVX, AVX threaded (note AVX is not implemented yet
|
||||||
wxBoxSizer *szrM;
|
wxBoxSizer *szrM;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user