さんぱくん外出(US-3POUT)用のrecfsusb2nをC13~C63に対応させる

 さんぱくん外出(US-3POUT)用のrecfsusb2nのチャンネル指定でrecpt1と同じようにC13~C63を指定するとinvalid channelでエラーになる。確認したバージョンは現時点で最新の2018/10/21版(commit 23b65faaafaf12e715f534bcf711a4ab3ba64348)。
 何故だろう?と思ってソースを見てみると、utils.cの102行目(parseOption関数内)から以下のように記述されていた。

        c = channel_conv(ptr);
        if (c >= 0) {
                args->ts_id = channel_table[c].tsid;
                c = channel_table[c].freq;
        }else
                c = atoi(ptr);
        if(13 <= c && c <= 62) {
                //# UHF (13, 14, .., 62)
                args->freq = (c -  13) *  6000 +  473143;
        }else if(101 <= c && c <= 150) {
                //# BS-IF (101:BS-01, 103:BS-03, .., 123:BS-23)
                args->freq = (c - 101) * 19180 + 1049480;
        }else if(201 <= c && c <= 250) {
                //# CS-IF (202:ND-02, 204:ND-04, .., 224:ND-24)
                args->freq = (c - 202) * 20000 + 1613000;
        }else if(60000 <= c && c < 2456123) {
                //# kHz
                args->freq = c;
        }else{
                warn_msg(0,"invalid channel '%s'", ptr);
                exit(1);
        }

 チャンネル文字列がrecfsusb2n.confのChに有る場合はTSIDとFreqを設定、無い場合はチャンネル文字列を数字に変換しているので、recfsusb2n.confに定義も無く、数字に変換できないC13~C63はエラーになると言う訳だった。つまり、C13~C63には対応していない。
 そこで、107行目のチャンネル文字列を数字に変換している部分を、先頭が「C」で始まらない場合はチャンネル文字列を数字に変換、先頭が「C」で始まる場合はチャンネル文字列の2文字目からを数字に変換するように書き換え、108行目~110行目のチャンネルが13~62なら対応するUHFの周波数を設定している箇所を、先頭が「C」でなくチャンネルが13~62なら対応するUHFの周波数を設定、そうでない場合は先頭が「C」でかつチャンネルが13~21なら対応するCATVの周波数を設定、そうでない場合は先頭が「C」でかつチャンネルが22なら対応するCATVの周波数を設定、そうでない場合は先頭が「C」でかつチャンネルが23~63なら対応するCATVの周波数を設定するように書き換えた。

        if(ptr[0] != 'C') {
                c = atoi(ptr);
        }else{
                c = atoi(ptr + 1);
        }
        if(ptr[0] != 'C' && 13 <= c && c <= 62) {
                //# UHF (13, 14, .., 62)
                args->freq = (c -  13) *  6000 +  473143;
        }else if(ptr[0] == 'C' && 13 <= c && c <= 21) {
                //# CATV (13, 14, .., 21)
                args->freq = (c -  13) *  6000 +  111143;
        }else if(ptr[0] == 'C' && c == 22) {
                //# CATV (22)
                args->freq = (c -  22) *  6000 +  167143;
        }else if(ptr[0] == 'C' && 23 <= c && c <= 63) {
                //# CATV (23, 24, .., 63)
                args->freq = (c -  23) *  6000 +  225143;

 これでケーブルテレビのC13~C63が指定できるようになった。実際に明石ケーブルテレビでC29(ACTV135)、C32(NHK総合・神戸)、C33(サンテレビ)、C43(テレビ大阪)、C62(関西テレビ)、C63(毎日放送)が録画出来ることを確認した。
 他にもrecfsusb2n.confでBS11の周波数が111ではなく110と間違っているので受信できないとか、recpt1でBS01_0~BS09_2となるチャンネル名がBS1_0~BS9_2となっていて表記が違うので困るとか、C13~C63への対応も含めてソースを書き換えるパッチのrecfsusb2n-catv.diffを作成した。
 recfsusb2nにこのパッチを当ててビルドする場合、予め必要となるgit、patch、make、gcc、pkg-config、libpcsclite-dev、g++、pcscdをインストールしてから、以下のように行う。

git clone https://github.com/epgdatacapbon/libaribb25
cd libaribb25
make
sudo make install
cd ..
git clone https://github.com/epgdatacapbon/recfsusb2n
cd recfsusb2n
wget http://www.areanine.gr.jp/~nyano/archives/nikki/recfsusb2n-catv.diff
patch -p1 < recfsusb2n-catv.diff
cd src
make B25=1
sudo make install
cd ../..

 B25デコード対応の必要が無い場合は、先頭の5行は不要で、以後のmake B25=1はmakeに置き換えて実行する。
 当然ながら使用する前にはUS-3POUT用のudevルールを下記のように作成してから再起動して反映させておく必要がある。

echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0045", MODE="0664", GROUP="video"' | sudo tee /etc/udev/rules.d/91-tuner.rules