#!/usr/bin/perl -w # Audio::LADSPA perl modules for interfacing with LADSPA plugins # Copyright (C) 2003 Joost Diepenmaat. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See the COPYING file for more information. use strict; use Audio::LADSPA; use Getopt::Long; use Pod::Usage; use Config; my $so = $Config{'so'}; my $verbose = 0; my @label; my @id; my @libs; my $help; my $short; my $list_ports; my @package; GetOptions( 'verbose!' => \$verbose, 'library=s' => \@libs, 'id=i' => \@id, 'label=s' => \@label, 'help|?' => \$help, 'short!' => \$short, 'ports!' => \$list_ports, 'package=s' => \@package, ) && @ARGV == 0 or pod2usage(-verbose=>0,-exitval => 1); pod2usage( -verbose => 2, -exitval => 0) if $help; sub verbose { print STDERR @_ if $verbose; } my @plugins; my @libraries; if (@libs) { for my $lib (@libs) { my $lib_class; verbose("searching for library $lib...\n"); if ($lib =~ m#^/#) { $lib .= ".$so" unless $lib =~ /\.$so$"/; ($lib_class) = grep { $_->library_file() eq $lib } Audio::LADSPA->libraries; unless ($lib_class) { verbose("not already loaded, trying to load library directly\n"); if (-f $lib) { $lib_class = Audio::LADSPA->load($lib); } else { die "no library file $lib found.\n"; } } } else { ($lib_class) = grep { $_->library_file() =~ /(^|\/)\Q$lib\E(\.$so)?$/ } Audio::LADSPA->libraries; verbose("cannot find library in LADSPA_PATH, try specfiying the full path to the library (.$so) file\n") unless $lib_class; } die "cannot find library $lib anywhere.\n" unless $lib_class; push @libraries,$lib_class; push @plugins, $lib_class->plugins; } } else { verbose("all libraries in LADSPA_PATH should be examined\n"); @libraries = Audio::LADSPA->libraries; @plugins = Audio::LADSPA->plugins; } if (@label) { my @filt; for my $label (@label) { push @filt, grep { $_->label eq $label } @plugins; } @plugins = @filt; } if (@id) { my @filt; for my $id (@id) { push @filt, grep { $_->id == $id } @plugins; } @plugins = @filt; } if (@package) { @plugins = @package; for (@package) { unless ($_->isa('Audio::LADSPA::Plugin')) { verbose("trying to load $_ as a perl module\n"); eval "use $_;"; } } } die "no matching plugins found\n" unless @plugins; verbose(scalar @plugins," plugins found in ",scalar @libraries," libraries\n"); @plugins = sort @plugins; my @plug_fields = qw(label id); push @plug_fields, qw(name maker copyright port_count is_realtime is_hard_rt_capable is_inplace_broken has_run has_run_adding has_activate has_deactivate) unless $short; for my $lib ( sort @libraries ) { verbose("library $lib\n"); my $seen_lib = 0; for my $plug (@plugins) { if (grep { $_ eq $plug } $lib->plugins) { print "$lib (",$lib->library_file,")\n" unless $seen_lib++; print " $plug\n"; for (@plug_fields) { if (! /^(is|has)/ and defined $plug->$_) { print "\t$_:\t",$plug->$_,"\n"; } if (/^(is|has)/) { print "\t$_:\t",$plug->$_ ? "yes" : "no","\n"; } } next unless $list_ports; for my $port ($plug->ports) { print "\t$port\n"; for (qw(is_input is_control lower_bound upper_bound is_toggled is_integer is_sample_rate is_logarithmic default)) { if (/^is/) { print "\t $_:\t",$plug->$_($port) ? "yes" : "no" ,"\n"; next; } next unless defined $plug->$_($port); if (/_bound$/ && $plug->is_integer($port)) { printf "\t $_\t%1.0f",$plug->$_($port); } elsif(/_bound$/) { printf "\t $_\t%1f",$plug->$_($port); } else { print "\t $_:\t\"",$plug->$_($port),'"'; } if (/_bound$/ && $plug->is_sample_rate($port)) { print " x sample_rate"; } print "\n"; } } } } } =pod =head1 NAME pluginfo - Describe ladspa plugins =head1 SYNOPSIS pluginfo [options] Options: --verbose processing info --library library file name --id plugin id --label plugin label --package perl package name of the plugin --short only short info --ports full port listing --help more help Example: pluginfo --library cmt --short # list plugins in the cmt library pluginfo --id 1043 --ports # describe the 'delay_5s' plugin pluginfo --ports # list everything about everything =head1 OPTIONS Options are of the form --option-name or -option-name and may be abbreviated untill unambiguous, for instance: C<--id> to C<-i> and C<--library> to C<-li>. =over 4 =item B<--verbose> Describe what the program is doing. This is mostly helpful when debugging. =item B<--library> The library file where the plugin should be searched. Multiple library options may be given. Without this option, all libraries in LADSPA_PATH will be searched. =item B<--label> The label of the plugin you want described. Multiple label options may be given. =item B<--id> The ID of the plugin you want described. Multiple id options may be given. I and B<--id> options.> =item B<--short> Only list file, library & plugin class, label and id of found plugins. =item B<--help> Describe the program and its options. =head1 SEE ALSO L, L. =head1 COPYRIGHT AND LICENCE Copyright (C) 2003 Joost Diepenmaat This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the COPYING file for more information