summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2018-10-06 11:13:03 +0200
committerBent Bisballe Nyeng <deva@aasimon.org>2018-10-06 11:13:03 +0200
commit0e2db9214ff3d6cbe4388224f405bc5d67d6a8d3 (patch)
tree8c10a15879a346b2697e95f5ea3d841f797e1f05
parent5584b748a7e75a1f8b582ba9227dc08b2b2c5649 (diff)
Add (automatic) samplerate detection to the project.
-rw-r--r--src/filelist.cc38
-rw-r--r--src/project.cc18
-rw-r--r--src/project.h6
-rw-r--r--src/projectrenderer.cc1
-rw-r--r--src/projectserialiser.cc2
5 files changed, 64 insertions, 1 deletions
diff --git a/src/filelist.cc b/src/filelist.cc
index da7f399..9c6f591 100644
--- a/src/filelist.cc
+++ b/src/filelist.cc
@@ -47,6 +47,8 @@
#include <QPainter>
#include <QHeaderView>
+#include <sndfile.h>
+
class ChannelMapDeligate
: public QStyledItemDelegate
{
@@ -423,6 +425,18 @@ FileList::FileList(Instrument& instrument)
createMenus();
}
+static double getSamplerate(const QString& file)
+{
+ SF_INFO sf_info;
+ SNDFILE *fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info);
+ if(!fh)
+ {
+ return -1.0;
+ }
+
+ return sf_info.samplerate;
+}
+
void FileList::addFiles()
{
auto root = instrument.getProject().getRawFileRoot();
@@ -441,6 +455,30 @@ void FileList::addFiles()
QFileInfo fi(file);
QString name = fi.baseName();
path = fi.absolutePath();
+
+ double samplerate = getSamplerate(file);
+ if(samplerate == -1.0)
+ {
+ // Error reading file. Skip it.
+ std::cout << "Error reading file. Skip it.\n";
+ ++i;
+ continue;
+ }
+
+ if(instrument.getProject().getProjectSamplerate() == -1.0)
+ {
+ // Samplerate not yet set
+ instrument.getProject().setProjectSamplerate(samplerate);
+ }
+
+ if(instrument.getProject().getProjectSamplerate() != samplerate)
+ {
+ // Samplerate of file differs from the projeft samplerate
+ std::cout << "Samplerate of file differs from the project samplerate:\n";
+ std::cout << " project: " << instrument.getProject().getProjectSamplerate() << std::endl;
+ std::cout << " file: " << samplerate << std::endl;
+ }
+
if(root == file.left(root.length()))
{
file = file.mid(root.length() + 1);
diff --git a/src/project.cc b/src/project.cc
index 5cadcd4..e592439 100644
--- a/src/project.cc
+++ b/src/project.cc
@@ -501,6 +501,24 @@ void Project::setProjectDescription(const QString& description)
}
}
+double Project::getProjectSamplerate() const
+{
+ return samplerate;
+}
+
+void Project::setProjectSamplerate(double samplerate)
+{
+ if(this->samplerate == samplerate)
+ {
+ return;
+ }
+
+ {
+ Project::RAIIBulkUpdate bulkUpdate(*this);
+ this->samplerate = samplerate;
+ }
+}
+
Instrument& Project::getInstrument(int id)
{
for(auto& instrument : instruments)
diff --git a/src/project.h b/src/project.h
index b3456f6..3e2b886 100644
--- a/src/project.h
+++ b/src/project.h
@@ -202,7 +202,10 @@ public:
void setExportPath(const QString& prefix);
QString getProjectDescription() const;
- void setProjectDescription(const QString& prefix);
+ void setProjectDescription(const QString& description);
+
+ double getProjectSamplerate() const;
+ void setProjectSamplerate(double samplerate);
Instrument& getInstrument(int id);
int createInstrument();
@@ -228,6 +231,7 @@ private:
QString raw_file_root;
QString export_path;
QString description;
+ double samplerate{-1.0};
std::list<Instrument> instruments;
std::list<Channel> channels;
diff --git a/src/projectrenderer.cc b/src/projectrenderer.cc
index d266fef..4d87b73 100644
--- a/src/projectrenderer.cc
+++ b/src/projectrenderer.cc
@@ -55,6 +55,7 @@ void ProjectRenderer::render()
drumkit.setAttribute("version", "1.0");
drumkit.setAttribute("name", project.getProjectName());
drumkit.setAttribute("description", project.getProjectDescription());
+ drumkit.setAttribute("smaplerate", project.getProjectSamplerate());
doc.appendChild(drumkit);
QDomElement channels = doc.createElement("channels");
diff --git a/src/projectserialiser.cc b/src/projectserialiser.cc
index 8985daa..64824dd 100644
--- a/src/projectserialiser.cc
+++ b/src/projectserialiser.cc
@@ -137,6 +137,7 @@ QString ProjectSerialiser::serialise(const Project& project)
dgedit.appendChild(export_path);
dgedit.setAttribute("next_id", project.next_id);
+ dgedit.setAttribute("samplerate", project.samplerate);
auto channels = doc.createElement("channels");
dgedit.appendChild(channels);
@@ -237,6 +238,7 @@ bool ProjectSerialiser::deserialise(const QString& data, Project& project)
}
project.next_id = dom["next_id"].toInt();
+ project.samplerate = dom["samplerate"].toDouble();
project.project_name = dom("project_name").text();
project.raw_file_root = dom("raw_file_root").text();
project.description = dom("description").text();