From 0e2db9214ff3d6cbe4388224f405bc5d67d6a8d3 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 6 Oct 2018 11:13:03 +0200 Subject: Add (automatic) samplerate detection to the project. --- src/filelist.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/project.cc | 18 ++++++++++++++++++ src/project.h | 6 +++++- src/projectrenderer.cc | 1 + src/projectserialiser.cc | 2 ++ 5 files changed, 64 insertions(+), 1 deletion(-) 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 #include +#include + 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 instruments; std::list 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(); -- cgit v1.2.3