summaryrefslogtreecommitdiff
path: root/tools/resample_session.pl
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-04-26 20:54:31 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-04-26 20:54:31 +0000
commit87726495c30f90554b5204b5385d17274a8fe93e (patch)
treed7ecaf0be9b5cbd2afa226cd02cb53a36875d6a2 /tools/resample_session.pl
parent45d3ec1437cf661533bc7750c623865def4424df (diff)
Merged changes from trunk 1699:1751 into 2.1-staging
git-svn-id: svn://localhost/ardour2/branches/2.1-staging@1752 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";
+
+