#include <sndfile.h>
#include <samplerate.h>
+#include <glibmm.h>
+
#include <pbd/basename.h>
+
#include <ardour/ardour.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
-#include <ardour/filesource.h>
+#include <ardour/audio_diskstream.h>
+#include <ardour/sndfilesource.h>
#include <ardour/sndfile_helpers.h>
#include <ardour/audioregion.h>
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
-#define BLOCKSIZE 2048U
+#define BLOCKSIZE 4096U
int
Session::import_audiofile (import_status& status)
{
SNDFILE *in;
- FileSource **newfiles = 0;
- ARDOUR::AudioRegion::SourceList sources;
+ AudioFileSource **newfiles = 0;
+ AudioRegion::SourceList sources;
SF_INFO info;
float *data = 0;
Sample **channel_data = 0;
+ char * workbuf = 0;
long nfiles = 0;
long n;
string basepath;
jack_nframes_t so_far;
char buf[PATH_MAX+1];
int ret = -1;
- vector<AudioRegion *> new_regions;
vector<string> new_paths;
struct tm* now;
string tmp_convert_file;
+ status.new_regions.clear ();
+
if ((in = sf_open (status.pathname.c_str(), SFM_READ, &info)) == 0) {
- error << compose(_("Import: cannot open input sound file \"%1\""), status.pathname) << endmsg;
+ error << string_compose(_("Import: cannot open input sound file \"%1\""), status.pathname) << endmsg;
return -1;
} else {
if ((uint32_t) info.samplerate != frame_rate()) {
// resample to session frame_rate
if (sample_rate_convert(status, status.pathname, tmp_convert_file)) {
if ((in = sf_open (tmp_convert_file.c_str(), SFM_READ, &info)) == 0) {
- error << compose(_("Import: cannot open converted sound file \"%1\""), tmp_convert_file) << endmsg;
+ error << string_compose(_("Import: cannot open converted sound file \"%1\""), tmp_convert_file) << endmsg;
return -1;
}
} else if (!status.cancel){
// error
- error << compose(_("Import: error while resampling sound file \"%1\""), status.pathname) << endmsg;
+ error << string_compose(_("Import: error while resampling sound file \"%1\""), status.pathname) << endmsg;
return -1;
} else {
// canceled
}
}
- newfiles = new FileSource *[info.channels];
+ newfiles = new AudioFileSource *[info.channels];
for (n = 0; n < info.channels; ++n) {
newfiles[n] = 0;
}
try {
- newfiles[n] = new FileSource (buf, frame_rate());
+ newfiles[n] = new SndFileSource (buf,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate ());
}
catch (failed_constructor& err) {
- error << compose(_("Session::import_audiofile: cannot open new file source for channel %1"), n+1) << endmsg;
+ error << string_compose(_("Session::import_audiofile: cannot open new file source for channel %1"), n+1) << endmsg;
goto out;
}
data = new float[BLOCKSIZE * info.channels];
channel_data = new Sample * [ info.channels ];
-
+ workbuf = new char[BLOCKSIZE * 4];
+
for (n = 0; n < info.channels; ++n) {
channel_data[n] = new Sample[BLOCKSIZE];
}
/* flush to disk */
for (chn = 0; chn < info.channels; ++chn) {
- newfiles[chn]->write (channel_data[chn], nread);
+ newfiles[chn]->write (channel_data[chn], nread, workbuf);
}
so_far += nread;
sources.push_back(newfiles[n]);
}
- AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (PBD::basename(basepath)),
+ AudioRegion *r = new AudioRegion (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)),
0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
- new_regions.push_back (r);
+ status.new_regions.push_back (r);
} else {
for (n = 0; n < nfiles && !status.cancel; ++n) {
did not bother to create whole-file AudioRegions for them. Do it now.
*/
- AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (PBD::basename (newfiles[n]->name())),
+ AudioRegion *r = new AudioRegion (*newfiles[n], 0, newfiles[n]->length(), region_name_from_path (Glib::path_get_basename (newfiles[n]->name())),
0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import));
- new_regions.push_back (r);
+ status.new_regions.push_back (r);
}
}
if (data) {
delete [] data;
}
-
+ if (workbuf) {
+ delete [] workbuf;
+ }
+
if (channel_data) {
for (n = 0; n < info.channels; ++n) {
delete [] channel_data[n];
}
if (status.cancel) {
- for (vector<AudioRegion *>::iterator i = new_regions.begin(); i != new_regions.end(); ++i) {
+ for (vector<AudioRegion *>::iterator i = status.new_regions.begin(); i != status.new_regions.end(); ++i) {
delete *i;
}
string
Session::build_tmp_convert_name(string infile)
{
- string tmp_name(_path + "/." + PBD::basename (infile.c_str()) + "XXXXXX");
+ string tmp_name(_path + "/." + Glib::path_get_basename (infile.c_str()) + "XXXXXX");
char* tmp = new char[tmp_name.length() + 1];
tmp_name.copy(tmp, string::npos);
tmp[tmp_name.length()] = 0;
outfile = build_tmp_convert_name(infile);
SNDFILE* out = sf_open(outfile.c_str(), SFM_RDWR, &sf_info);
if(!out) {
- error << compose(_("Import: could not open temp file: %1"), outfile) << endmsg;
+ error << string_compose(_("Import: could not open temp file: %1"), outfile) << endmsg;
return false;
}
/* Initialize the sample rate converter. */
if ((src_state = src_new (SRC_SINC_BEST_QUALITY, sf_info.channels, &err)) == 0) {
- error << compose(_("Import: src_new() failed : %1"), src_strerror (err)) << endmsg ;
+ error << string_compose(_("Import: src_new() failed : %1"), src_strerror (err)) << endmsg ;
return false ;
}
}
if ((err = src_process (src_state, &src_data))) {
- error << compose(_("Import: %1"), src_strerror (err)) << endmsg ;
+ error << string_compose(_("Import: %1"), src_strerror (err)) << endmsg ;
return false ;
}