summaryrefslogtreecommitdiff
path: root/tools/resample_session.pl
diff options
context:
space:
mode:
authorSampo Savolainen <v2@iki.fi>2007-04-15 20:47:21 +0000
committerSampo Savolainen <v2@iki.fi>2007-04-15 20:47:21 +0000
commitfbdd0ab815e7829db93bc27f8c6e508b7da94921 (patch)
tree06aab11aadecdf01e29070ca5166e882ec134e29 /tools/resample_session.pl
parent0e8e5ddd90a38f58328edf1cf07613917f406300 (diff)
Added the session resampler which now should work for 2.0 sessions and
almost work for 0.99 originated session (automation is not handled yet). Stopped the creation on the automation/ directory in new sessions as it's not used anymore git-svn-id: svn://localhost/ardour2/trunk@1725 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'tools/resample_session.pl')
-rwxr-xr-xtools/resample_session.pl201
1 files changed, 201 insertions, 0 deletions
diff --git a/tools/resample_session.pl b/tools/resample_session.pl
new file mode 100755
index 0000000000..c6a390f480
--- /dev/null
+++ b/tools/resample_session.pl
@@ -0,0 +1,201 @@
+#!/usr/bin/env perl
+# Ardour session resampler, version 0.1
+# (c)Sampo Savolainen 2005-2007
+#
+# Licensed under the GPL
+#
+# Copies the session to another directory and changes it's sampling rate in all respects.
+# The frames in .ardour and .automation files are converted according to the conversion ration.
+# The peakfiles and dead_sounds aren't copied. Only "identified" files are copied, instant.xml's
+# or .bak's aren't copied either.
+
+use XML::Parser::PerlSAX;
+use XML::Handler::XMLWriter;
+use IO::Handle;
+
+use File::Basename;
+
+use ARDOUR::SessionSRHandler;
+# Let's hope this is never needed
+#use ARDOUR::AutomationSRConverter;
+
+
+if ( ! -f "/usr/bin/sndfile-resample" &&
+ ! -f "/usr/local/bin/sndfile-resample") {
+ print "You don't have sndfile-resample installed. This script will not work without it, please install it and try again\n";
+ exit;
+}
+
+my ($sourceDirectory, $destDirectory, $sourceSR, $destSR) = @ARGV;
+
+if ((@ARGV+0) ne 4 ||
+ ($sourceSR+0) eq 0 ||
+ ($destSR+0) eq 0) {
+ print "usage: ardour_sr.pl [ardour session directory] [destination directory] [original samplerate] [new samplerate]\n";
+ exit;
+}
+
+if ( ! -d $sourceDirectory) {
+ print $sourceDirectory.": directory does not exist!\n";
+ exit;
+}
+
+if ( -d $destDirectory) {
+ print $destDirectory.": directory exists!\n";
+ exit;
+}
+
+print "Checking source and destination directories\n";
+
+my @sounds;
+my @dead_sounds;
+my @dot_ardour;
+my @automation;
+
+
+my $version_099x = 0;
+
+# Read the names of all audio files in /sounds/
+if ( -d $sourceDirectory."/sounds/") {
+ $version_099x = 1;
+
+ opendir(SOUNDS,$sourceDirectory."/sounds/") || die ($sourceDirectory.": not a valid session, no sounds/ directory");
+ while ( my $file=readdir(SOUNDS) ) {
+ if ( -f $sourceDirectory."/sounds/".$file ) {
+ push(@sounds,$file);
+ }
+ }
+
+} else {
+ my $dirname = $sourceDirectory."/interchange/".basename($sourceDirectory)."/audiofiles/";
+ opendir(SOUNDS,$dirname) || die ($sourceDirectory.": not a valid session, no sounds/ directory");
+ while ( my $file=readdir(SOUNDS) ) {
+ if ( -f $dirname.$file ) {
+ push(@sounds,$file);
+ }
+ }
+
+}
+close(SOUNDS);
+
+# Read the names of all audio files in /dead_sounds/
+opendir(DEAD_SOUNDS,$sourceDirectory."/dead_sounds/") || die ($sourceDirectory.": not a valid session, no dead_sounds/ directory");
+while ( my $file=readdir(DEAD_SOUNDS) ) {
+ if ( -f $sourceDirectory."/dead_sounds/".$file ) {
+ push(@dead_sounds,$file);
+ }
+}
+close(DEAD_SOUNDS);
+
+# Read the names of all .ardour files in /
+opendir(DOT_ARDOUR,$sourceDirectory) || die ($sourceDirectory.": could not open!");
+while ( my $file=readdir(DOT_ARDOUR) ) {
+ if ( -f $sourceDirectory."/".$file &&
+ index($file,".ardour") eq (length($file)-7)) {
+ push(@dot_ardour,$file);
+ }
+}
+close(DOT_ARDOUR);
+
+# Read the names of all automation files in /automation/
+opendir(AUTOMATION,$sourceDirectory."/automation/") || die ($sourceDirectory."/automation: could not open!");
+while ( my $file=readdir(AUTOMATION) ) {
+ if ( -f $sourceDirectory."/automation/".$file &&
+ index($file,".automation") eq (length($file)-11)) {
+ push(@automation,$file);
+ }
+}
+close(AUTOMATION);
+
+# Check for /peaks/
+if ( ! -d $sourceDirectory."/peaks" ) {
+ print $sourceDirectory.": not a valid session, no peaks/ directory\n";
+ exit;
+}
+
+##########################################
+# Checks are done, let's go!
+
+print "Converting session\n";
+mkdir $destDirectory;
+
+
+# Run all .ardour files through the SAX parser and write the results in the destination
+# directory.
+
+foreach my $xml (@dot_ardour) {
+ print "Doing samplerate conversion to ".$xml."...";
+ open(OUTFILE,">".$destDirectory."/".$xml);
+ my $output = new IO::Handle;
+ $output->fdopen(fileno(OUTFILE),"w");
+
+ my $handler = ARDOUR::SessionSRHandler->new($sourceSR,$destSR,$output);
+
+ my $parser = XML::Parser::PerlSAX->new( Handler => $handler );
+
+ $parser->parse(Source => { SystemId => $sourceDirectory."/".$xml });
+
+ $output->close();
+ close(OUTFILE);
+ print " done\n";
+}
+
+# This code is needed for 0.99.x sessions, thus the code is still here.
+#
+#mkdir $destDirectory."/automation";
+#
+#foreach my $file (@automation) {
+# print "Converting automation file ".$file."...";
+# open(INFILE,$sourceDirectory."/automation/".$file) || die "could not open source automation file $file!";
+# open(OUTFILE,">".$destDirectory."/automation/".$file) || die "could not open destination automation file $file!";
+# my $input=new IO::Handle;
+# my $output=new IO::Handle;
+#
+# $input->fdopen(fileno(INFILE),"r");
+# $output->fdopen(fileno(OUTFILE),"w");
+#
+# my $converter = ARDOUR::AutomationSRConverter->new($input,$output,$sourceSR,$destSR);
+# $converter->convert;
+#
+# $input->close;
+# $output->close;
+# close(INFILE);
+# close(OUTFILE);
+# print " done\n";
+#}
+
+
+if ($version_099x eq 1) {
+ mkdir $destDirectory."/sounds";
+ foreach my $sound (@sounds) {
+ my @params=("-to", $destSR,
+ "-c", "0",
+ $sourceDirectory."/sounds/".$sound,
+ $destDirectory."/sounds/".$sound);
+ system("sndfile-resample",@params);
+ }
+} else {
+ my $srcSndDir = $sourceDirectory."/interchange/".basename($sourceDirectory)."/audiofiles/";
+
+ my $dstSndDir = $destDirectory."/interchange/";
+ mkdir $dstSndDir;
+
+ $dstSndDir .= basename($sourceDirectory)."/";
+ mkdir $dstSndDir;
+
+ $dstSndDir .= "audiofiles/";
+ mkdir $dstSndDir;
+
+ foreach my $sound (@sounds) {
+ my @params=("-to", $destSR,
+ "-c", "0",
+ $srcSndDir."/".$sound,
+ $dstSndDir."/".$sound);
+ system("sndfile-resample",@params);
+ }
+}
+
+mkdir $destDirectory."/dead_sounds";
+mkdir $destDirectory."/peaks";
+
+