From 8040f48974d88c6d30dff720a2ffb27e0cf54814 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 23 Sep 2018 16:13:37 +0200 Subject: Integrate channel map into file list in instrument editor. --- src/audioextractor.cc | 119 +++++++++++++++----------------------------------- 1 file changed, 36 insertions(+), 83 deletions(-) (limited to 'src/audioextractor.cc') diff --git a/src/audioextractor.cc b/src/audioextractor.cc index 2132cba..50f2947 100644 --- a/src/audioextractor.cc +++ b/src/audioextractor.cc @@ -43,17 +43,18 @@ typedef struct float *data; } audiodata_t; -AudioExtractor::AudioExtractor(Instrument& instrument, Selections &selections, - QObject *parent) +AudioExtractor::AudioExtractor(Instrument& instrument, QObject *parent) : QObject(parent) , instrument(instrument) - , selections(selections) { - audiofiles = instrument.getFileList(); } void AudioExtractor::exportSelections() { + auto selections = instrument.getSelections(); + auto exportpath = instrument.getProject().getExportPath(); + auto prefix = instrument.getPrefix(); + int samplerate = -1; emit setMaximumProgress(selections.ids().size() + 1/* for xml writing*/); int progress = 0; @@ -61,19 +62,20 @@ void AudioExtractor::exportSelections() qApp->processEvents(); // Open all input audio files: - audiodata_t audiodata[audiofiles.size()]; + auto audiofile_ids = instrument.getAudioFileList(); + audiodata_t audiodata[audiofile_ids.size()]; int idx = 0; - AudioFileList::iterator j = audiofiles.begin(); - while(j != audiofiles.end()) + for(auto audiofile_id : audiofile_ids) { - QString file = j->first; + const auto& audiofile = instrument.getAudioFile(audiofile_id); + QString file = audiofile.getFile(); SF_INFO sf_info; audiodata[idx].fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info); if(!audiodata[idx].fh) { - printf("Load error '%s'\n", file.toStdString().c_str()); + printf("AudioExtractor load error '%s'\n", file.toStdString().c_str()); return; } @@ -85,7 +87,6 @@ void AudioExtractor::exportSelections() audiodata[idx].data = NULL; - j++; idx++; } @@ -127,7 +128,7 @@ void AudioExtractor::exportSelections() // Read all input audio file chunks: - for(int i = 0; i < audiofiles.size(); i++) + for(int i = 0; i < audiofile_ids.size(); i++) { // Clear out old buffer (if one exists) if(audiodata[i].data) @@ -175,23 +176,23 @@ void AudioExtractor::exportSelections() SF_INFO sf_info; sf_info.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; sf_info.samplerate = samplerate; - sf_info.channels = audiofiles.size(); + sf_info.channels = audiofile_ids.size(); SNDFILE *ofh = sf_open(file.toStdString().c_str(), SFM_WRITE, &sf_info); if(!ofh) { - printf("Open for write error...\n"); + printf("Open for write error. %s\n", file.toStdString().c_str()); return; } for(size_t ob = 0; ob < size; ob++) { - float obuf[audiofiles.size()]; - for(int ai = 0; ai < audiofiles.size(); ai++) + float obuf[audiofile_ids.size()]; + for(int ai = 0; ai < audiofile_ids.size(); ai++) { obuf[ai] = audiodata[ai].data[ob]; } - sf_write_float(ofh, obuf, audiofiles.size()); + sf_write_float(ofh, obuf, audiofile_ids.size()); } sf_close(ofh); @@ -203,7 +204,7 @@ void AudioExtractor::exportSelections() } // Close all input audio files: - for(int i = 0; i < audiofiles.size(); i++) + for(int i = 0; i < audiofile_ids.size(); i++) { if(audiodata[i].data) { @@ -219,13 +220,13 @@ void AudioExtractor::exportSelections() doc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); doc.appendChild(header); - QDomElement instrument = doc.createElement("instrument"); - instrument.setAttribute("version", INSTRUMENT_VERSION); - instrument.setAttribute("name", prefix); - doc.appendChild(instrument); + QDomElement instrument_node = doc.createElement("instrument"); + instrument_node.setAttribute("version", INSTRUMENT_VERSION); + instrument_node.setAttribute("name", prefix); + doc.appendChild(instrument_node); QDomElement samples = doc.createElement("samples"); - instrument.appendChild(samples); + instrument_node.appendChild(samples); { // Do the adding to the xml file one sample at the time. @@ -246,20 +247,21 @@ void AudioExtractor::exportSelections() selections.update(*si, i); int channelnum = 1; // Filechannel numbers are 1-based. - AudioFileList::iterator j = audiofiles.begin(); - while(j != audiofiles.end()) + + for(auto audiofile_id : audiofile_ids) { - QString file = j->first; - QString name = j->second; - - QDomElement audiofile = doc.createElement("audiofile"); - audiofile.setAttribute("file", "samples/" + - QString::number(index) + "-" + prefix + ".wav"); - audiofile.setAttribute("channel", name); - audiofile.setAttribute("filechannel", QString::number(channelnum)); - sample.appendChild(audiofile); + const auto& audiofile = instrument.getAudioFile(audiofile_id); + + QString file = audiofile.getFile(); + QString name = audiofile.getName(); + + QDomElement audiofile_node = doc.createElement("audiofile"); + audiofile_node.setAttribute("file", "samples/" + + QString::number(index) + "-" + prefix + ".wav"); + audiofile_node.setAttribute("channel", name); + audiofile_node.setAttribute("filechannel", QString::number(channelnum)); + sample.appendChild(audiofile_node); channelnum++; - j++; } si++; @@ -274,52 +276,3 @@ void AudioExtractor::exportSelections() emit progressUpdate(progress++); qApp->processEvents(); } - -void AudioExtractor::addFile(QString file, QString name) -{ - QPair pair; - pair.first = file; - pair.second = name; - audiofiles.push_back(pair); - instrument.setFileList(audiofiles); -} - -void AudioExtractor::removeFile(QString file, QString name) -{ - AudioFileList::iterator j = audiofiles.begin(); - while(j != audiofiles.end()) - { - if(file == j->first/* && name == j->second*/) - { - audiofiles.erase(j); - break; - } - j++; - } - instrument.setFileList(audiofiles); -} - -void AudioExtractor::setOutputPrefix(const QString &p) -{ - prefix = p; -} - -void AudioExtractor::setExportPath(const QString &path) -{ - exportpath = path; -} - -void AudioExtractor::changeName(QString file, QString name) -{ - AudioFileList::iterator j = audiofiles.begin(); - while(j != audiofiles.end()) - { - if(file == j->first) - { - j->second = name; - break; - } - j++; - } - instrument.setFileList(audiofiles); -} -- cgit v1.2.3