--- recptx.pl 2011-03-06 02:01:53.000000000 +0900 +++ recpt1 2011-03-29 21:31:10.000000000 +0900 @@ -3,6 +3,15 @@ use File::Basename; use Getopt::Long; +$sysctl = "/sbin/sysctl"; +$lsof = "/usr/local/sbin/lsof"; + +unless (-e ($b25exe = dirname($0)."/b25")) { $b25exe = "b25"; } +unless (-e ($tsstrip = dirname($0)."/tsstrip")) { $tsstrip = "tsstrip"; } + +@isdb_s_tuners = ("0.s0", "0.s1", "1.s0", "1.s1"); +@isdb_t_tuners = ("0.t0", "0.t1", "1.t0", "1.t1"); + # # table # @@ -190,16 +199,26 @@ # if (defined $opt{'b25'}) { - $cmdfmt = dirname($0) . "/b25"; - $cmdfmt = "b25" - unless (-e $cmdfmt); - + $cmdfmt = "$b25exe"; $cmdfmt .= " -r " . $opt{'round'} if (defined $opt{'round'}); - $cmdfmt .= " -s 1" if (defined $opt{'strip'}); +# $cmdfmt .= " -s 1" if (defined $opt{'strip'}); $cmdfmt .= " -m 1" if (defined $opt{'emm'}); - $cmdfmt .= " -v 0 -p 0 %s %s"; + $cmdfmt .= " -v 0 -p 0 %s"; + if ((defined $opt{'strip'})||(defined $opt{'sid'})) { + $cmdfmt .= " | $tsstrip -d"; + $cmdfmt .= " -s " . $opt{'sid'} if (defined $opt{'sid'}); + $cmdfmt .= " - %s"; + } else { + $cmdfmt .= " %s"; + } } else { - $cmdfmt = "/bin/cat %s > %s"; + if ((defined $opt{'strip'})||(defined $opt{'sid'})) { + $cmdfmt = "$tsstrip -d"; + $cmdfmt .= " -s " . $opt{'sid'} if (defined $opt{'sid'}); + $cmdfmt .= " %s %s"; + } else { + $cmdfmt = "/bin/cat %s > %s"; + } } # @@ -207,10 +226,10 @@ or &usage("no channel"); if (defined $isdb_t_table{$channel}) { $freq = $isdb_t_table{$channel}; - $tuner = 't'; + @tuners = @isdb_t_tuners; } elsif (defined $isdb_s_table{$channel}) { $freq = $isdb_s_table{$channel}; - $tuner = 's'; + @tuners = @isdb_s_tuners; } defined($freq) or &usage("$channel: invalid channel"); @@ -228,24 +247,53 @@ # # TODO: multicard (/dev/ptx1, /dev/ptx2, ...) # -open($t, "<", "/dev/ptx0.${tuner}0"); -if ($t) { - $dev = "/dev/ptx0.${tuner}0"; - $mib = "dev.ptx.0.${tuner}0"; -} else { - open($t, "<", "/dev/ptx0.${tuner}1"); - if ($t) { - $dev = "/dev/ptx0.${tuner}1"; - $mib = "dev.ptx.0.${tuner}1"; - } else { - die("device busy"); +SELDEV: +for (@tuners) { + $dev = "/dev/ptx$_"; + if (open($tun, "<", $dev)) { + $mib = "dev.ptx.$_"; +# close $tun; + last; } } +if (!defined($mib)) { + print STDERR "search device as soon stop\n"; + + for (@tuners) { + $dev = "/dev/ptx$_"; + @pid = split(/\D+/, `$lsof -FRp $dev`); + next if ($#pid < 2); + + print STDERR "$dev: pid=$pid[1] par=$pid[2]\n"; + +#ELAPSED PPID COMMAND [HH:]mm:ss /usr/bin/perl $recpt1 (perl*.*.*) + @pst = split(/\s+/, `ps -o etime,ppid,args -Hww $pid[2]`); + @pst = split(/\s+/, `ps -o etime,ppid,args -Hww $pst[5]`) if ($pst[7] ne $0); + + @ela = split(/:/, $pst[4]); + $rem = ($ela[0] * 60 + $ela[1]); + $rem = $rem * 60 + $ela[2] if ($#ela == 2); + $rem = $pst[$#pst-2] - $rem; + + print STDERR "$dev remains ${rem}s\n"; + + next if ($rem >= 60); + + print STDERR "force stop recording $dev\n"; + + kill 2, $pid[1]; + sleep 3; + goto SELDEV; + } + + die("device busy"); +} + # # recording # -system("/sbin/sysctl $mib.freq=$freq >/dev/null 2>&1"); +system("$sysctl $mib.freq=$freq >/dev/null 2>&1"); eval { local $SIG{ALRM} = sub { die "alarm\n" }; @@ -253,17 +301,19 @@ $pid = fork(); if ($pid) { - close $t; + close $tun; wait; } else { $cmd = sprintf($cmdfmt, $dev, $filename); - close $t; + close $tun; exec("$cmd"); } alarm 0; }; +(undef, $pid) = split(/\D+/, `$lsof -FRp $dev`); + kill 2, $pid if ($pid); wait;