recdvb 1.2.0をC13〜C63に対応させる

recdvbのチャンネル指定でrecpt1と同じようにC13〜C63を指定するとエラーになる。何故だろう?と思ってソースを見てみると、recpt1core.cの160行目から以下のように記述されている。

    if( (fe_freq = atoi(channel)) == 0){
      fprintf(stderr, "fe_freq is not number\n");
      return 1;
    }
    prop[0].cmd = DTV_FREQUENCY;
    prop[0].u.data = (fe_freq * 6000 + 395143) * 1000;

え?チャンネルが数値じゃなかったら、いきなりエラーにしてる(汗)おまけに165行目の周波数生成はUHF13〜62chしか意識されてないので、1〜12を指定した場合もデタラメな周波数になってしまう。
チャンネル周波数は中心周波数(MHz)に1/7(143)を加えたもので、1チャンネルごとに6MHz(6000kHz)ずつ増えていくが、VHF1〜3chは93143kHzから、VHF4〜12chは173143kHzから、UHF13〜62chは473143kHzから、CATV13〜22chは111143kHzから、CATV22chは167143kHz、CATV23chは225143kHz、CATV24〜27chは233143kHzから、CATV28〜35chは255143kHzから、CATV36〜63chは303143kHzから始まる。
てな訳で、チャンネルの先頭文字が「C」であるか否かで処理を分けて、チャンネルの範囲によって周波数の生成処理を変更するように上記ソースを以下のように書き換えた。

    if(channel[0]!='C') {
        fe_freq=atoi(channel);
	if(fe_freq<= 0 || fe_freq>=63) {
             fprintf(stderr, "fe_freq is not number\n");
             return 1;
        }
        if(fe_freq>= 1 && fe_freq<= 3) prop[0].u.data = ((fe_freq -  1) * 6000 +  93143) * 1000;
        if(fe_freq>= 4 && fe_freq<= 7) prop[0].u.data = ((fe_freq -  4) * 6000 + 173143) * 1000;
        if(fe_freq>= 8 && fe_freq<=12) prop[0].u.data = ((fe_freq -  8) * 6000 + 195143) * 1000;
        if(fe_freq>=13 && fe_freq<=62) prop[0].u.data = ((fe_freq - 13) * 6000 + 473143) * 1000;
    } else {
        fe_freq=atoi(channel+1);
	if(fe_freq<=12 || fe_freq>=64) {
             fprintf(stderr, "fe_freq is not number\n");
             return 1;
        }
        if(fe_freq>=13 && fe_freq<=21) prop[0].u.data = ((fe_freq - 13) * 6000 + 111143) * 1000;
        if(fe_freq==22               ) prop[0].u.data = ((fe_freq - 22) * 6000 + 167143) * 1000;
        if(fe_freq==23               ) prop[0].u.data = ((fe_freq - 23) * 6000 + 225143) * 1000;
        if(fe_freq>=24 && fe_freq<=27) prop[0].u.data = ((fe_freq - 24) * 6000 + 233143) * 1000;
        if(fe_freq>=28 && fe_freq<=35) prop[0].u.data = ((fe_freq - 28) * 6000 + 255143) * 1000;
        if(fe_freq>=36 && fe_freq<=63) prop[0].u.data = ((fe_freq - 36) * 6000 + 303143) * 1000;
    }
    prop[0].cmd = DTV_FREQUENCY;

これでケーブルテレビのC13〜C63やVHF1〜12chも指定できるようになったハズ。当然、上記変更を加えてコンパイルするとchecksignalコマンドも同じチャンネル指定が出来るようになる。
後日、明石ケーブルテレビでC29(たこチャンネル)、C32(NHK総合・神戸)、C33(サンテレビ)、C62(関西テレビ)、C63(毎日放送)が録画出来ることを確認したが、何故かC43(テレビ大阪)だけ上手く受信できない。周波数は合ってるように見えるんだが…と思ってたら、そもそも過去にPX-S1UDでC43のテレビ大阪がBonDriver+TVTestでも受信できないことを自分で書いていた。原因が気になるけれど現時点では仕様とあきらめるしかないのかな。