Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/Insert.pm view on Meta::CPAN
sub idx { # return first free index
my $n = 0;
while (++$n){
return $n if not $by_index{$n}
}
}
sub wet_name {
my $self = shift;
join('-', $self->track, $self->n, 'wet');
}
sub dry_name {
my $self = shift;
join('-', $self->track, $self->n, 'dry');
}
sub new {
my $class = shift;
my %vals = @_;
my @undeclared = grep{ ! $_is_field{$_} } keys %vals;
croak "undeclared field: @undeclared" if @undeclared;
$vals{n} ||= idx();
my $self = bless {
class => $class, # for restore
wetness => 100,
%vals,
}, $class;
my $name = $vals{track};
# this is the wet return track
my $wet = Audio::Nama::SlaveTrack->new(
name => $self->wet_name,
target => $name,
group => 'Insert',
rw => MON,
# don't hide wet track if used for hosting effects
hide => ! $self->is_local_effects_host,
);
my $dry = Audio::Nama::SlaveTrack->new(
name => $self->dry_name,
target => $name,
group => 'Insert',
hide => 1,
rw => MON);
map{ Audio::Nama::remove_effect($_)} $wet->vol, $wet->pan, $dry->vol, $dry->pan;
map{ my $track = $_; map{ delete $track->{$_} } qw(vol pan) } $wet, $dry;
$self->{dry_vol} = Audio::Nama::add_effect({
track => $dry,
type => 'ea',
params => [0]
});
$self->{wet_vol} = Audio::Nama::add_effect({
track => $wet,
type => 'ea',
params => [100],
});
# synchronize effects with wetness setting
$self->set_wetness($self->{wetness});
$by_index{$self->n} = $self;
}
# method name for track field holding insert
sub type { (ref $_[0]) =~ /Pre/ ? 'prefader_insert' : 'postfader_insert' }
#sub remove {}
# subroutine
#
sub add_insert {
my ($track, $type, $send_id, $return_id) = @_;
local $Audio::Nama::this_track;
# $type : prefader_insert | postfader_insert
Audio::Nama::pager("\n",$track->name , ": adding $type\n");
my $name = $track->name;
# the input fields will be ignored, since the track will get input
# via the loop device track_insert
my $class = $type =~ /pre/ ? 'Audio::Nama::PreFaderInsert' : 'Audio::Nama::PostFaderInsert';
# remove an existing insert of specified type, if present
$track->$type and $by_index{$track->$type}->remove;
my $i = $class->new(
track => $track->name,
send_type => Audio::Nama::dest_type($send_id),
send_id => $send_id,
return_type => Audio::Nama::dest_type($return_id),
return_id => $return_id,
);
if (! $i->{return_id}){
$i->{return_type} = $i->{send_type};
$i->{return_id} = $i->{send_id} if $i->{return_type} eq 'jack_client';
$i->{return_id} = $i->{send_id} + 2 if $i->{return_type} eq 'soundcard';
# TODO adjust to suit track channel width?
}
}
sub get_id {
# get Insert index for track
# optionally specify whether we are looking for
# prefader or postfader insert
#
my ($track, $prepost) = @_;
my @inserts = $track->get_inserts;
my ($prefader) = (map{$_->n}
grep{$_->class =~ /pre/i}
@inserts);
my ($postfader) = (map{$_->n}
grep{$_->class =~ /post/i}
@inserts);
my %id = ( pre => $prefader, post => $postfader);
$prepost = $id{pre} ? 'pre' : 'post'
if (! $prepost and ! $id{pre} != ! $id{post} );
$id{$prepost};;
}
( run in 0.472 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )