<commit_before># BonDriverProxy_Linux

## これは何？

BonDriverProxyをUnix系の環境での使用の為にpthreadで再実装した物と、Linux用のBonDriverです。
動作は主にUbuntu 14.04 + PT3(ドライバ:[m-tsudo/pt3](https://github.com/m-tsudo/pt3))で確認しています(※ドライバ使用の為、改変版pt1_ioctl.hをincludeしています)。
主な用途としては、WindowsのTVTestからLinuxの録画サーバのチューナを使用して視聴、と言う様な感じです。

また、現状Unix系の環境ではBonDriverと言うインタフェースを利用しているソフトは無いかもしれませんが、あって困る事は無いだろ、
て事でクライアント側も入れています。
録画ソフトや視聴ソフト側でBonDriverを扱える様にすれば、リアルタイム視聴と録画ソフトとでチャンネル変更の優先権を設定できるため、
録画ソフト側は、このチューナが視聴に使われてた場合は…的な、面倒な資源管理をやらなくても良くなって嬉しいかもしれません。
WindowsではほぼデファクトスタンダードになっているBonDriverインタフェースを提供する事で、Windows用に書いたコードの移植がやりやすくなるので、
Unix系の環境もWindows並に充実して行けばいいなと思います。

## サーバ

ソースディレクトリで、

```sh
make server
```

でコンパイルできます。
Ex版の場合は、

```sh
make serverex
```

です。
Windows版でiniファイルだった物は、コマンドラインからの引数になりました。
引数無しで実行すると例が出ます。
なお、Ex版のBonDriverのグループ設定のみ、設定ファイルでの設定が必要です。
設定ファイルの名称と設置場所ルールは後述するクライアントモジュールと同じです。
グループ設定のフォーマットに関しては、[Windows版](https://github.com/u-n-k-n-o-w-n/BonDriverProxyEx)を参照して下さい。

## クライアントモジュール

サーバ側と同じく、ソースディレクトリで、

```sh
make client
```

でコンパイルできます。
設定ファイルは「モジュール名.conf」をモジュールと同じディレクトリに設置する形になります。
例えばモジュールが

```
/home/unknown/work/BonDriver_Proxy.so
```

だったとすると、

```
/home/unknown/work/BonDriver_Proxy.so.conf
```

となります。
使用方法や設定内容はWindows版BonDriverProxyと同じですが、行頭「;」の行はコメント行になります。

## chardev版 / DVB版 BonDriver

ソースディレクトリで、

```sh
make driver
```

でコンパイルできます。
設定ファイルの名称と設置場所ルールは上記クライアントモジュールと同じで、行頭「;」の行がコメント行になるのも同じです。
デバイスの数だけモジュールをコピーして使用します。
必要な変更事項は、chardev版の場合は、

```
#DEVICE=/dev/pt3video0
```

のデバイスパスを、DVB版の場合は、

```
#ADAPTER_NO=0
```

のアダプタNoをモジュール毎に被らないように変更するのと、必要であれば、

```
#USELNB=0
```

の0を1にすればLNBへの給電がオンになります…と言うか、動作確認は出来てないので、そうなる様につくってるつもりですと言う事で…。  
また、

```
#USESERVICEID=0
```

の0を1にすると、BonDriverとしての1チャンネルを1サービスに割り当てる事ができます。
いわゆるサービス指定したような感じのTSを出力するようになります。具体的に残しているのはPAT(対象サービスIDのみを含むように変更されます)、
PMT、CAT、NIT、SDT、EIT、TOT、CDTの各PSI/SIと、ECM、EMM、それにもちろん指定したサービスの各PES(stream_typeが"ISO/IEC 13818-6 type D"の物以外)となっています。
なおSDTは変更しないので、こちらのモードで使用中にチャンネルスキャンをするとチャンネルが多数ダブって検索される事になる為、
正しいものを除いて無効化するようにして下さい。
また、同じトラポンに含まれる別サービスがBonDriverのチャンネルとして別チャンネル扱いになる為、BonDriverProxy経由で使用する場合、
通常モードでは可能な、2クライアントが1チューナを共有して、例えばそれぞれフジテレビONEとフジテレビNEXTを視聴する、と言うような事が出来なくなります。
代わりに、対象サービス以外のデータが流れなくなる為、ネットワークトラフィックが減るのと、(主にCS放送などで)取得したTSストリームをそのままデスクランブルに回した場合のCASカードの処理能力に余裕ができる事になるでしょう。  
なお、必然的にチャンネルの設定がかなり変わるので、こちらのモード用の設定ファイルはBonDriver_(LinuxPT/DVB)_UseServiceID.confの方をテンプレとして使用するのが良いかと思います。

\#USESERVICEIDを1で使用している場合、

```
#MODPMT=0
```

の0を1にすると、選択中のサービスのPMTが複数TSパケットにまたがっていた場合に、それらのパケットを微修正した上で、出力TSストリーム上で連続するように再配置するようになります。
これによる明確なメリットは特に無いとは思いますが、Windows 8 + テレ東問題が回避出来たりするので、特殊な地雷を踏まない為の保険的な意味合いで行っておいても損は無いかもしれません。

PT3が一枚刺さっている環境で、`/home/unknown/work`にchardev版モジュールを#USESERVICEID=0で設置するとすると、

```
// /home/unknown/workの内容
// .soファイルはコンパイルして出来たモジュールのコピー
// .confファイルはBonDriver_LinuxPT.confをコピーして必要箇所のみ変更
--------------------------------------------------------------------------------
BonDriver_LinuxPT-S0.so
BonDriver_LinuxPT-S0.so.conf
BonDriver_LinuxPT-S1.so
BonDriver_LinuxPT-S1.so.conf
BonDriver_LinuxPT-T0.so
BonDriver_LinuxPT-T0.so.conf
BonDriver_LinuxPT-T1.so
BonDriver_LinuxPT-T1.so.conf
--------------------------------------------------------------------------------
.confファイルの#DEVICE=行はそれぞれ、
// BonDriver_LinuxPT-S0.so.conf
---
#DEVICE=/dev/pt3video0
---
// BonDriver_LinuxPT-S1.so.conf
---
#DEVICE=/dev/pt3video1
---
// BonDriver_LinuxPT-T0.so.conf
---
#DEVICE=/dev/pt3video2
---
// BonDriver_LinuxPT-T1.so.conf
---
#DEVICE=/dev/pt3video3
---
```

となります。それらより下は、説明がめんどくさいのでスルーです。
あんまりいじる必要は無いんじゃないかと思います。
詳しい方は、UHF(地デジ)に関しては、自分の地域の放送局の物理チャンネルを調べて不要箇所を削除すれば、チャンネルスキャンの時間をだいぶ減らせるかと思います(※不要箇所削除の際は、残した物のBonDriverとしてのチャンネル番号を0からの連番に採番しなおしてください)。
なお、もし編集する際は文字コードはUTF-8を使用してください。

## サンプルツール

```sh
make sample
make util
```

でコンパイル出来ます。

## デバッグビルド

makeするときに

```
BUILD=DEBUG
```

の環境変数を渡すことで、デバッグビルドが出来ます（例: `BUILD=DEBUG make server`）

## ライセンス

MITライセンスとします。
LICENSE参照。


Jun/18/2014 unknown <<EMAIL>>

## 更新履歴
* version 1.1.6.2 (Jan/29/2015)
	* BonDriverインスタンスを共有している複数のクライアントがほぼ同時にCloseTuner()した場合に、
	  解放済みメモリにアクセスしてしまう場合があったのを修正

* version 1.1.6.1 (Jan/28/2015)
	* Ex版のサーバに対してほぼ同時に複数のクライアントが接続してきた場合に、同一のBonDriverインスタンスに対して  <commit_msg>version 1.1.6.3<commit_after># BonDriverProxy_Linux

## これは何？

BonDriverProxyをUnix系の環境での使用の為にpthreadで再実装した物と、Linux用のBonDriverです。
動作は主にUbuntu 14.04 + PT3(ドライバ:[m-tsudo/pt3](https://github.com/m-tsudo/pt3))で確認しています(※ドライバ使用の為、改変版pt1_ioctl.hをincludeしています)。
主な用途としては、WindowsのTVTestからLinuxの録画サーバのチューナを使用して視聴、と言う様な感じです。

また、現状Unix系の環境ではBonDriverと言うインタフェースを利用しているソフトは無いかもしれませんが、あって困る事は無いだろ、
て事でクライアント側も入れています。
録画ソフトや視聴ソフト側でBonDriverを扱える様にすれば、リアルタイム視聴と録画ソフトとでチャンネル変更の優先権を設定できるため、
録画ソフト側は、このチューナが視聴に使われてた場合は…的な、面倒な資源管理をやらなくても良くなって嬉しいかもしれません。
WindowsではほぼデファクトスタンダードになっているBonDriverインタフェースを提供する事で、Windows用に書いたコードの移植がやりやすくなるので、
Unix系の環境もWindows並に充実して行けばいいなと思います。

## サーバ

ソースディレクトリで、

```sh
make server
```

でコンパイルできます。
Ex版の場合は、

```sh
make serverex
```

です。
Windows版でiniファイルだった物は、コマンドラインからの引数になりました。
引数無しで実行すると例が出ます。
なお、Ex版のBonDriverのグループ設定のみ、設定ファイルでの設定が必要です。
設定ファイルの名称と設置場所ルールは後述するクライアントモジュールと同じです。
グループ設定のフォーマットに関しては、[Windows版](https://github.com/u-n-k-n-o-w-n/BonDriverProxyEx)を参照して下さい。

## クライアントモジュール

サーバ側と同じく、ソースディレクトリで、

```sh
make client
```

でコンパイルできます。
設定ファイルは「モジュール名.conf」をモジュールと同じディレクトリに設置する形になります。
例えばモジュールが

```
/home/unknown/work/BonDriver_Proxy.so
```

だったとすると、

```
/home/unknown/work/BonDriver_Proxy.so.conf
```

となります。
使用方法や設定内容はWindows版BonDriverProxyと同じですが、行頭「;」の行はコメント行になります。

## chardev版 / DVB版 BonDriver

ソースディレクトリで、

```sh
make driver
```

でコンパイルできます。
設定ファイルの名称と設置場所ルールは上記クライアントモジュールと同じで、行頭「;」の行がコメント行になるのも同じです。
デバイスの数だけモジュールをコピーして使用します。
必要な変更事項は、chardev版の場合は、

```
#DEVICE=/dev/pt3video0
```

のデバイスパスを、DVB版の場合は、

```
#ADAPTER_NO=0
```

のアダプタNoをモジュール毎に被らないように変更するのと、必要であれば、

```
#USELNB=0
```

の0を1にすればLNBへの給電がオンになります…と言うか、動作確認は出来てないので、そうなる様につくってるつもりですと言う事で…。  
また、

```
#USESERVICEID=0
```

の0を1にすると、BonDriverとしての1チャンネルを1サービスに割り当てる事ができます。
いわゆるサービス指定したような感じのTSを出力するようになります。具体的に残しているのはPAT(対象サービスIDのみを含むように変更されます)、
PMT、CAT、NIT、SDT、EIT、TOT、CDTの各PSI/SIと、ECM、EMM、それにもちろん指定したサービスの各PES(stream_typeが"ISO/IEC 13818-6 type D"の物以外)となっています。
なおSDTは変更しないので、こちらのモードで使用中にチャンネルスキャンをするとチャンネルが多数ダブって検索される事になる為、
正しいものを除いて無効化するようにして下さい。
また、同じトラポンに含まれる別サービスがBonDriverのチャンネルとして別チャンネル扱いになる為、BonDriverProxy経由で使用する場合、
通常モードでは可能な、2クライアントが1チューナを共有して、例えばそれぞれフジテレビONEとフジテレビNEXTを視聴する、と言うような事が出来なくなります。
代わりに、対象サービス以外のデータが流れなくなる為、ネットワークトラフィックが減るのと、(主にCS放送などで)取得したTSストリームをそのままデスクランブルに回した場合のCASカードの処理能力に余裕ができる事になるでしょう。  
なお、必然的にチャンネルの設定がかなり変わるので、こちらのモード用の設定ファイルはBonDriver_(LinuxPT/DVB)_UseServiceID.confの方をテンプレとして使用するのが良いかと思います。

\#USESERVICEIDを1で使用している場合、

```
#MODPMT=0
```

の0を1にすると、選択中のサービスのPMTが複数TSパケットにまたがっていた場合に、それらのパケットを微修正した上で、出力TSストリーム上で連続するように再配置するようになります。
これによる明確なメリットは特に無いとは思いますが、Windows 8 + テレ東問題が回避出来たりするので、特殊な地雷を踏まない為の保険的な意味合いで行っておいても損は無いかもしれません。

PT3が一枚刺さっている環境で、`/home/unknown/work`にchardev版モジュールを#USESERVICEID=0で設置するとすると、

```
// /home/unknown/workの内容
// .soファイルはコンパイルして出来たモジュールのコピー
// .confファイルはBonDriver_LinuxPT.confをコピーして必要箇所のみ変更
--------------------------------------------------------------------------------
BonDriver_LinuxPT-S0.so
BonDriver_LinuxPT-S0.so.conf
BonDriver_LinuxPT-S1.so
BonDriver_LinuxPT-S1.so.conf
BonDriver_LinuxPT-T0.so
BonDriver_LinuxPT-T0.so.conf
BonDriver_LinuxPT-T1.so
BonDriver_LinuxPT-T1.so.conf
--------------------------------------------------------------------------------
.confファイルの#DEVICE=行はそれぞれ、
// BonDriver_LinuxPT-S0.so.conf
---
#DEVICE=/dev/pt3video0
---
// BonDriver_LinuxPT-S1.so.conf
---
#DEVICE=/dev/pt3video1
---
// BonDriver_LinuxPT-T0.so.conf
---
#DEVICE=/dev/pt3video2
---
// BonDriver_LinuxPT-T1.so.conf
---
#DEVICE=/dev/pt3video3
---
```

となります。それらより下は、説明がめんどくさいのでスルーです。
あんまりいじる必要は無いんじゃないかと思います。
詳しい方は、UHF(地デジ)に関しては、自分の地域の放送局の物理チャンネルを調べて不要箇所を削除すれば、チャンネルスキャンの時間をだいぶ減らせるかと思います(※不要箇所削除の際は、残した物のBonDriverとしてのチャンネル番号を0からの連番に採番しなおしてください)。
なお、もし編集する際は文字コードはUTF-8を使用してください。

## サンプルツール

```sh
make sample
make util
```

でコンパイル出来ます。

## デバッグビルド

makeするときに

```
BUILD=DEBUG
```

の環境変数を渡すことで、デバッグビルドが出来ます（例: `BUILD=DEBUG make server`）

## ライセンス

MITライセンスとします。
LICENSE参照。


Jun/18/2014 unknown <<EMAIL>>

## 更新履歴
* version 1.1.6.3 (Jan/30/2015)
	* サーバで一旦ロードしたBonDriverは、使用クライアントがいなくなってもdlclose()しないのを標準にした
	  ※動作は変数g_DisableUnloadBonDriverの値で制御するが、現状実行時に変更する手段は提供していない

* version 1.1.6.2 (Jan/29/2015)
	* BonDriverインスタンスを共有している複数のクライアントがほぼ同時にCloseTuner()した場合に、
	  解放済みメモリにアクセスしてしまう場合があったのを修正

* version 1.1.6.1 (Jan/28/2015)
	* Ex版のサーバに対してほぼ同時に複数のクライアントが接続してきた場合に、同一のBonDriverインスタンスに対して  
{'fraction_non_alphanumeric': 0.14622363614940498, 'fraction_numerical': 0.020973253210792978, 'mean_word_length': 6.551601423487544, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 6, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '549014', 'n_tokens_mistral': 6409, 'n_tokens_neox': 5960, 'n_words': 276}