Audio-Nama

 view release on metacpan or  search on metacpan

lib/Audio/Nama/CacheTrack.pm  view on Meta::CPAN

		$args->{track}->name,
		{ full_path => $from_path }
	);

}

sub process_cache_graph {
	logsub((caller(0))[3]);
	my $g = shift;
	logpkg(__FILE__,__LINE__,'debug', "The graph after bus routing:\n$g");
	Audio::Nama::ChainSetup::prune_graph();
	logpkg(__FILE__,__LINE__,'debug', "The graph after pruning:\n$g");
	Audio::Nama::Graph::expand_graph($g); 
	logpkg(__FILE__,__LINE__,'debug', "The graph after adding loop devices:\n$g");
	Audio::Nama::Graph::add_inserts($g);
	logpkg(__FILE__,__LINE__,'debug', "The graph with inserts:\n$g");
	my $success = Audio::Nama::ChainSetup::process_routing_graph();
	if ($success) 
	{ 
		Audio::Nama::ChainSetup::write_chains();
		Audio::Nama::ChainSetup::remove_temporary_tracks();
	}
	$success
}

sub cache_engine_run {
	logsub((caller(0))[3]);
	my $args = shift;
	connect_transport()
		or throw("Couldn't connect engine! Aborting."), return;

	$args->{processing_time} = $setup->{audio_length} + $args->{additional_time};

	pager($args->{track}->name.": processing time: ". d2($args->{processing_time}). " seconds");
	pager("Starting cache operation. Please wait.");
	
	revise_prompt(" "); 

	# we try to set processing time this way
	ecasound_iam("cs-set-length $args->{processing_time}"); 

	ecasound_iam("start");

	# ensure that engine stops at completion time
	$setup->{cache_track_args} = $args;
 	start_event(poll_engine => timer(1, 0.5, \&poll_progress));
}
sub complete_caching {
	logsub((caller(0))[3]);
	my $args = shift;	
	my $name = $args->{track}->name;
	my @files = grep{/$name/} new_files_were_recorded();
	if (@files ){ 
		
		update_cache_map($args);	
		caching_cleanup($args);

	} else { throw("track cache operation failed!") }
	undef $setup->{cache_track_args};
}
sub update_cache_map {
	logsub((caller(0))[3]);
	my $args = shift;
	logpkg(__FILE__,__LINE__,'debug', "updating track cache_map");
	logpkg(__FILE__,__LINE__,'debug', "current track cache entries:",
		sub {
			join "\n","cache map", 
			map{($_->dump)} Audio::Nama::EffectChain::find(track_cache => 1)
		});

	my $track = $args->{track};

	my @inserts = $track->get_inserts;
	my @all_ops = @{$track->ops};
	my @ops_to_remove = $track->user_ops;
	
	my %constructor_args = 
	(
		track_cache => 1,
		track_name	=> $track->name,
		track_version_original => $args->{original_version},
		track_version_result => $args->{cached_version},
		project => 1,
		system => 1,
		ops_list => \@all_ops,
		inserts_data => \@inserts,
	);
	$constructor_args{region} = [ $track->region_start, $track->region_end ] if $track->is_region;
	$constructor_args{fade_data} = [ map  { $_->as_hash } $track->fades ]
		if $track->fades;
	$constructor_args{track_target_original} = $track->target if $track->target; 
	#say "constructor args: ",Dumper \%constructor_args;
	my $ec = Audio::Nama::EffectChain->new( %constructor_args );

	# update track settings
	map{ delete $track->{$_} } qw(target);
	map{ $_->remove        } $track->fades;
	map{ remove_effect($_) } @ops_to_remove;
	map{ $_->remove        } @inserts;
	map{ delete $track->{$_} } qw( region_start region_end target );
	my $obj = $args->{bus} ? 'bus' : 'track';

	my $act = $args->{bus} ? 'reactivate bus' 
								: "restore version $args->{original_version}";
	pager(qq(Saving attributes for cached $obj "$track->name"));

	pager(qq(The 'uncache' command on this track will $act, 
and restore any effects, fades, inserts or region definition.));

	my $filename = $track->targets->{$args->{cached_version}};

	# system version comment with git tag
	
	my $tagname = my $msg = join " ","Caching",
		($args->{bus} ? "bus $track->{group}" 
						: "track $track->{name} version $args->{original_version}"),
		"as $filename";
	$tagname =~ s/ /-/g;
	try{ git(tag => $tagname, '-a','-m',$msg) };
	$track->add_system_version_comment($args->{cached_version}, $msg);
	pager($msg); 



( run in 1.620 second using v1.01-cache-2.11-cpan-98e64b0badf )