Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/EcasoundRun.pm view on Meta::CPAN
sub toggle_transport { $this_engine->running() ? stop_transport() : start_transport() }
sub disconnect_transport {
return if $this_engine->running;
teardown_engine();
}
sub engine_is {
my $pos = shift;
"\n\nEngine is ". $this_engine->ecasound_iam("engine-status"). ( $pos ? " at $pos" : "" )
}
sub engine_status {
my ($pos, $before_newlines, $after_newlines) = @_;
pager("\n" x $before_newlines, engine_is($pos), "\n" x $after_newlines);
}
sub current_position {
my $pos = $this_engine->ecasound_iam("getpos");
colonize(int($pos || 0))
}
sub start_heartbeat {
start_event(poll_engine => timer(0, 1, \&Audio::Nama::heartbeat));
$ui->setup_playback_indicator();
}
sub stop_heartbeat {
# the following test avoids double-tripping rec_cleanup()
# following manual stop
return unless $project->{events}->{poll_engine};
stop_event('poll_engine');
stop_event('update_playback_position_display');
$ui->reset_engine_mode_color_display();
rec_cleanup()
}
sub heartbeat {
# print "heartbeat fired\n";
my $here = $this_engine->ecasound_iam("getpos");
my $status = $this_engine->ecasound_iam('engine-status');
if( $status =~ /finished|error/ ){
engine_status(current_position(),2,1);
revise_prompt();
stop_heartbeat();
sleeper(0.2);
delete $this_engine->{started};
set_position(0);
}
#print join " ", $status, colonize($here), $/;
my ($start, $end);
$start = Audio::Nama::Mark::loop_start();
$end = Audio::Nama::Mark::loop_end();
schedule_wraparound()
if $mode->{loop_enable}
and defined $start
and defined $end
and ! Audio::Nama::ChainSetup::really_recording();
update_clock_display();
}
sub update_clock_display {
$ui->clock_config(-text => current_position());
}
sub schedule_wraparound {
return unless $mode->{loop_enable};
my $here = $this_engine->ecasound_iam("getpos");
my $start = Audio::Nama::Mark::loop_start();
my $end = Audio::Nama::Mark::loop_end();
my $diff = $end - $here;
logpkg(__FILE__,__LINE__,'debug', "here: $here, start: $start, end: $end, diff: $diff");
if ( $diff < 0 ){ # go at once
set_position($start);
cancel_wraparound();
} elsif ( $diff < 3 ) { #schedule the move
wraparound($diff, $start);
}
}
sub cancel_wraparound {
stop_event('wraparound');
}
sub limit_processing_time {
my $length = shift;
start_event(processing_time => timer($length, 0, sub { Audio::Nama::stop_transport(); print prompt() }));
}
sub disable_length_timer {
stop_event('processing_time');
undef $setup->{runtime_limit};
}
sub wraparound {
my ($diff, $start) = @_;
#print "diff: $diff, start: $start\n";
stop_event('wraparound');
start_event(wraparound => timer($diff,0, sub{set_position($start)}));
}
sub stop_do_start {
my ($coderef, $delay) = @_;
$this_engine->started() ? _stop_do_start( $coderef, $delay)
: $coderef->()
}
sub _stop_do_start {
my ($coderef, $delay) = @_;
$this_engine->stop_command();
my $result = $coderef->();
sleeper($delay) if $delay;
$this_engine->start_command();
$result
}
sub restart_ecasound {
pager_newline("killing ecasound processes @{$en{$Audio::Nama::config->{ecasound_engine_name}}->{pids}}");
kill_my_ecasound_processes();
pager_newline(q(restarting Ecasound engine - your may need to use the "arm" command));
initialize_ecasound_engine();
request_setup();
reconfigure_engine();
}
sub kill_my_ecasound_processes {
my @signals = (15, 9);
map{ kill $_, @{$en{$Audio::Nama::config->{ecasound_engine_name}}->{pids}}; sleeper(1)} @signals;
}
( run in 0.973 second using v1.01-cache-2.11-cpan-5a3173703d6 )