commit f48af51550097d36acb602a37f369aa18ff8e62a
parent 2894ee1a11f01e586a6c6ac3b810a1579309058f
Author: fundamental <mark.d.mccurry@gmail.com>
Date: Fri, 14 May 2010 10:42:09 -0400
Bank: cleanup and fixing introduced bugs
Diffstat:
6 files changed, 81 insertions(+), 158 deletions(-)
diff --git a/src/Misc/Bank.cpp b/src/Misc/Bank.cpp
@@ -1,9 +1,11 @@
/*
ZynAddSubFX - a software synthesizer
- Bank.h - Instrument Bank
+ Bank.cpp - Instrument Bank
Copyright (C) 2002-2005 Nasca Octavian Paul
+ Copyright (C) 2010-2010 Mark McCurry
Author: Nasca Octavian Paul
+ Mark McCurry
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
@@ -27,6 +29,7 @@
#include <dirent.h>
#include <sys/stat.h>
#include <algorithm>
+#include <iostream>
#include <sys/types.h>
#include <fcntl.h>
@@ -43,17 +46,10 @@
using namespace std;
Bank::Bank()
+ :defaultinsname(" ")
{
- defaultinsname = " ";
-
- for(int i = 0; i < BANK_SIZE; i++) {
- ins[i].used = false;
- ins[i].info.PADsynth_used = false;
- }
clearbank();
-
bankfiletitle = dirname;
-
loadbank(config.cfg.currentBankDir);
}
@@ -79,12 +75,8 @@ string Bank::getnamenumbered(unsigned int ninstrument)
{
if(emptyslot(ninstrument))
return defaultinsname;
- snprintf(tmpinsname[ninstrument],
- PART_MAX_NAME_LEN + 15,
- "%d. %s",
- ninstrument + 1,
- getname(ninstrument).c_str());
- return tmpinsname[ninstrument];
+
+ return stringFrom(ninstrument + 1) + ". " + getname(ninstrument);
}
/*
@@ -108,43 +100,28 @@ void Bank::setname(unsigned int ninstrument, string newname, int newslot)
if(tmpfilename[i] == ' ')
tmpfilename[i] = '0';
- //make the filenames legal
- for(int i = 0; i < (int) strlen(tmpfilename); i++) {
- char c = tmpfilename[i];
- if((c >= '0') && (c <= '9'))
- continue;
- if((c >= 'A') && (c <= 'Z'))
- continue;
- if((c >= 'a') && (c <= 'z'))
- continue;
- if((c == '-') || (c == ' '))
- continue;
-
- tmpfilename[i] = '_';
- }
-
- newfilename = dirname + '/' + tmpfilename + ".xiz";
+ newfilename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz";
rename(ins[ninstrument].filename.c_str(), newfilename.c_str());
ins[ninstrument].filename = newfilename;
- ins[ninstrument].name = tmpfilename; //TODO limit name to PART_MAX_NAME_LEN
+ ins[ninstrument].name = legalizeFilename(tmpfilename); //TODO limit name to PART_MAX_NAME_LEN
}
/*
* Check if there is no instrument on a slot from the bank
*/
-int Bank::emptyslot(unsigned int ninstrument)
+bool Bank::emptyslot(unsigned int ninstrument)
{
if(ninstrument >= BANK_SIZE)
- return 1;
+ return true;
if(ins[ninstrument].filename.empty())
- return 1;
+ return true;
if(ins[ninstrument].used)
- return 0;
+ return false;
else
- return 1;
+ return true;
}
/*
@@ -181,28 +158,11 @@ void Bank::savetoslot(unsigned int ninstrument, Part *part)
if(tmpfilename[i] == ' ')
tmpfilename[i] = '0';
- //make the filenames legal
- for(int i = 0; i < (int)strlen(tmpfilename); i++) {
- char c = tmpfilename[i];
- if((c >= '0') && (c <= '9'))
- continue;
- if((c >= 'A') && (c <= 'Z'))
- continue;
- if((c >= 'a') && (c <= 'z'))
- continue;
- if((c == '-') || (c == ' '))
- continue;
-
- tmpfilename[i] = '_';
- }
-
- strncat(tmpfilename, ".xiz", maxfilename + 10);
-
- string filename = dirname + '/' + tmpfilename;
+ string filename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz";
remove(filename.c_str());
part->saveXML(filename.c_str());
- addtobank(ninstrument, tmpfilename, (char *) part->Pname);
+ addtobank(ninstrument, legalizeFilename(tmpfilename), (char *) part->Pname);
}
/*
@@ -218,7 +178,6 @@ void Bank::loadfromslot(unsigned int ninstrument, Part *part)
part->loadXMLinstrument(ins[ninstrument].filename.c_str());
}
-
/*
* Makes current a bank directory
*/
@@ -239,7 +198,7 @@ int Bank::loadbank(string bankdirname)
while((fn = readdir(dir))) {
const char *filename = fn->d_name;
- //sa verific daca e si extensia dorita
+ //check for extension
if(strstr(filename, INSTRUMENT_EXTENSION) == NULL)
continue;
@@ -257,9 +216,8 @@ int Bank::loadbank(string bankdirname)
}
}
-
if((startname + 1) < strlen(filename))
- startname++; //to take out the "-"
+ startname++; //to take out the "-"
string name = filename;
@@ -277,7 +235,6 @@ int Bank::loadbank(string bankdirname)
addtobank(-1, filename, name);
}
-
closedir(dir);
if(!dirname.empty())
@@ -331,24 +288,17 @@ int Bank::locked()
*/
void Bank::swapslot(unsigned int n1, unsigned int n2)
{
- //TODO use std::swap
if((n1 == n2) || (locked()))
return;
if(emptyslot(n1) && (emptyslot(n2)))
return;
- if(emptyslot(n1)) { //change n1 to n2 in order to make
- int tmp = n2;
- n2 = n1;
- n1 = tmp;
- }
+ if(emptyslot(n1)) //change n1 to n2 in order to make
+ swap(n1, n2);
if(emptyslot(n2)) { //this is just a movement from slot1 to slot2
setname(n1, getname(n1), n2);
ins[n2] = ins[n1];
- ins[n1].used = false;
- ins[n1].name.clear();
- ins[n1].filename.clear();
- ins[n1].info.PADsynth_used = 0;
+ ins[n1] = ins_t();
}
else { //if both slots are used
if(ins[n1].name == ins[n2].name) //change the name of the second instrument if the name are equal
@@ -356,16 +306,7 @@ void Bank::swapslot(unsigned int n1, unsigned int n2)
setname(n1, getname(n1), n2);
setname(n2, getname(n2), n1);
- ins_t tmp;
- tmp.used = true;
- tmp.name = ins[n2].name;
- string tmpfilename = ins[n2].filename;
- bool padsynth_used = ins[n2].info.PADsynth_used;
-
- ins[n2] = ins[n1];
- ins[n1].name = tmp.name;
- ins[n1].filename = tmpfilename;
- ins[n1].info.PADsynth_used = padsynth_used;
+ swap(ins[n2],ins[n1]);
}
}
@@ -381,10 +322,8 @@ bool Bank::bankstruct::operator<(const bankstruct &b) const
void Bank::rescanforbanks()
{
- for(int i = 0; i < MAX_NUM_BANKS; i++) {
- banks[i].dir.clear();
- banks[i].name.clear();
- }
+ //remove old banks
+ banks.clear();
for(int i = 0; i < MAX_BANK_ROOT_DIRS; i++)
if(!config.cfg.bankRootDirList[i].empty())
@@ -395,18 +334,13 @@ void Bank::rescanforbanks()
//remove duplicate bank names
int dupl = 0;
- for(int j = 0; j < banks.size() - 1; j++) {
- for(int i = j + 1; i < banks.size(); i++) {
- if(banks[i].name.empty() || banks[j].name.empty())
- continue;
- if(banks[i].name == banks[j].name) { //add a [1] to the first bankname and [n] to others
- char *tmpname = new char[strlen(tmpname) + 100];
- sprintf(tmpname, "%s[%d]", tmpname, dupl + 2);
- banks[i].name = tmpname;
- delete[] tmpname;
-
+ for(unsigned int j = 0; j < banks.size() - 1; j++) {
+ for(unsigned int i = j + 1; i < banks.size(); i++) {
+ if(banks[i].name == banks[j].name) {
+ //add a [1] to the first bankname and [n] to others
+ banks[i].name = banks[i].name + '[' + stringFrom(dupl +2) + ']';
if(dupl == 0)
- banks[i].name += "[1]";
+ banks[j].name += "[1]";
dupl++;
}
@@ -417,7 +351,6 @@ void Bank::rescanforbanks()
}
-
// private stuff
void Bank::scanrootdir(string rootdir)
@@ -426,7 +359,6 @@ void Bank::scanrootdir(string rootdir)
if(dir == NULL)
return;
- const int maxdirsize = 1000;
bankstruct bank;
const char *separator = "/";
@@ -457,26 +389,14 @@ void Bank::scanrootdir(string rootdir)
if((strstr(fname->d_name, INSTRUMENT_EXTENSION) != NULL)
|| (strstr(fname->d_name, FORCE_BANK_DIR_FILE) != NULL)) {
isbank = true;
- break; //aici as putea pune in loc de break un update la un counter care imi arata nr. de instrumente din bank
+ break; //could put a #instrument counter here instead
}
}
- closedir(d);
-
- if(isbank) {
- int pos = -1;
- for(int i = 1; i < MAX_NUM_BANKS; i++) { //banks[0] e liber intotdeauna
- if(banks[i].name.empty()) {
- pos = i;
- break;
- }
- }
+ if(isbank)
+ banks.push_back(bank);
- if(pos >= 0) {
- banks[pos].name = bank.name;
- banks[pos].dir = bank.dir;
- }
- }
+ closedir(d);
}
closedir(dir);
@@ -484,7 +404,8 @@ void Bank::scanrootdir(string rootdir)
void Bank::clearbank()
{
- banks.clear();
+ for(int i = 0; i < BANK_SIZE; ++i)
+ ins[i] = ins_t();
bankfiletitle.clear();
dirname.clear();
@@ -494,34 +415,29 @@ int Bank::addtobank(int pos, string filename, string name)
{
if((pos >= 0) && (pos < BANK_SIZE)) {
if(ins[pos].used)
- pos = -1; //force it to find a new free position
+ pos = -1; //force it to find a new free position
}
else
- if(pos >= BANK_SIZE)
- pos = -1;
+ if(pos >= BANK_SIZE)
+ pos = -1;
if(pos < 0) { //find a free position
- for(int i = BANK_SIZE - 1; i >= 0; i--)
+ for(int i = BANK_SIZE - 1; i >= 0; i--) {
if(!ins[i].used) {
pos = i;
break;
}
- ;
+ }
}
if(pos < 0)
- return -1; //the bank is full
-
- // printf("%s %d\n",filename,pos);
+ return -1;//the bank is full
deletefrombank(pos);
ins[pos].used = true;
ins[pos].name = name;
-
- snprintf(tmpinsname[pos], PART_MAX_NAME_LEN + 10, " ");
-
ins[pos].filename = dirname + '/' + filename;
//see if PADsynth is used
@@ -548,12 +464,14 @@ bool Bank::isPADsynth_used(unsigned int ninstrument)
void Bank::deletefrombank(int pos)
{
- if((pos < 0) || (pos >= banks.size()))
+ if((pos < 0) || (pos >= (int) banks.size()))
return;
- ins[pos].used = false;
- ins[pos].name.clear();
- ins[pos].filename.clear();
+ ins[pos] = ins_t();
+}
- ZERO(tmpinsname[pos], PART_MAX_NAME_LEN + 20);
+Bank::ins_t::ins_t()
+ :used(false), name(""), filename("")
+{
+ info.PADsynth_used = false;
}
diff --git a/src/Misc/Bank.h b/src/Misc/Bank.h
@@ -30,13 +30,9 @@
#include "XMLwrapper.h"
#include "Part.h"
+//entries in a bank
#define BANK_SIZE 160
-/**
- * The max. number of banks that are used
- */
-#define MAX_NUM_BANKS 400
-
/**The instrument Bank*/
class Bank
{
@@ -49,9 +45,8 @@ class Bank
void setname(unsigned int ninstrument, const std::string newname, int newslot); //if newslot==-1 then this is ignored, else it will be put on that slot
bool isPADsynth_used(unsigned int ninstrument);
- /**returns 0 if the slot is not empty or 1 if the slot is empty
- * \todo start using bool before facepalm*/
- int emptyslot(unsigned int ninstrument);
+ /**returns true when slot is empty*/
+ bool emptyslot(unsigned int ninstrument);
/**Empties out the selected slot*/
void clearslot(unsigned int ninstrument);
@@ -91,9 +86,9 @@ class Bank
void clearbank();
std::string defaultinsname;
- char tmpinsname[BANK_SIZE][PART_MAX_NAME_LEN + 20]; //this keeps the numbered names
struct ins_t {
+ ins_t();
bool used;
std::string name;
std::string filename;
diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp
@@ -142,4 +142,14 @@ void os_sleep(long length)
Sleep((long)length/1000);
#endif
}
-
+
+std::string legalizeFilename(std::string filename)
+{
+ for(int i = 0; i < (int) filename.size(); i++) {
+ char c = filename[i];
+ if(!(isdigit(c) || isalpha(c) || (c == '-') || (c == ' ')))
+ filename[i] = '_';
+ }
+ return filename;
+}
+
diff --git a/src/Misc/Util.h b/src/Misc/Util.h
@@ -47,6 +47,8 @@ void set_realtime();
/**Os independent sleep in microsecond*/
void os_sleep(long length);
+std::string legalizeFilename(std::string filename);
+
extern REALTYPE *denormalkillbuf; /**<the buffer to add noise in order to avoid denormalisation*/
extern Config config;
diff --git a/src/Params/PresetsStore.cpp b/src/Params/PresetsStore.cpp
@@ -144,11 +144,7 @@ void PresetsStore::copypreset(XMLwrapper *xml, char *type, string name)
return;
//make the filenames legal
- for(int i = 0; i < (int) name.size(); i++) {
- char c = name[i];
- if(!(isdigit(c) || isalpha(c) || (c == '-') || (c == ' ')))
- name[i] = '_';
- }
+ name = legalizeFilename(name);
//make path legal
const string dirname = config.cfg.presetsDirList[0];
diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl
@@ -76,17 +76,20 @@ highlight=0;
refresh();} {}
}
Function {refresh()} {} {
- code {if (bank->emptyslot(nslot)) {
- color(46);
-} else {
- if (bank->isPADsynth_used(nslot)) color(26);
- else color(51);
-};
+ code {if (bank->emptyslot(nslot))
+ color(46);
+else if (bank->isPADsynth_used(nslot))
+ color(26);
+else
+ color(51);
+
-if (*nselected==nslot) color(6);
+if (*nselected==nslot)
+ color(6);
-label(bank->getnamenumbered(nslot).c_str());} {}
+copy_label(bank->getnamenumbered(nslot).c_str());} {selected
+ }
}
decl {int *what,*whatslot,nslot,highlight, *nselected;} {}
decl {void (BankProcess_:: *fnc)(void);} {}
@@ -318,8 +321,8 @@ if (bank->locked()){
clearbutton->activate();
swapbutton->activate();
};
-for (int i=0;i<BANK_SIZE;i++) bs[i]->refresh();} {selected
- }
+for (int i=0;i<BANK_SIZE;i++)
+ bs[i]->refresh();} {}
}
Function {removeselection()} {} {
code {if (nselected>=0) {
@@ -333,8 +336,7 @@ for (int i=0;i<BANK_SIZE;i++) bs[i]->refresh();} {selected
banklist->add(" ");
bank->rescanforbanks();
-for (int i=1;i<MAX_NUM_BANKS;i++) {
- if (!bank->banks[i].name.empty())
+for (unsigned int i=1;i<bank->banks.size();i++) {
banklist->add(bank->banks[i].name.c_str());
};} {}
}