錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

PT3+epgrec UNAでGUIメニューからのサスペンド復帰後に録画失敗するのを防止する

PT3+epgrec UNAを専用の録画サーバではなく普段使いのデスクトップPCで使用しているが、普段使いのデスクトップPCなのでサスペンドをすることがある。PT3をlinuxで使う際、サスペンドからの復帰で番組受信ができなくなる不具合があるが、「DN2800MT + CentOS6.3 + PT3 ACPI サスペンド : 事象の水平線 :」 に掲載されている方法で対応できている。
ただ、pm-suspendを実行してもウンともスンとも言わない場合があり、そのようなときにうっかりGUIメニューからサスペンドを実行してしまうと、サスペンド復帰後に番組受信ができず予約録画に失敗する。これで何度か煮え湯を飲まされたので対応することにした。

ユーザwww-dataでsudoコマンドを実行できるようにする(modprobeコマンド限定)。

sudo visudo
# 以下を追記
www-data ALL=(ALL) NOPASSWD:/sbin/modprobe

reclib.phpの913行目に以下「+」の箇所を追記する。

<?php
if( $st['exitcode'] !== 0 ){
    reclog( 'command error['.$st['exitcode'].'] '.$cmd.$rststk, EPGREC_WARN );
+   // チューンできていないようならドライバをロードする
+ 	 if (strpos($rststk,'Cannot tune to the specified channel') !== false){
+ 	   	exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv');
+ 	    }
    return 2;
}else
    if( $rst_view && $rststk!=='' )
?>

またリアルタイム再生の場合にも同様に、GUIメニューからのサスペンド復帰で再生に失敗した際、コマンドを手打ちしてドライバをアンロード・ロードするのが面倒なので、自動で行なわせるようにする。
sendstream.php 271行目〜に「+」の箇所を追記する。

<?php
// 常駐失敗? PID取得失敗
$errno = posix_get_last_error();
reclog( 'sendstream.php::録画コマンドPID取得失敗('.$errno.')'.posix_strerror($errno ), EPGREC_WARN );
+ // おそらくドライバの問題なのでロード
+ exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv');
?>

参照サイト