Advertisement
Guest User

BonDriver_Bulldog_MOD.patch.20141209.src.txt

a guest
Dec 9th, 2014
1,615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 101.42 KB | None | 0 0
  1. diff -uPrb Org/readme_mod.txt Mod/readme_mod.txt
  2. --- Org/readme_mod.txt  1970-01-01 09:00:00.000000000 +0900
  3. +++ Mod/readme_mod.txt  2014-12-09 22:17:00.000000000 +0900
  4. @@ -0,0 +1,76 @@
  5. +Bulldog チューナー用 BonDriver 改変パッチ当てMODソース @ 2014/12/09
  6. +
  7. +  以下の2ファイルを BonDriver_Bulldog.dll と同じ場所において使用する。
  8. +
  9. +  BonDriver_Bulldog.ini     ; 設定ファイル
  10. +  BonDriver_Bulldog.ch.txt  ; チャンネル定義ファイル
  11. +
  12. +  オプティマイズで配布しているカメレオンUSBFX2のID書きツール(FX2WRID)
  13. +  利用すると大量のBulldogチューナーを同時利用することもできる筈だが未検証。
  14. +
  15. +  <例> ID=0 のチューナー
  16. +    BonDriver_Bulldog_0.dll     ; BonDriver_Bulldog.dll を複製したもの
  17. +    BonDriver_Bulldog_0.ini     ; BonDriver_Bulldog.ini を複製したもの
  18. +    BonDriver_Bulldog_0.ch.txt  ; BonDriver_Bulldog.ch.txt を複製したもの
  19. +
  20. +  <例> ID=1 のチューナー
  21. +    BonDriver_Bulldog_1.dll     ; BonDriver_Bulldog.dll を複製したもの
  22. +    BonDriver_Bulldog_1.ini     ; BonDriver_Bulldog.ini を複製したもの
  23. +    BonDriver_Bulldog_1.ch.txt  ; BonDriver_Bulldog.ch.txt を複製したもの
  24. +
  25. +  <例> ID=2 のチューナー
  26. +    BonDriver_Bulldog_2.dll     ; BonDriver_Bulldog.dll を複製したもの
  27. +    BonDriver_Bulldog_2.ini     ; BonDriver_Bulldog.ini を複製したもの
  28. +    BonDriver_Bulldog_2.ch.txt  ; BonDriver_Bulldog.ch.txt を複製したもの
  29. +
  30. +2014/11/26 からの修正内容
  31. +
  32. +    ・FIFOアロケーション処理を非同期化
  33. +    ・リソースファイル(BonDrvier.rc)をVSExpressシリーズに対応
  34. +
  35. +2014/10/24 からの修正内容
  36. +
  37. +    ・ini にスペース並べ替えに関するオプションを追加[rev8]
  38. +     ( InvisibleSpaces / InvalidSpaces / SpaceArrangement )
  39. +    ・チャンネル切替時のドロップ/スクランブル削減処理を追加[rev7]
  40. +     ( CBonTuner::ResetFxFifo / CUsbFx2Driver::ResetFifoThread )
  41. +    ・非同期TSデータの環状ストックを自動で追加充填する機能を追加[rev6]
  42. +
  43. +      AsyncTsQueueNum : 非同期TSデータの環状ストック数(初期値)
  44. +      AsyncTsQueueMax : 非同期TSデータの環状ストック最大数
  45. +
  46. +       バッファが足りなくなると AsyncTsQueueNum ~ AsyncTsQueueMax の間で
  47. +       環状ストックに自動で追加充填される。(AsyncTsQueueMax=0で追加充填無効)
  48. +
  49. +    ・FIFOデータ受信時の無駄なクリティカルロックを排除(PushFifoBuff)[rev5]
  50. +    ・終了時に稀に例外が発生して強制終了することのあるバグの修正[rev2-4]
  51. +    ・Spinelと組み合わせるとVHFチャンネル(1~9)が選択できないバグを修正[rev]
  52. +    ・FX2側のバッファ待機処理にマルチスレッドレベルで最適化できる処理を追加
  53. +     ( ドロップが稀に発生する環境で効果を発揮 )
  54. +
  55. +       ini に TSDualThreading=1 と書くことで有効化
  56. +       (※非力PCでは 0 かコメントアウト推奨)
  57. +
  58. +    ・FX2側のバッファ待機限界秒数を500msから1000msに初期値を変更
  59. +     ( ini に TSThreadWait=2000 などと書くことによって待機時間を別途変更可能 )
  60. +    ・FX2側の待機スレッドの優先順位を変えることのできるパラメータを ini に追加
  61. +
  62. +       TSThreadPriority= -15 ~ 15
  63. +                              15 : TimeCritical(最高)
  64. +                               2 : Highest(高い) ※デフォルト
  65. +                               1 : Higher(やや高い)
  66. +                               0 : Normal(普通)
  67. +                              -1 : Lower(やや低い)
  68. +                              -2 : Lowest(低い)
  69. +                             -15 : Idle(最低)
  70. +
  71. +2014/1/26 からの修正内容
  72. +
  73. +    ・CATV C22 チャンネル周波数修正
  74. +
  75. +2013/12/28 からの修正内容
  76. +
  77. +    ・チューナーを開いた時に発生するUSB抜き差し音の除去(OpenDriver)
  78. +    ・チャンネルファイルを書換えた場合の受信レベル表示修正(GetCN/GetBER)
  79. +    ・Spinel用バッファ待機最適化(WaitTsStream)
  80. +
  81. diff -uPrb Org/BonDriver.rc Mod/BonDriver.rc
  82. --- Org/BonDriver.rc    2012-04-07 16:37:52.000000000 +0900
  83. +++ Mod/BonDriver.rc    2014-12-04 13:20:08.000000000 +0900
  84. @@ -1,32 +1,9 @@
  85. -// Microsoft Visual C++ generated resource script.
  86. +//Microsoft Developer Studio generated resource script.
  87.  //
  88. -#include "Resource.h"
  89. +#include <windows.h>
  90.  
  91. -#define APSTUDIO_READONLY_SYMBOLS
  92. -/////////////////////////////////////////////////////////////////////////////
  93. -//
  94. -// Generated from the TEXTINCLUDE 2 resource.
  95. -//
  96. -#include "afxres.h"
  97. -
  98. -/////////////////////////////////////////////////////////////////////////////
  99. -#undef APSTUDIO_READONLY_SYMBOLS
  100. -
  101. -/////////////////////////////////////////////////////////////////////////////
  102. -// 日本語 resources
  103. -
  104. -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
  105. -#ifdef _WIN32
  106.  LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
  107. -#pragma code_page(932)
  108. -#endif //_WIN32
  109. -
  110. -/////////////////////////////////////////////////////////////////////////////
  111. -//
  112. -// Version
  113. -//
  114. -
  115. -VS_VERSION_INFO VERSIONINFO
  116. +1 VERSIONINFO
  117.   FILEVERSION 1,0,0,0
  118.   PRODUCTVERSION 1,0,0,0
  119.   FILEFLAGSMASK 0x3fL
  120. @@ -35,20 +12,20 @@
  121.  #else
  122.   FILEFLAGS 0x0L
  123.  #endif
  124. - FILEOS 0x40004L
  125. - FILETYPE 0x2L
  126. + FILEOS VOS_NT
  127. + FILETYPE VFT_DLL
  128.   FILESUBTYPE 0x0L
  129.  BEGIN
  130.      BLOCK "StringFileInfo"
  131.      BEGIN
  132.          BLOCK "041104b0"
  133.          BEGIN
  134. -            VALUE "Comments", "Bulldog Driver Interface"
  135.              VALUE "FileDescription", "Bulldog Driver Interface"
  136.              VALUE "FileVersion", "1, 0, 0, 0"
  137. -            VALUE "InternalName", "BonDriver"
  138. -            VALUE "OriginalFilename", "BonDriver.dll"
  139. +            VALUE "InternalName", "BonDriver_Bulldog.dll"
  140. +            VALUE "OriginalFilename", "BonDriver_Bulldog.dll"
  141.              VALUE "ProductVersion", "1, 0, 0, 0"
  142. +            VALUE "Comments", "MOD by PRY8EAlByw 2013,2014"
  143.          END
  144.      END
  145.      BLOCK "VarFileInfo"
  146. @@ -57,44 +34,3 @@
  147.      END
  148.  END
  149.  
  150. -
  151. -#ifdef APSTUDIO_INVOKED
  152. -/////////////////////////////////////////////////////////////////////////////
  153. -//
  154. -// TEXTINCLUDE
  155. -//
  156. -
  157. -1 TEXTINCLUDE
  158. -BEGIN
  159. -    "Resource.h\0"
  160. -END
  161. -
  162. -2 TEXTINCLUDE
  163. -BEGIN
  164. -    "#include ""afxres.h""\r\n"
  165. -    "\0"
  166. -END
  167. -
  168. -3 TEXTINCLUDE
  169. -BEGIN
  170. -    "\r\n"
  171. -    "\0"
  172. -END
  173. -
  174. -#endif    // APSTUDIO_INVOKED
  175. -
  176. -#endif    // 日本語 resources
  177. -/////////////////////////////////////////////////////////////////////////////
  178. -
  179. -
  180. -
  181. -#ifndef APSTUDIO_INVOKED
  182. -/////////////////////////////////////////////////////////////////////////////
  183. -//
  184. -// Generated from the TEXTINCLUDE 3 resource.
  185. -//
  186. -
  187. -
  188. -/////////////////////////////////////////////////////////////////////////////
  189. -#endif    // not APSTUDIO_INVOKED
  190. -
  191. diff -uPrb Org/BonDriver_Bulldog.ch - MHz.txt Mod/BonDriver_Bulldog.ch - MHz.txt
  192. --- Org/BonDriver_Bulldog.ch - MHz.txt  1970-01-01 09:00:00.000000000 +0900
  193. +++ Mod/BonDriver_Bulldog.ch - MHz.txt  2014-11-14 07:46:50.000000000 +0900
  194. @@ -0,0 +1,191 @@
  195. +; Bulldog 用 チャンネルファイル 周波数MHz表記修正版rev4 (2014/11/14)
  196. +;
  197. +;       チャンネル情報を変更する場合は、このファイルを編集して
  198. +;       プレフィックスが同じ名前のドライバと同ディレクトリに
  199. +;       拡張子 .ch.txt としてこのファイルを置くこと。
  200. +;
  201. +;       ※ スペースの名前と順番は間違えてはいけないと思います。
  202. +;
  203. +; スペース名, サービスID, 物理チャンネル番号or周波数MHz, TSID, チャンネル名
  204. +
  205. +  ; VHF
  206. +
  207. +VHF, 0, 93.143MHz,0x0000, 1ch
  208. +VHF, 0, 99.143MHz,0x0000, 2ch
  209. +VHF, 0,105.143MHz,0x0000, 3ch
  210. +VHF, 0,173.143MHz,0x0000, 4ch
  211. +VHF, 0,179.143MHz,0x0000, 5ch
  212. +VHF, 0,185.143MHz,0x0000, 6ch
  213. +VHF, 0,191.143MHz,0x0000, 7ch
  214. +VHF, 0,195.143MHz,0x0000, 8ch
  215. +VHF, 0,201.143MHz,0x0000, 9ch
  216. +VHF, 0,207.143MHz,0x0000,10ch
  217. +VHF, 0,213.143MHz,0x0000,11ch
  218. +VHF, 0,219.143MHz,0x0000,12ch
  219. +
  220. +  ; UHF
  221. +
  222. +UHF, 0,473.143MHz,0x0000,13ch
  223. +UHF, 0,479.143MHz,0x0000,14ch
  224. +UHF, 0,485.143MHz,0x0000,15ch
  225. +UHF, 0,491.143MHz,0x0000,16ch
  226. +UHF, 0,497.143MHz,0x0000,17ch
  227. +UHF, 0,503.143MHz,0x0000,18ch
  228. +UHF, 0,509.143MHz,0x0000,19ch
  229. +UHF, 0,515.143MHz,0x0000,20ch
  230. +UHF, 0,521.143MHz,0x0000,21ch
  231. +UHF, 0,527.143MHz,0x0000,22ch
  232. +UHF, 0,533.143MHz,0x0000,23ch
  233. +UHF, 0,539.143MHz,0x0000,24ch
  234. +UHF, 0,545.143MHz,0x0000,25ch
  235. +UHF, 0,551.143MHz,0x0000,26ch
  236. +UHF, 0,557.143MHz,0x0000,27ch
  237. +UHF, 0,563.143MHz,0x0000,28ch
  238. +UHF, 0,569.143MHz,0x0000,29ch
  239. +UHF, 0,575.143MHz,0x0000,30ch
  240. +UHF, 0,581.143MHz,0x0000,31ch
  241. +UHF, 0,587.143MHz,0x0000,32ch
  242. +UHF, 0,593.143MHz,0x0000,33ch
  243. +UHF, 0,599.143MHz,0x0000,34ch
  244. +UHF, 0,605.143MHz,0x0000,35ch
  245. +UHF, 0,611.143MHz,0x0000,36ch
  246. +UHF, 0,617.143MHz,0x0000,37ch
  247. +UHF, 0,623.143MHz,0x0000,38ch
  248. +UHF, 0,629.143MHz,0x0000,39ch
  249. +UHF, 0,635.143MHz,0x0000,40ch
  250. +UHF, 0,641.143MHz,0x0000,41ch
  251. +UHF, 0,647.143MHz,0x0000,42ch
  252. +UHF, 0,653.143MHz,0x0000,43ch
  253. +UHF, 0,659.143MHz,0x0000,44ch
  254. +UHF, 0,665.143MHz,0x0000,45ch
  255. +UHF, 0,671.143MHz,0x0000,46ch
  256. +UHF, 0,677.143MHz,0x0000,47ch
  257. +UHF, 0,683.143MHz,0x0000,48ch
  258. +UHF, 0,689.143MHz,0x0000,49ch
  259. +UHF, 0,695.143MHz,0x0000,50ch
  260. +UHF, 0,701.143MHz,0x0000,51ch
  261. +UHF, 0,707.143MHz,0x0000,52ch
  262. +UHF, 0,713.143MHz,0x0000,53ch
  263. +UHF, 0,719.143MHz,0x0000,54ch
  264. +UHF, 0,725.143MHz,0x0000,55ch
  265. +UHF, 0,731.143MHz,0x0000,56ch
  266. +UHF, 0,737.143MHz,0x0000,57ch
  267. +UHF, 0,743.143MHz,0x0000,58ch
  268. +UHF, 0,749.143MHz,0x0000,59ch
  269. +UHF, 0,755.143MHz,0x0000,60ch
  270. +UHF, 0,761.143MHz,0x0000,61ch
  271. +UHF, 0,767.143MHz,0x0000,62ch
  272. +
  273. +  ; CATV
  274. +
  275. +CATV, 0,111.143MHz,0x0000,C13ch
  276. +CATV, 0,117.143MHz,0x0000,C14ch
  277. +CATV, 0,123.143MHz,0x0000,C15ch
  278. +CATV, 0,129.143MHz,0x0000,C16ch
  279. +CATV, 0,135.143MHz,0x0000,C17ch
  280. +CATV, 0,141.143MHz,0x0000,C18ch
  281. +CATV, 0,147.143MHz,0x0000,C19ch
  282. +CATV, 0,153.143MHz,0x0000,C20ch
  283. +CATV, 0,159.143MHz,0x0000,C21ch
  284. +CATV, 0,167.143MHz,0x0000,C22ch
  285. +CATV, 0,225.143MHz,0x0000,C23ch
  286. +CATV, 0,231.143MHz,0x0000,C24ch
  287. +CATV, 0,237.143MHz,0x0000,C25ch
  288. +CATV, 0,243.143MHz,0x0000,C26ch
  289. +CATV, 0,249.143MHz,0x0000,C27ch
  290. +CATV, 0,255.143MHz,0x0000,C28ch
  291. +CATV, 0,261.143MHz,0x0000,C29ch
  292. +CATV, 0,267.143MHz,0x0000,C30ch
  293. +CATV, 0,273.143MHz,0x0000,C31ch
  294. +CATV, 0,279.143MHz,0x0000,C32ch
  295. +CATV, 0,285.143MHz,0x0000,C33ch
  296. +CATV, 0,291.143MHz,0x0000,C34ch
  297. +CATV, 0,297.143MHz,0x0000,C35ch
  298. +CATV, 0,303.143MHz,0x0000,C36ch
  299. +CATV, 0,309.143MHz,0x0000,C37ch
  300. +CATV, 0,315.143MHz,0x0000,C38ch
  301. +CATV, 0,321.143MHz,0x0000,C39ch
  302. +CATV, 0,327.143MHz,0x0000,C40ch
  303. +CATV, 0,333.143MHz,0x0000,C41ch
  304. +CATV, 0,339.143MHz,0x0000,C42ch
  305. +CATV, 0,345.143MHz,0x0000,C43ch
  306. +CATV, 0,351.143MHz,0x0000,C44ch
  307. +CATV, 0,357.143MHz,0x0000,C45ch
  308. +CATV, 0,363.143MHz,0x0000,C46ch
  309. +CATV, 0,369.143MHz,0x0000,C47ch
  310. +CATV, 0,375.143MHz,0x0000,C48ch
  311. +CATV, 0,381.143MHz,0x0000,C49ch
  312. +CATV, 0,387.143MHz,0x0000,C50ch
  313. +CATV, 0,393.143MHz,0x0000,C51ch
  314. +CATV, 0,399.143MHz,0x0000,C52ch
  315. +CATV, 0,405.143MHz,0x0000,C53ch
  316. +CATV, 0,411.143MHz,0x0000,C54ch
  317. +CATV, 0,417.143MHz,0x0000,C55ch
  318. +CATV, 0,423.143MHz,0x0000,C56ch
  319. +CATV, 0,429.143MHz,0x0000,C57ch
  320. +CATV, 0,435.143MHz,0x0000,C58ch
  321. +CATV, 0,441.143MHz,0x0000,C59ch
  322. +CATV, 0,447.143MHz,0x0000,C60ch
  323. +CATV, 0,453.143MHz,0x0000,C61ch
  324. +CATV, 0,459.143MHz,0x0000,C62ch
  325. +CATV, 0,465.143MHz,0x0000,C63ch
  326. +
  327. +  ; BS (ストリームが重複するチャンネルはコメントアウトしている)
  328. +
  329. +BS, 151, 1049.48MHz,0x4010,BS1/TS0 ;BS朝日
  330. +BS, 161, 1049.48MHz,0x4011,BS1/TS1 ;BS-TBS
  331. +BS, 191, 1087.84MHz,0x4030,BS3/TS0 ;WOWOWプライム
  332. +;BS, 791, 1356.36MHz,0x4030,BS3/TS0 ;navi
  333. +BS, 171, 1087.84MHz,0x4031,BS3/TS1 ;BSジャパン
  334. +BS, 192, 1126.20MHz,0x4450,BS5/TS0 ;WOWOWライブ
  335. +BS, 193, 1126.20MHz,0x4451,BS5/TS1 ;WOWOWシネマ
  336. +BS, 201, 1164.56MHz,0x4470,BS7/TS0 ;スター・チャンネル2
  337. +;BS, 202, 1164.56MHz,0x4470,BS7/TS0 ;スター・チャンネル3
  338. +BS, 236, 1164.56MHz,0x4671,BS7/TS1 ;BSアニマックス
  339. +BS, 256, 1164.56MHz,0x4672,BS7/TS2 ;ディズニー・チャンネル
  340. +BS, 211, 1202.92MHz,0x4090,BS9/TS0 ;BS11
  341. +BS, 200, 1202.92MHz,0x4091,BS9/TS1 ;スター・チャンネル1
  342. +BS, 222, 1202.92MHz,0x4092,BS9/TS2 ;TwellV
  343. +BS, 238, 1241.28MHz,0x46B0,BS11/TS0 ;FOX bs238
  344. +BS, 241, 1241.28MHz,0x46B1,BS11/TS1 ;BSスカパー!
  345. +BS, 231, 1241.28MHz,0x46B2,BS11/TS2 ;放送大学BS1
  346. +;BS, 232, 1241.28MHz,0x46B2,BS11/TS2 ;放送大学BS2
  347. +;BS, 233, 1241.28MHz,0x46B2,BS11/TS2 ;放送大学BS3
  348. +BS, 141, 1279.64MHz,0x40D0,BS13/TS0 ;BS日テレ
  349. +BS, 181, 1279.64MHz,0x40D1,BS13/TS1 ;BSフジ
  350. +BS, 101, 1318.00MHz,0x40F1,BS15/TS1 ;NHKBS1
  351. +BS, 103, 1318.00MHz,0x40F2,BS15/TS2 ;NHKBSプレミアム
  352. +;BS, 910, 1356.36MHz,0x40F2,BS15/TS2 ;WNI・910
  353. +BS, 291, 1356.36MHz,0x4310,BS17/TS1 ;NHK総合・東京
  354. +;BS, 292, 1356.36MHz,0x4310,BS17/TS1 ;NHKEテレ東京
  355. +BS, 294, 1356.36MHz,0x4311,BS17/TS2 ;日テレ
  356. +;BS, 295, 1356.36MHz,0x4311,BS17/TS2 ;テレビ朝日
  357. +;BS, 296, 1356.36MHz,0x4311,BS17/TS2 ;TBS
  358. +;BS, 297, 1356.36MHz,0x4311,BS17/TS2 ;テレビ東京
  359. +;BS, 298, 1356.36MHz,0x4310,BS17/TS1 ;フジテレビ
  360. +;BS, 531, 1356.36MHz,0x46B2,BS11/TS2 放送大学ラジオ
  361. +BS, 234, 1394.72MHz,0x4730,BS19/TS0 ;グリーンチャンネル
  362. +BS, 242, 1394.72MHz,0x4731,BS19/TS1 ;J SPORTS 1
  363. +BS, 243, 1394.72MHz,0x4732,BS19/TS2 ;J SPORTS 2
  364. +BS, 252, 1433.08MHz,0x4750,BS21/TS0 ;IMAGICA BS
  365. +BS, 244, 1433.08MHz,0x4751,BS21/TS1 ;J SPORTS 3
  366. +BS, 245, 1433.08MHz,0x4752,BS21/TS2 ;J SPORTS 4
  367. +BS, 251, 1471.44MHz,0x4770,BS23/TS0 ;BS釣りビジョン
  368. +BS, 255, 1471.44MHz,0x4771,BS23/TS1 ;日本映画専門チャンネル
  369. +BS, 258, 1471.44MHz,0x4772,BS23/TS2 ;D-Life
  370. +
  371. +  ; CS110
  372. +
  373. +CS110, 0, 1613.0MHz, 0x6020, ND2
  374. +CS110, 0, 1653.0MHz, 0x7040, ND4
  375. +CS110, 0, 1693.0MHz, 0x7060, ND6
  376. +CS110, 0, 1733.0MHz, 0x6080, ND8
  377. +CS110, 0, 1773.0MHz, 0x60A0, ND10
  378. +CS110, 0, 1813.0MHz, 0x70C0, ND12
  379. +CS110, 0, 1853.0MHz, 0x70E0, ND14
  380. +CS110, 0, 1893.0MHz, 0x7100, ND16
  381. +CS110, 0, 1933.0MHz, 0x7120, ND18
  382. +CS110, 0, 1973.0MHz, 0x7140, ND20
  383. +CS110, 0, 2013.0MHz, 0x7160, ND22
  384. +CS110, 0, 2053.0MHz, 0x7180, ND24
  385. +
  386. diff -uPrb Org/BonDriver_Bulldog.ch.txt Mod/BonDriver_Bulldog.ch.txt
  387. --- Org/BonDriver_Bulldog.ch.txt    1970-01-01 09:00:00.000000000 +0900
  388. +++ Mod/BonDriver_Bulldog.ch.txt    2014-11-14 07:46:50.000000000 +0900
  389. @@ -0,0 +1,206 @@
  390. +; Bulldog 用 チャンネルファイルrev (2014/11/14)
  391. +;
  392. +;       チャンネル情報を変更する場合は、このファイルを編集して
  393. +;       プレフィックスが同じ名前のドライバと同ディレクトリに
  394. +;       拡張子 .ch.txt としてこのファイルを置くこと。
  395. +;
  396. +;       ※ スペースの名前と順番は間違えてはいけないと思います。
  397. +;
  398. +; スペース名, サービスID, 物理チャンネル番号or周波数MHz, TSID, チャンネル名
  399. +
  400. +  ; VHF
  401. +
  402. +VHF, 0, 1,0x0000, 1ch
  403. +VHF, 0, 2,0x0000, 2ch
  404. +VHF, 0, 3,0x0000, 3ch
  405. +VHF, 0, 4,0x0000, 4ch
  406. +VHF, 0, 5,0x0000, 5ch
  407. +VHF, 0, 6,0x0000, 6ch
  408. +VHF, 0, 7,0x0000, 7ch
  409. +VHF, 0, 8,0x0000, 8ch
  410. +VHF, 0, 9,0x0000, 9ch
  411. +VHF, 0,10,0x0000,10ch
  412. +VHF, 0,11,0x0000,11ch
  413. +VHF, 0,12,0x0000,12ch
  414. +
  415. +  ; UHF
  416. +
  417. +UHF, 0,13,0x0000,13ch
  418. +UHF, 0,14,0x0000,14ch
  419. +UHF, 0,15,0x0000,15ch
  420. +UHF, 0,16,0x0000,16ch
  421. +UHF, 0,17,0x0000,17ch
  422. +UHF, 0,18,0x0000,18ch
  423. +UHF, 0,19,0x0000,19ch
  424. +UHF, 0,20,0x0000,20ch
  425. +UHF, 0,21,0x0000,21ch
  426. +UHF, 0,22,0x0000,22ch
  427. +UHF, 0,23,0x0000,23ch
  428. +UHF, 0,24,0x0000,24ch
  429. +UHF, 0,25,0x0000,25ch
  430. +UHF, 0,26,0x0000,26ch
  431. +UHF, 0,27,0x0000,27ch
  432. +UHF, 0,28,0x0000,28ch
  433. +UHF, 0,29,0x0000,29ch
  434. +UHF, 0,30,0x0000,30ch
  435. +UHF, 0,31,0x0000,31ch
  436. +UHF, 0,32,0x0000,32ch
  437. +UHF, 0,33,0x0000,33ch
  438. +UHF, 0,34,0x0000,34ch
  439. +UHF, 0,35,0x0000,35ch
  440. +UHF, 0,36,0x0000,36ch
  441. +UHF, 0,37,0x0000,37ch
  442. +UHF, 0,38,0x0000,38ch
  443. +UHF, 0,39,0x0000,39ch
  444. +UHF, 0,40,0x0000,40ch
  445. +UHF, 0,41,0x0000,41ch
  446. +UHF, 0,42,0x0000,42ch
  447. +UHF, 0,43,0x0000,43ch
  448. +UHF, 0,44,0x0000,44ch
  449. +UHF, 0,45,0x0000,45ch
  450. +UHF, 0,46,0x0000,46ch
  451. +UHF, 0,47,0x0000,47ch
  452. +UHF, 0,48,0x0000,48ch
  453. +UHF, 0,49,0x0000,49ch
  454. +UHF, 0,50,0x0000,50ch
  455. +UHF, 0,51,0x0000,51ch
  456. +UHF, 0,52,0x0000,52ch
  457. +UHF, 0,53,0x0000,53ch
  458. +UHF, 0,54,0x0000,54ch
  459. +UHF, 0,55,0x0000,55ch
  460. +UHF, 0,56,0x0000,56ch
  461. +UHF, 0,57,0x0000,57ch
  462. +UHF, 0,58,0x0000,58ch
  463. +UHF, 0,59,0x0000,59ch
  464. +UHF, 0,60,0x0000,60ch
  465. +UHF, 0,61,0x0000,61ch
  466. +UHF, 0,62,0x0000,62ch
  467. +
  468. +  ; CATV
  469. +
  470. +CATV, 0,113,0x0000,C13ch
  471. +CATV, 0,114,0x0000,C14ch
  472. +CATV, 0,115,0x0000,C15ch
  473. +CATV, 0,116,0x0000,C16ch
  474. +CATV, 0,117,0x0000,C17ch
  475. +CATV, 0,118,0x0000,C18ch
  476. +CATV, 0,119,0x0000,C19ch
  477. +CATV, 0,120,0x0000,C20ch
  478. +CATV, 0,121,0x0000,C21ch
  479. +CATV, 0,122,0x0000,C22ch
  480. +CATV, 0,123,0x0000,C23ch
  481. +CATV, 0,124,0x0000,C24ch
  482. +CATV, 0,125,0x0000,C25ch
  483. +CATV, 0,126,0x0000,C26ch
  484. +CATV, 0,127,0x0000,C27ch
  485. +CATV, 0,128,0x0000,C28ch
  486. +CATV, 0,129,0x0000,C29ch
  487. +CATV, 0,130,0x0000,C30ch
  488. +CATV, 0,131,0x0000,C31ch
  489. +CATV, 0,132,0x0000,C32ch
  490. +CATV, 0,133,0x0000,C33ch
  491. +CATV, 0,134,0x0000,C34ch
  492. +CATV, 0,135,0x0000,C35ch
  493. +CATV, 0,136,0x0000,C36ch
  494. +CATV, 0,137,0x0000,C37ch
  495. +CATV, 0,138,0x0000,C38ch
  496. +CATV, 0,139,0x0000,C39ch
  497. +CATV, 0,140,0x0000,C40ch
  498. +CATV, 0,141,0x0000,C41ch
  499. +CATV, 0,142,0x0000,C42ch
  500. +CATV, 0,143,0x0000,C43ch
  501. +CATV, 0,144,0x0000,C44ch
  502. +CATV, 0,145,0x0000,C45ch
  503. +CATV, 0,146,0x0000,C46ch
  504. +CATV, 0,147,0x0000,C47ch
  505. +CATV, 0,148,0x0000,C48ch
  506. +CATV, 0,149,0x0000,C49ch
  507. +CATV, 0,150,0x0000,C50ch
  508. +CATV, 0,151,0x0000,C51ch
  509. +CATV, 0,152,0x0000,C52ch
  510. +CATV, 0,153,0x0000,C53ch
  511. +CATV, 0,154,0x0000,C54ch
  512. +CATV, 0,155,0x0000,C55ch
  513. +CATV, 0,156,0x0000,C56ch
  514. +CATV, 0,157,0x0000,C57ch
  515. +CATV, 0,158,0x0000,C58ch
  516. +CATV, 0,159,0x0000,C59ch
  517. +CATV, 0,160,0x0000,C60ch
  518. +CATV, 0,161,0x0000,C61ch
  519. +CATV, 0,162,0x0000,C62ch
  520. +CATV, 0,163,0x0000,C63ch
  521. +
  522. +  ; BS (ストリームが重複するチャンネルはコメントアウトしている)
  523. +
  524. +BS, 151, 1,0x4010,BS1/TS0 ;BS朝日
  525. +BS, 161, 1,0x4011,BS1/TS1 ;BS-TBS
  526. +BS, 191, 3,0x4030,BS3/TS0 ;WOWOWプライム
  527. +;BS, 791,17,0x4030,BS3/TS0 ;navi
  528. +BS, 171, 3,0x4031,BS3/TS1 ;BSジャパン
  529. +BS, 192, 5,0x4450,BS5/TS0 ;WOWOWライブ
  530. +BS, 193, 5,0x4451,BS5/TS1 ;WOWOWシネマ
  531. +BS, 201, 7,0x4470,BS7/TS0 ;スター・チャンネル2
  532. +;BS, 202, 7,0x4470,BS7/TS0 ;スター・チャンネル3
  533. +BS, 236, 7,0x4671,BS7/TS1 ;BSアニマックス
  534. +BS, 256, 7,0x4672,BS7/TS2 ;ディズニー・チャンネル
  535. +BS, 211, 9,0x4090,BS9/TS0 ;BS11
  536. +BS, 200, 9,0x4091,BS9/TS1 ;スター・チャンネル1
  537. +BS, 222, 9,0x4092,BS9/TS2 ;TwellV
  538. +BS, 238,11,0x46B0,BS11/TS0 ;FOX bs238
  539. +BS, 241,11,0x46B1,BS11/TS1 ;BSスカパー!
  540. +BS, 231,11,0x46B2,BS11/TS2 ;放送大学BS1
  541. +;BS, 232,11,0x46B2,BS11/TS2 ;放送大学BS2
  542. +;BS, 233,11,0x46B2,BS11/TS2 ;放送大学BS3
  543. +BS, 141,13,0x40D0,BS13/TS0 ;BS日テレ
  544. +BS, 181,13,0x40D1,BS13/TS1 ;BSフジ
  545. +BS, 101,15,0x40F1,BS15/TS1 ;NHKBS1
  546. +BS, 103,15,0x40F2,BS15/TS2 ;NHKBSプレミアム
  547. +;BS, 910,17,0x40F2,BS15/TS2 ;WNI・910
  548. +BS, 291,17,0x4310,BS17/TS1 ;NHK総合・東京
  549. +;BS, 292,17,0x4310,BS17/TS1 ;NHKEテレ東京
  550. +BS, 294,17,0x4311,BS17/TS2 ;日テレ
  551. +;BS, 295,17,0x4311,BS17/TS2 ;テレビ朝日
  552. +;BS, 296,17,0x4311,BS17/TS2 ;TBS
  553. +;BS, 297,17,0x4311,BS17/TS2 ;テレビ東京
  554. +;BS, 298,17,0x4310,BS17/TS1 ;フジテレビ
  555. +;BS, 531,17,0x46B2,BS11/TS2 放送大学ラジオ
  556. +BS, 234,19,0x4730,BS19/TS0 ;グリーンチャンネル
  557. +BS, 242,19,0x4731,BS19/TS1 ;J SPORTS 1
  558. +BS, 243,19,0x4732,BS19/TS2 ;J SPORTS 2
  559. +BS, 252,21,0x4750,BS21/TS0 ;IMAGICA BS
  560. +BS, 244,21,0x4751,BS21/TS1 ;J SPORTS 3
  561. +BS, 245,21,0x4752,BS21/TS2 ;J SPORTS 4
  562. +BS, 251,23,0x4770,BS23/TS0 ;BS釣りビジョン
  563. +BS, 255,23,0x4771,BS23/TS1 ;日本映画専門チャンネル
  564. +BS, 258,23,0x4772,BS23/TS2 ;D-Life
  565. +
  566. +  ; CS110
  567. +
  568. +CS110, 0, 2,0x6020,ND2
  569. +CS110, 0, 4,0x7040,ND4
  570. +CS110, 0, 6,0x7060,ND6
  571. +CS110, 0, 8,0x6080,ND8
  572. +CS110, 0,10,0x60A0,ND10
  573. +CS110, 0,12,0x70C0,ND12
  574. +CS110, 0,14,0x70E0,ND14
  575. +CS110, 0,16,0x7100,ND16
  576. +CS110, 0,18,0x7120,ND18
  577. +CS110, 0,20,0x7140,ND20
  578. +CS110, 0,22,0x7160,ND22
  579. +CS110, 0,24,0x7180,ND24
  580. +
  581. +  ; CS110 ( MHz で記述する場合の例 )
  582. +
  583. +;CS110, 0, 1613.0MHz, 0x6020, ND2
  584. +;CS110, 0, 1653.0MHz, 0x7040, ND4
  585. +;CS110, 0, 1693.0MHz, 0x7060, ND6
  586. +;CS110, 0, 1733.0MHz, 0x6080, ND8
  587. +;CS110, 0, 1773.0MHz, 0x60A0, ND10
  588. +;CS110, 0, 1813.0MHz, 0x70C0, ND12
  589. +;CS110, 0, 1853.0MHz, 0x70E0, ND14
  590. +;CS110, 0, 1893.0MHz, 0x7100, ND16
  591. +;CS110, 0, 1933.0MHz, 0x7120, ND18
  592. +;CS110, 0, 1973.0MHz, 0x7140, ND20
  593. +;CS110, 0, 2013.0MHz, 0x7160, ND22
  594. +;CS110, 0, 2053.0MHz, 0x7180, ND24
  595. +
  596. diff -uPrb Org/BonDriver_Bulldog.ini Mod/BonDriver_Bulldog.ini
  597. --- Org/BonDriver_Bulldog.ini   2012-03-17 13:01:48.000000000 +0900
  598. +++ Mod/BonDriver_Bulldog.ini   2014-12-09 19:14:04.000000000 +0900
  599. @@ -1,205 +1,35 @@
  600. -[BonDriverAKB02]
  601. -
  602. -
  603. -//Channel=ServiceID,PhysicalChannel,TSID,Name
  604. -[VHF]
  605. -0=  0, 1,0x0000,1
  606. -1=  0, 2,0x0000,2
  607. -2=  0, 3,0x0000,3
  608. -3=  0, 4,0x0000,4
  609. -4=  0, 5,0x0000,5
  610. -5=  0, 6,0x0000,6
  611. -6=  0, 7,0x0000,7
  612. -7=  0, 8,0x0000,8
  613. -8=  0, 9,0x0000,9
  614. -9=  0,10,0x0000,10
  615. -10= 0,11,0x0000,11
  616. -11= 0,12,0x0000,12
  617. -
  618. -[UHF]
  619. -0=  0,13,0x0000,13
  620. -1=  0,14,0x0000,14
  621. -2=  0,15,0x0000,15
  622. -3=  0,16,0x0000,16
  623. -4=  0,17,0x0000,17
  624. -5=  0,18,0x0000,18
  625. -6=  0,19,0x0000,19
  626. -7=  0,20,0x0000,20
  627. -8=  0,21,0x0000,21
  628. -9=  0,22,0x0000,22
  629. -10= 0,23,0x0000,23
  630. -11= 0,24,0x0000,24
  631. -12= 0,25,0x0000,25
  632. -13= 0,26,0x0000,26
  633. -14= 0,27,0x0000,27
  634. -15= 0,28,0x0000,28
  635. -16= 0,29,0x0000,29
  636. -17= 0,30,0x0000,30
  637. -18= 0,31,0x0000,31
  638. -19= 0,32,0x0000,32
  639. -20= 0,33,0x0000,33
  640. -21= 0,34,0x0000,34
  641. -22= 0,35,0x0000,35
  642. -23= 0,36,0x0000,36
  643. -24= 0,37,0x0000,37
  644. -25= 0,38,0x0000,38
  645. -26= 0,39,0x0000,39
  646. -27= 0,40,0x0000,40
  647. -28= 0,41,0x0000,41
  648. -29= 0,42,0x0000,42
  649. -30= 0,43,0x0000,43
  650. -31= 0,44,0x0000,44
  651. -32= 0,45,0x0000,45
  652. -33= 0,46,0x0000,46
  653. -34= 0,47,0x0000,47
  654. -35= 0,48,0x0000,48
  655. -36= 0,49,0x0000,49
  656. -37= 0,50,0x0000,50
  657. -38= 0,51,0x0000,51
  658. -39= 0,52,0x0000,52
  659. -40= 0,53,0x0000,53
  660. -41= 0,54,0x0000,54
  661. -42= 0,55,0x0000,55
  662. -43= 0,56,0x0000,56
  663. -44= 0,57,0x0000,57
  664. -45= 0,58,0x0000,58
  665. -46= 0,59,0x0000,59
  666. -47= 0,60,0x0000,60
  667. -48= 0,61,0x0000,61
  668. -49= 0,62,0x0000,62
  669. -
  670. -[CATV]
  671. -0=  0,113,0x0000,C13
  672. -1=  0,114,0x0000,C14
  673. -2=  0,115,0x0000,C15
  674. -3=  0,116,0x0000,C16
  675. -4=  0,117,0x0000,C17
  676. -5=  0,118,0x0000,C18
  677. -6=  0,119,0x0000,C19
  678. -7=  0,120,0x0000,C20
  679. -8=  0,121,0x0000,C21
  680. -9=  0,122,0x0000,C22
  681. -10= 0,123,0x0000,C23
  682. -11= 0,124,0x0000,C24
  683. -12= 0,125,0x0000,C25
  684. -13= 0,126,0x0000,C26
  685. -14= 0,127,0x0000,C27
  686. -15= 0,128,0x0000,C28
  687. -16= 0,129,0x0000,C29
  688. -17= 0,130,0x0000,C30
  689. -18= 0,131,0x0000,C31
  690. -19= 0,132,0x0000,C32
  691. -20= 0,123,0x0000,C33
  692. -21= 0,124,0x0000,C34
  693. -22= 0,125,0x0000,C35
  694. -23= 0,126,0x0000,C36
  695. -24= 0,127,0x0000,C37
  696. -25= 0,128,0x0000,C38
  697. -26= 0,129,0x0000,C39
  698. -27= 0,130,0x0000,C40
  699. -28= 0,131,0x0000,C41
  700. -29= 0,132,0x0000,C42
  701. -30= 0,123,0x0000,C43
  702. -31= 0,124,0x0000,C44
  703. -32= 0,125,0x0000,C45
  704. -33= 0,126,0x0000,C46
  705. -34= 0,127,0x0000,C47
  706. -35= 0,128,0x0000,C48
  707. -36= 0,129,0x0000,C49
  708. -37= 0,130,0x0000,C50
  709. -38= 0,131,0x0000,C51
  710. -39= 0,132,0x0000,C52
  711. -40= 0,123,0x0000,C53
  712. -41= 0,124,0x0000,C54
  713. -42= 0,125,0x0000,C55
  714. -43= 0,126,0x0000,C56
  715. -44= 0,127,0x0000,C57
  716. -45= 0,128,0x0000,C58
  717. -46= 0,129,0x0000,C59
  718. -47= 0,130,0x0000,C60
  719. -48= 0,131,0x0000,C61
  720. -49= 0,132,0x0000,C62
  721. -50= 0,123,0x0000,C63
  722. -
  723. -[BS]
  724. -0= 151, 1,0x4010,BS1/TS0 BS朝日
  725. -1= 161, 1,0x4011,BS1/TS1 BS-TBS
  726. -2= 191, 3,0x4030,BS3/TS0 WOWOWプライム
  727. -3= 791,17,0x4030,BS3/TS0 navi
  728. -4= 171, 3,0x4031,BS3/TS1 BSジャパン
  729. -5= 192, 5,0x4450,BS5/TS0 WOWOWライブ
  730. -6= 193, 5,0x4451,BS5/TS1 WOWOWシネマ
  731. -7= 201, 7,0x4470,BS7/TS0 スター・チャンネル2
  732. -8= 202, 7,0x4470,BS7/TS0 スター・チャンネル3
  733. -9= 236, 7,0x4671,BS7/TS1 BSアニマックス
  734. -10=256, 7,0x4672,BS7/TS2 ディズニー・チャンネル
  735. -11=211, 9,0x4090,BS9/TS0 BS11
  736. -12=200, 9,0x4091,BS9/TS1 スター・チャンネル1
  737. -13=222, 9,0x4092,BS9/TS2 TwellV
  738. -14=238,11,0x46B0,BS11/TS0 FOX bs238
  739. -15=241,11,0x46B1,BS11/TS1 BSスカパー!
  740. -16=231,11,0x46B2,BS11/TS2 放送大学BS1
  741. -17=232,11,0x46B2,BS11/TS2 放送大学BS2
  742. -18=233,11,0x46B2,BS11/TS2 放送大学BS3
  743. -19=141,13,0x40D0,BS13/TS0 BS日テレ
  744. -20=181,13,0x40D1,BS13/TS1 BSフジ
  745. -21=101,15,0x40F1,BS15/TS1 NHKBS1
  746. -22=103,15,0x40F2,BS15/TS2 NHKBSプレミアム
  747. -23=910,17,0x40F2,BS15/TS2 WNI・910
  748. -24=291,17,0x4310,BS17/TS1 NHK総合・東京
  749. -25=292,17,0x4310,BS17/TS1 NHKEテレ東京
  750. -26=294,17,0x4311,BS17/TS2 日テレ
  751. -27=295,17,0x4311,BS17/TS2 テレビ朝日
  752. -28=296,17,0x4311,BS17/TS2 TBS
  753. -29=297,17,0x4311,BS17/TS2 テレビ東京
  754. -30=298,17,0x4310,BS17/TS1 フジテレビ
  755. -31=531,17,0x46B2,BS11/TS2 放送大学ラジオ
  756. -32=234,19,0x4730,BS19/TS0 グリーンチャンネル
  757. -33=242,19,0x4731,BS19/TS1 J SPORTS 1
  758. -34=243,19,0x4732,BS19/TS2 J SPORTS 2
  759. -35=252,21,0x4750,BS21/TS0 IMAGICA BS
  760. -36=244,21,0x4751,BS21/TS1 J SPORTS 3
  761. -37=245,21,0x4752,BS21/TS2 J SPORTS 4
  762. -38=251,23,0x4770,BS23/TS0 BS釣りビジョン
  763. -39=255,23,0x4771,BS23/TS1 日本映画専門チャンネル
  764. -40=258,23,0x4772,BS23/TS2 D-Life
  765. -
  766. -
  767. -0= 101,15,0x40F1,NHKBS1
  768. -1= 102,15,0x40F1,NHK BS2
  769. -2= 103,15,0x40F2,NHK BSプレミアム
  770. -3= 141,13,0x40D0,BS日テレ
  771. -4= 151, 1,0x4010,BS朝日1
  772. -5= 161, 1,0x4011,BS-TBS
  773. -6= 171, 3,0x4031,BSジャパン
  774. -7= 181,13,0x40D1,BSフジ・181
  775. -8= 191, 3,0x4030,WOWOWプライム
  776. -9= 200, 9,0x4470,スター・チャンネル1,
  777. -10=211, 9,0x4090,BS11
  778. -11=222, 9,0x4092,TwellV
  779. -12=192, 5,0x4030,WOWOWライブ
  780. -13=193, 5,0x4030,WOWOWシネマ
  781. -14=201, 7,0x4470,スター・チャンネル2
  782. -15=202, 7,0x4470,スター・チャンネル3
  783. -16=231,11,0x46B2,放送大学テレビ
  784. -17=234,19,0x4730,グリーンチャンネル
  785. -18=236, 7,0x4671,BSアニマックス
  786. -19=238,11,0x46B0,FOX bs238
  787. -20=241,11,0x46B1,BSスカパー!
  788. -21=242,19,0x4731,J SPORTS 1
  789. -22=243,19,0x4732,J SPORTS 2
  790. -
  791. -[CS110]
  792. -0= 0, 2,0x6020,ND2
  793. -1= 0, 4,0x7040,ND4
  794. -2= 0, 6,0x7060,ND6
  795. -3= 0, 8,0x6080,ND8
  796. -4= 0,10,0x60A0,ND10
  797. -5= 0,12,0x70C0,ND12
  798. -6= 0,14,0x70E0,ND14
  799. -7= 0,16,0x7100,ND16
  800. -8= 0,18,0x7120,ND18
  801. -9= 0,20,0x7140,ND20
  802. -10=0,22,0x7160,ND22
  803. -11=0,24,0x7180,ND24
  804. +[BonTuner]
  805. +TSDataSize=131072
  806. +TSQueueNum=12
  807. +ASyncTSQueueNum=24
  808. +ASyncTSQueueMax=768
  809. +ASyncTSEmptyBorder=8
  810. +TSThreadWait=1000
  811. +
  812. +; TSバッファリング処理を複数のスレッドを利用して効率化するかどうか
  813. +; ( シングルCPU環境や非力PC環境の場合はコメントアウト推奨 )
  814. +TSDualThreading=1
  815. +
  816. +ISDBTCommandSendTimes=2
  817. +ISDBTCommandSendWait=100
  818. +ISDBSCommandSendTimes=2
  819. +ISDBSCommandSendWait=100
  820. +
  821. +
  822. +; ※ 以下のオプションを変更した結果、アプリケーション固有のチャンネル情報が
  823. +; 壊れる場合があり、それに伴いチャンネル情報の削除や再スキャンが別途必要に
  824. +; なることがある為、アプリケーションの挙動を把握しながら書き換えること
  825. +
  826. +; 使用しないチューナー空間の羅列を InvisibleSpaces に記述すると
  827. +; そのチューナー空間とチャンネル情報は、消去される
  828. +;InvisibleSpaces=VHF,UHF
  829. +
  830. +; 使用しないチューナー空間の羅列を InvalidSpaces に記述すると
  831. +; そのチューナー空間のチャンネル情報は、空になる(チューナー空間は消去しない)
  832. +;InvalidSpaces=VHF,CATV
  833. +
  834. +; チューナー空間の羅列を SpaceArrangement に記述するとその記述された
  835. +; 順番通りにチューナー空間を並べ替えて表示することが可能となる
  836. +;(記述のないチューナー空間は自動的に最後尾に追記される)
  837. +;SpaceArrangement=UHF,BS,CS110
  838.  
  839. diff -uPrb Org/BonTuner.cpp Mod/BonTuner.cpp
  840. --- Org/BonTuner.cpp    2012-04-07 16:37:52.000000000 +0900
  841. +++ Mod/BonTuner.cpp    2014-12-09 22:20:22.000000000 +0900
  842. @@ -4,6 +4,7 @@
  843.  
  844.  #include "stdafx.h"
  845.  #include <SetupApi.h>
  846. +#include <functional>
  847.  #include <Malloc.h>
  848.  #include <InitGuid.h>
  849.  #include <Math.h>
  850. @@ -20,15 +21,23 @@
  851.  // 定数定義
  852.  //////////////////////////////////////////////////////////////////////
  853.  
  854. -// ミューテックス名
  855. -#define MUTEX_NAME         TEXT("BonDriver Bulldog")
  856. -
  857.  // 受信サイズ
  858. -#define TSDATASIZE         65536UL                                     // TSデータのサイズ
  859. +DWORD TSDATASIZE        =   131072UL ;       // TSデータのサイズ
  860. +DWORD TSQUEUENUM        =   24UL     ;       // TSデータの環状ストック数(最大数63まで)
  861. +DWORD TSTHREADWAIT      =   1000UL   ;       // TSスレッドキュー毎に待つ最大時間
  862. +int   TSTHREADPRIORITY  =   THREAD_PRIORITY_HIGHEST ; // TSスレッドの優先度
  863. +BOOL  TSDUALTHREADING   =   FALSE    ;       // TSスレッドキュー待ちのマルチスレッド効率化
  864.  
  865.  // FIFOバッファ設定
  866. -#define ASYNCBUFFTIME      4UL                                         // バッファ長 = 4秒
  867. -#define ASYNCBUFFSIZE      ( 0x400000 / TSDATASIZE * ASYNCBUFFTIME )   // 平均32Mbpsとする
  868. +DWORD ASYNCTSQUEUENUM    =   32UL   ;        // 非同期TSデータの環状ストック数(初期値)
  869. +DWORD ASYNCTSQUEUEMAX    =   768UL  ;        // 非同期TSデータの環状ストック最大数
  870. +DWORD ASYNCTSEMPTYBORDER =   8UL    ;        // 非同期TSデータの空きストック数底値閾値
  871. +
  872. +// ウェイト
  873. +DWORD ISDBTCOMMANDSENDTIMES = 2 ;
  874. +DWORD ISDBTCOMMANDSENDWAIT  = 100 ;
  875. +DWORD ISDBSCOMMANDSENDTIMES = 2 ;
  876. +DWORD ISDBSCOMMANDSENDWAIT  = 100 ;
  877.  
  878.  // エンドポイントインデックス
  879.  #define EPINDEX_IN         0UL
  880. @@ -75,12 +84,12 @@
  881.  _T("151, 1,0x4010,BS1/TS0 BS朝日"),
  882.  _T("161, 1,0x4011,BS1/TS1 BS-TBS"),
  883.  _T("191, 3,0x4030,BS3/TS0 WOWOWプライム"),
  884. -_T("791,17,0x4030,BS3/TS0 navi"),
  885. +//_T("791,17,0x4030,BS3/TS0 navi"),
  886.  _T("171, 3,0x4031,BS3/TS1 BSジャパン"),
  887.  _T("192, 5,0x4450,BS5/TS0 WOWOWライブ"),
  888.  _T("193, 5,0x4451,BS5/TS1 WOWOWシネマ"),
  889.  _T("201, 7,0x4470,BS7/TS0 スター・チャンネル2"),
  890. -_T("202, 7,0x4470,BS7/TS0 スター・チャンネル3"),
  891. +//_T("202, 7,0x4470,BS7/TS0 スター・チャンネル3"),
  892.  _T("236, 7,0x4671,BS7/TS1 BSアニマックス"),
  893.  _T("256, 7,0x4672,BS7/TS2 ディズニー・チャンネル"),
  894.  _T("211, 9,0x4090,BS9/TS0 BS11"),
  895. @@ -89,21 +98,21 @@
  896.  _T("238,11,0x46B0,BS11/TS0 FOX bs238"),
  897.  _T("241,11,0x46B1,BS11/TS1 BSスカパー!"),
  898.  _T("231,11,0x46B2,BS11/TS2 放送大学BS1"),
  899. -_T("232,11,0x46B2,BS11/TS2 放送大学BS2"),
  900. -_T("233,11,0x46B2,BS11/TS2 放送大学BS3"),
  901. +//_T("232,11,0x46B2,BS11/TS2 放送大学BS2"),
  902. +//_T("233,11,0x46B2,BS11/TS2 放送大学BS3"),
  903.  _T("141,13,0x40D0,BS13/TS0 BS日テレ"),
  904.  _T("181,13,0x40D1,BS13/TS1 BSフジ"),
  905.  _T("101,15,0x40F1,BS15/TS1 NHKBS1"),
  906.  _T("103,15,0x40F2,BS15/TS2 NHKBSプレミアム"),
  907. -_T("910,17,0x40F2,BS15/TS2 WNI・910"),
  908. +//_T("910,17,0x40F2,BS15/TS2 WNI・910"),
  909.  _T("291,17,0x4310,BS17/TS1 NHK総合・東京"),
  910. -_T("292,17,0x4310,BS17/TS1 NHKEテレ東京"),
  911. +//_T("292,17,0x4310,BS17/TS1 NHKEテレ東京"),
  912.  _T("294,17,0x4311,BS17/TS2 日テレ"),
  913. -_T("295,17,0x4311,BS17/TS2 テレビ朝日"),
  914. -_T("296,17,0x4311,BS17/TS2 TBS"),
  915. -_T("297,17,0x4311,BS17/TS2 テレビ東京"),
  916. -_T("298,17,0x4310,BS17/TS1 フジテレビ"),
  917. -_T("531,17,0x46B2,BS11/TS2 放送大学ラジオ"),
  918. +//_T("295,17,0x4311,BS17/TS2 テレビ朝日"),
  919. +//_T("296,17,0x4311,BS17/TS2 TBS"),
  920. +//_T("297,17,0x4311,BS17/TS2 テレビ東京"),
  921. +//_T("298,17,0x4310,BS17/TS1 フジテレビ"),
  922. +//_T("531,17,0x46B2,BS11/TS2 放送大学ラジオ"),
  923.  _T("234,19,0x4730,BS19/TS0 グリーンチャンネル"),
  924.  _T("242,19,0x4731,BS19/TS1 J SPORTS 1"),
  925.  _T("243,19,0x4732,BS19/TS2 J SPORTS 2"),
  926. @@ -134,6 +143,7 @@
  927.  NULL
  928.  };
  929.  
  930. +using namespace std ;
  931.  
  932.  //////////////////////////////////////////////////////////////////////
  933.  // インスタンス生成メソッド
  934. @@ -151,6 +161,80 @@
  935.  
  936.  
  937.  //////////////////////////////////////////////////////////////////////
  938. +// ユーティリティ
  939. +//////////////////////////////////////////////////////////////////////
  940. +
  941. +template<class String> String inline trim(const String &str)
  942. +{
  943. +  String str2 ; str2.clear() ;
  944. +  for(typename String::size_type i=0;i<str.size();i++) {
  945. +    if(unsigned(str[i])>0x20UL) {
  946. +      str2 = str.substr(i,str.size()-i) ;
  947. +      break ;
  948. +    }
  949. +  }
  950. +  if(str2.empty()) return str2 ;
  951. +  for(typename String::size_type i=str2.size();i>0;i--) {
  952. +    if(unsigned(str2[i-1])>0x20UL) {
  953. +      return str2.substr(0,i) ;
  954. +    }
  955. +  }
  956. +  str2.clear() ;
  957. +  return str2 ;
  958. +}
  959. +
  960. +static wstring mbcs2wcs(string src)
  961. +{
  962. +    if(src.empty()) return wstring(L"") ;
  963. +    wchar_t *wcs = new wchar_t[src.length()*2 + 2];
  964. +    size_t wLen = 0;
  965. +    setlocale(LC_ALL,"japanese");
  966. +    mbstowcs_s(&wLen, wcs, src.length()*2+1 , src.c_str(), _TRUNCATE);
  967. +    wstring result = wcs ;
  968. +    delete [] wcs;
  969. +    return result ;
  970. +}
  971. +
  972. +static string wcs2mbcs(wstring src)
  973. +{
  974. +    if(src.empty()) return string("") ;
  975. +    char *mbcs = new char[src.length()*2 + 2] ;
  976. +    size_t mbLen = 0 ;
  977. +    setlocale(LC_ALL,"japanese");
  978. +    wcstombs_s(&mbLen, mbcs, src.length()*2+1 , src.c_str(), _TRUNCATE);
  979. +    string result = mbcs ;
  980. +    delete [] mbcs;
  981. +    return result ;
  982. +}
  983. +
  984. +#if 0
  985. +template<class Container> void inline split(
  986. +   Container &DivStrings, const typename Container::value_type &Text,
  987. +   typename Container::value_type::value_type Delimiter)
  988. +#else
  989. +template<class Container,class String> void inline split(
  990. +   Container &DivStrings/*string container*/, const String &Text,
  991. +   typename String::value_type Delimiter)
  992. +#endif
  993. +{
  994. +  #ifdef _DEBUG
  995. +  assert(typeid(typename Container::value_type)==typeid(Text));
  996. +  #endif
  997. +  typename Container::value_type temp; temp.clear() ;
  998. +  for(typename Container::value_type::size_type i=0;i<Text.size();i++) {
  999. +    if(Text[i]==Delimiter) {
  1000. +      DivStrings.push_back(trim(temp));
  1001. +      temp.clear();
  1002. +      continue;
  1003. +    }
  1004. +    temp+=Text[i];
  1005. +  }
  1006. +  if(!trim(temp).empty()) {
  1007. +     DivStrings.push_back(trim(temp));
  1008. +  }
  1009. +}
  1010. +
  1011. +//////////////////////////////////////////////////////////////////////
  1012.  // 構築/消滅
  1013.  //////////////////////////////////////////////////////////////////////
  1014.  
  1015. @@ -163,15 +247,18 @@
  1016.  CBonTuner::CBonTuner()
  1017.     : m_pUsbFx2Driver(NULL)
  1018.     , m_hOnStreamEvent(NULL)
  1019. +    , m_thAllocFifo(NULL)
  1020.     , m_hMutex(NULL)
  1021. +   , is_channel_valid(FALSE)
  1022.  {
  1023. -   char    bf[256];
  1024. -   char    key[8];
  1025. +   //char  bf[256];
  1026. +   //char  key[8];
  1027.  
  1028.     m_pThis = this;
  1029.     fOpened=false;
  1030.  
  1031. -   LoadIni();
  1032. +    m_yFx2Id = 0 ;
  1033. +   InitTunerProperty();
  1034.  }
  1035.  
  1036.  //*****    Destructor  *****
  1037. @@ -204,17 +291,30 @@
  1038.     m_pUsbFx2Driver = new CUsbFx2Driver(this);
  1039.     if(!m_pUsbFx2Driver)return false;
  1040.    
  1041. +    // ストリーム一時停止
  1042. +    is_channel_valid = FALSE ;
  1043. +
  1044.     // FX2の初期化シーケンス
  1045.     try{
  1046.         // FIFOバッファ確保
  1047.         AllocFifoBuff();
  1048.  
  1049. +        // FIFOアロケーションスレッド作成
  1050. +        m_thAllocFifo = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CBonTuner::AllocFifoThread, this, CREATE_SUSPENDED, NULL) ;
  1051. +       if(m_thAllocFifo == INVALID_HANDLE_VALUE) {
  1052. +           m_thAllocFifo = NULL;
  1053. +       }else{
  1054. +           //::SetThreadPriority( m_thAllocFifo, THREAD_PRIORITY_HIGHEST/*TIME_CRITICAL*/ );
  1055. +           m_evAllocFifo = ::CreateEvent ( NULL, FALSE, FALSE, NULL );
  1056. +       }
  1057. +
  1058.         // イベント作成
  1059.         if(!(m_hOnStreamEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL)))throw (const DWORD)__LINE__;
  1060.  
  1061.         sz=sizeof(DefBulldogFW);
  1062.         memcpy(BulldogFirmWare,DefBulldogFW,sz);
  1063.  
  1064. +       #ifdef _DEBUG
  1065.         fopen_s(&fp, "Bulldog.fw","rb");
  1066.         if (fp)
  1067.         {
  1068. @@ -227,9 +327,10 @@
  1069.             }
  1070.             fclose(fp);
  1071.         }
  1072. +       #endif
  1073.  
  1074.         // ドライバオープン
  1075. -       if(!m_pUsbFx2Driver->OpenDriver(0x00U, BulldogFirmWare, sz,"Bulldog_FIFO"))throw (const DWORD)__LINE__;             //xxxxx
  1076. +       if(!m_pUsbFx2Driver->OpenDriver(m_yFx2Id, BulldogFirmWare, sz,/*"Bulldog_FIFO"*/"FX2_FIFO"))throw (const DWORD)__LINE__;                //xxxxx
  1077.  
  1078.         // エンドポイント追加
  1079.         if(!m_pUsbFx2Driver->AddEndPoint(0x81U))throw (const DWORD)__LINE__;    // EPINDEX_IN
  1080. @@ -241,14 +342,14 @@
  1081.         if(!m_pUsbFx2Driver->TransmitFormatedData(EPINDEX_OUT, 6UL, CMD_PORT_CFG, 0x00U, PIO_START, CMD_MODE_IDLE, CMD_IFCONFIG, 0xE3U))throw (const DWORD)__LINE__;
  1082.  
  1083.         // スレッド起動
  1084. -       if(!m_pUsbFx2Driver->CreateFifoThread(0x86U, NULL, TSDATASIZE))throw (const DWORD)__LINE__;
  1085. +       if(!m_pUsbFx2Driver->CreateFifoThread(0x86U, &m_dwFifoThreadIndex, TSDATASIZE, TSQUEUENUM, TSTHREADWAIT, TSTHREADPRIORITY, TSDUALTHREADING))throw (const DWORD)__LINE__;
  1086.  
  1087.         // 開始コマンド送信
  1088.  //     if(!m_pUsbFx2Driver->TransmitFormatedData(EPINDEX_OUT, 3UL, CMD_EP6IN_START, CMD_PORT_WRITE, PIO_START | PIO_IR_OUT | PIO_TS_BACK))throw (const DWORD)__LINE__;
  1089.         if(!m_pUsbFx2Driver->TransmitFormatedData(EPINDEX_OUT, 3UL, CMD_EP6IN_START, CMD_PORT_WRITE, PIO_START))throw (const DWORD)__LINE__;
  1090.  
  1091.         // ミューテックス作成
  1092. -       if(!(m_hMutex = ::CreateMutex(NULL, TRUE, MUTEX_NAME)))throw (const DWORD)__LINE__;
  1093. +       if(!(m_hMutex = ::CreateMutex(NULL, TRUE, m_szTunerName)))throw (const DWORD)__LINE__;
  1094.  
  1095.         // 成功
  1096.     }
  1097. @@ -261,6 +362,10 @@
  1098.     }
  1099.  
  1100.     fOpened=true;
  1101. +
  1102. +    if(m_thAllocFifo) // Start Fifo Asynchronized Allocator
  1103. +      ::ResumeThread(m_thAllocFifo) ;
  1104. +
  1105.     return(TRUE);
  1106.  }
  1107.  
  1108. @@ -295,6 +400,17 @@
  1109.         m_hMutex = NULL;
  1110.     }
  1111.        
  1112. +    // FIFOアロケーションスレッド破棄
  1113. +    if(m_thAllocFifo) {
  1114. +      SetEvent(m_evAllocFifo) ;
  1115. +      if(::WaitForSingleObject(m_thAllocFifo, TSTHREADWAIT*2+5000) != WAIT_OBJECT_0) {
  1116. +        ::TerminateThread(m_thAllocFifo, 0);
  1117. +      }
  1118. +      ::CloseHandle(m_thAllocFifo) ;
  1119. +      ::CloseHandle(m_evAllocFifo) ;
  1120. +      m_thAllocFifo = NULL ;
  1121. +    }
  1122. +
  1123.     // バッファ開放
  1124.     FreeFifoBuff();
  1125.  
  1126. @@ -316,11 +432,14 @@
  1127.     ch:13-62    UHF
  1128.     ch:113-163  ケーブルTV
  1129.  */
  1130. -void   CBonTuner::SetISDBTChannel(int ch)
  1131. +void   CBonTuner::SetISDBTChannel(int ch,float MegaHz)
  1132.  {
  1133. -   SetMxl5007(ch);
  1134. -   SetTC90502(ISDB_T);
  1135. -   Sleep(100);
  1136. +   for(DWORD i=0;i<ISDBTCOMMANDSENDTIMES;i++) {
  1137. +     //if(i) Sleep(100) ;
  1138. +      SetMxl5007(ch,MegaHz);
  1139. +     if(TC90502_OK==SetTC90502(ISDB_T)) ; //break ;
  1140. +     Sleep(ISDBTCOMMANDSENDWAIT);
  1141. +    }
  1142.  }
  1143.  
  1144.  //*****    Set ISDB-S Channel  *****
  1145. @@ -329,14 +448,17 @@
  1146.     ch:1-23 (奇数)    BS
  1147.     ch:2-24 (偶数)    CS
  1148.  */
  1149. -void   CBonTuner::SetISDBSChannel(int ch,int tsid)
  1150. +void   CBonTuner::SetISDBSChannel(int ch,int tsid,float MegaHz)
  1151.  {
  1152. -   SetStv6110a(ch);
  1153. +   for(DWORD i=0;i<ISDBSCOMMANDSENDTIMES;i++) {
  1154. +        SetStv6110a(ch,MegaHz);
  1155.     SetTC90502(ISDB_S);
  1156.     SetTSID(tsid);
  1157.  
  1158.     WriteReg(DEMODSADRS,0x03,0x01);                         //同期シーケンス開始
  1159. -   Sleep(100);
  1160. +
  1161. +        Sleep(ISDBSCOMMANDSENDWAIT);
  1162. +    }
  1163.  /*
  1164.     DWORD   tm=GetTickCount()+3000;
  1165.  
  1166. @@ -384,10 +506,12 @@
  1167.  
  1168.  CLockStatus    CBonTuner::IsLock(void)
  1169.  {
  1170. -   if (m_dwCurSpace<3)
  1171. +   DWORD ch = GetCurRealChannel() ;
  1172. +   if (m_Channels[ch].isISDBT())
  1173.         return(IsLockISDBT());
  1174. -
  1175. +   else if (m_Channels[ch].isISDBS())
  1176.     return(IsLockISDBS());
  1177. +   return stUnknown ;
  1178.  }
  1179.  
  1180.  //*****    Get C/N *****
  1181. @@ -399,10 +523,12 @@
  1182.     double          cn;
  1183.     double          p,p2,p3,p4;
  1184.  
  1185. -   if (fOpened==false)
  1186. +   if (!fOpened||!is_channel_valid)
  1187.         return(0);
  1188.  
  1189. -   if (m_dwCurSpace<3)                                                     //ISDB-T
  1190. +   DWORD ch = GetCurRealChannel() ;
  1191. +
  1192. +   if (m_Channels[ch].isISDBT())                                                       //ISDB-T
  1193.     {
  1194.         I2CRead(DEMODTADRS,0x8B,3,Data);
  1195.         cndata=(Data[0]<<16) | (Data[1]<<8) | Data[2];
  1196. @@ -412,7 +538,7 @@
  1197.         p4=p3*p;
  1198.         cn=(double)0.000024*p4-0.0016*p3+0.0398*p2+0.5491*p+3.0965;
  1199.     }
  1200. -   else {                                                                  //BS/CS
  1201. +   else if(m_Channels[ch].isISDBS()) {                                                                 //BS/CS
  1202.         I2CRead(DEMODSADRS,0xBC,2,Data);
  1203.         cndata=(Data[0]<<8) | Data[1];
  1204.         if (cndata>=3000)
  1205. @@ -423,6 +549,8 @@
  1206.         else {
  1207.             cn=0;
  1208.         }
  1209. +   }else {
  1210. +      cn = 0 ;
  1211.     }
  1212.  
  1213.     if ((cn<0) || (cndata==0))
  1214. @@ -439,14 +567,18 @@
  1215.     int     berdata,packetcycle;
  1216.     double  ber;
  1217.  
  1218. -   if (m_dwCurSpace<3)
  1219. +   DWORD ch = GetCurRealChannel() ;
  1220. +
  1221. +   if (m_Channels[ch].isISDBT())                                                       //ISDB-T
  1222.     {
  1223.         I2CRead(DEMODTADRS,0xA0,3,darray);
  1224.         I2CRead(DEMODTADRS,0xA6,2,carray);
  1225.     }
  1226. -   else {
  1227. +   else if(m_Channels[ch].isISDBS()) {                                                                 //BS/CS
  1228.         I2CRead(DEMODTADRS+1,0xEB,3,darray);
  1229.         I2CRead(DEMODTADRS+1,0xEE,2,carray);
  1230. +   }else {
  1231. +       return 0.0 ;
  1232.     }
  1233.  
  1234.     packetcycle=(carray[0]<<8) | carray[1];
  1235. @@ -459,22 +591,59 @@
  1236.     return(ber);
  1237.  }
  1238.  
  1239. +void CBonTuner::ResetFxFifo()
  1240. +{
  1241. +    if(m_pUsbFx2Driver)
  1242. +      m_pUsbFx2Driver->ResetFifoThread(m_dwFifoThreadIndex) ;
  1243. +}
  1244. +
  1245. +//*****    SetRealChannel  *****
  1246. +
  1247. +const BOOL CBonTuner::SetRealChannel(const DWORD dwCh)
  1248. +{
  1249. +    //ストリーム一時停止
  1250. +    is_channel_valid = FALSE;
  1251. +
  1252. +    // 撮り溜めたTSストリームの破棄
  1253. +    PurgeTsStream();
  1254. +
  1255. +    if(dwCh >= m_Channels.size()){
  1256. +        return FALSE;
  1257. +    }
  1258. +
  1259. +    //チューニング
  1260. +    if(m_Channels[dwCh].isISDBT()) {  // 地上波
  1261. +      SetISDBTChannel(m_Channels[dwCh].Channel,m_Channels[dwCh].MegaHz) ;
  1262. +    }else if(m_Channels[dwCh].isISDBS()) { // BS/CS
  1263. +      SetISDBSChannel(m_Channels[dwCh].Channel,
  1264. +        m_Channels[dwCh].TSID,m_Channels[dwCh].MegaHz) ;
  1265. +    }else {
  1266. +      return FALSE ;
  1267. +    }
  1268. +
  1269. +    // Fx側バッファ初期化
  1270. +    ResetFxFifo() ;
  1271. +
  1272. +    //ストリーム再開
  1273. +    is_channel_valid = TRUE;
  1274. +
  1275. +    return TRUE ;
  1276. +}
  1277. +
  1278. +
  1279.  //*****    Set Channel *****
  1280.  
  1281.  const BOOL CBonTuner::SetChannel(const BYTE ch)
  1282.  {
  1283. -   if (ch<12)
  1284. -       m_dwCurSpace = 0;
  1285. -   else if (ch<63)
  1286. -       m_dwCurSpace = 1;
  1287. -   else if (ch<200)
  1288. -       m_dwCurSpace = 2;
  1289. +    if(m_ChannelAnchors.size()<=ch) return FALSE ;
  1290.  
  1291. -   m_dwCurChannel = ch;
  1292. +    if(!SetRealChannel(m_ChannelAnchors[ch])) return FALSE ;
  1293.  
  1294. -   SetISDBTChannel(ch);
  1295. +    // チャンネル情報を更新
  1296. +    m_dwCurSpace=space_index_of(ch) ;
  1297. +    m_dwCurChannel=channel_index_of(ch) ;
  1298.  
  1299. -   return TRUE;
  1300. +    return TRUE ;
  1301.  }
  1302.  
  1303.  //*****    Get Signal Level    *****
  1304. @@ -484,10 +653,6 @@
  1305.     double  d=GetCN();
  1306.  
  1307.     return((float)d);
  1308. -/*
  1309. -   // FIFOバッファのFullnessを返す
  1310. -   return ((float)m_FifoBuffer.size() / (float)ASYNCBUFFSIZE * 100.0f);
  1311. -*/
  1312.  }
  1313.  
  1314.  //*****    Wait TS Stream  *****
  1315. @@ -495,11 +660,14 @@
  1316.  const DWORD CBonTuner::WaitTsStream(const DWORD dwTimeOut)
  1317.  {
  1318.  // OutputDebugString(_T("WaitTsStream\n"));
  1319. -   return 0UL;
  1320. +// return 0UL;
  1321.  
  1322.     // 終了チェック
  1323.     if(!m_pUsbFx2Driver)return WAIT_ABANDONED;
  1324.  
  1325. +   // バッファ済みの場合は無駄に待機せずに制御を戻す @ 2014/01/26(Sun)
  1326. +   if(!m_FifoIndices.empty()) return WAIT_OBJECT_0;
  1327. +
  1328.     // イベントがシグナル状態になるのを待つ
  1329.     const DWORD dwRet = ::WaitForSingleObject(m_hOnStreamEvent, (dwTimeOut)? dwTimeOut : INFINITE);
  1330.  
  1331. @@ -525,7 +693,7 @@
  1332.  const DWORD CBonTuner::GetReadyCount()
  1333.  {
  1334.     // 取り出し可能TSデータ数を取得する
  1335. -   return m_FifoBuffer.size();
  1336. +   return (DWORD)m_FifoIndices.size();
  1337.  }
  1338.  
  1339.  //*****    Get TS Stream   *****
  1340. @@ -542,7 +710,7 @@
  1341.     {
  1342.         if(*pdwSize)
  1343.         {
  1344. -           ::CopyMemory(pDst, pSrc, *pdwSize);
  1345. +           CopyMemory(pDst, pSrc, *pdwSize);
  1346.         }
  1347.        
  1348.         return TRUE;
  1349. @@ -564,20 +732,21 @@
  1350.         return FALSE;
  1351.  
  1352.     // TSデータをバッファから取り出す
  1353. -   if(m_FifoBuffer.size())
  1354. -   {
  1355. +    if(!m_FifoIndices.empty()){
  1356.         // データコピー
  1357. -       if(pdwSize)*pdwSize = TSDATASIZE;
  1358. -       if(ppDst)*ppDst = m_FifoBuffer.front();
  1359. -       m_FifoBuffer.pop();
  1360. -       if(pdwRemain)
  1361. -           *pdwRemain = m_FifoBuffer.size();
  1362. +        size_t index = m_FifoIndices.front() ;
  1363. +        *pdwSize = (DWORD)m_BufferPool[index].size() ;
  1364. +        *ppDst = (BYTE*)m_BufferPool[index].top() ;
  1365. +        m_EmptyFifoIndices.push(index) ;
  1366. +        m_FifoIndices.pop();
  1367. +        *pdwRemain = (DWORD)m_FifoIndices.size() ;
  1368. +
  1369.         return TRUE;
  1370.     }
  1371.     else{
  1372.         // 取り出し可能なデータがない
  1373. -       if(pdwSize)*pdwSize = 0UL;
  1374. -       if(pdwRemain)*pdwRemain = 0UL;
  1375. +        *pdwSize = 0;
  1376. +        *pdwRemain = 0;
  1377.  
  1378.         return TRUE;
  1379.     }
  1380. @@ -591,10 +760,12 @@
  1381.     CBlockLock Lock(&m_CriticalLock);
  1382.    
  1383.     // 未処理のデータをパージする
  1384. -   while(!m_FifoBuffer.empty())
  1385. -   {
  1386. -       m_FifoBuffer.pop();
  1387. +   while(!m_FifoIndices.empty()) {
  1388. +       m_EmptyFifoIndices.push(m_FifoIndices.front()) ;
  1389. +        m_FifoIndices.pop() ;
  1390.     }
  1391. +
  1392. +   //ResetFxFifo() ;
  1393.  }
  1394.  
  1395.  //*****    Get Tuner Name  *****
  1396. @@ -602,15 +773,16 @@
  1397.  LPCTSTR CBonTuner::GetTunerName(void)
  1398.  {
  1399.     // チューナ名を返す
  1400. -   return TEXT("Bulldog");
  1401. +   return m_szTunerName ;
  1402.  }
  1403.  
  1404.  //*****    Is Tuner Opening    *****
  1405.  
  1406.  const BOOL CBonTuner::IsTunerOpening(void)
  1407.  {
  1408. +#if 1
  1409.     // チューナの使用中の有無を返す(全プロセスを通して)
  1410. -   HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, MUTEX_NAME);
  1411. +   HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, m_szTunerName);
  1412.    
  1413.     if(hMutex)
  1414.     {
  1415. @@ -622,95 +794,54 @@
  1416.         // チューナは開かれていない
  1417.         return FALSE;
  1418.     }
  1419. +#else
  1420. +    return fOpened ? TRUE : FALSE ;
  1421. +#endif
  1422.  }
  1423.  
  1424.  //*****    Enum Tuning Space   *****
  1425.  
  1426.  LPCTSTR CBonTuner::EnumTuningSpace(const DWORD dwSpace)
  1427.  {
  1428. -   // 使用可能なチューニング空間を返す
  1429. -   switch(dwSpace)
  1430. -   {
  1431. -       case 0UL :  return TEXT("VHF");
  1432. -       case 1UL :  return TEXT("UHF");
  1433. -       case 2UL :  return TEXT("CATV");
  1434. -       case 3UL :  return TEXT("BS");
  1435. -       case 4UL :  return TEXT("CS110");
  1436. -       default  :  return NULL;       
  1437. -   }
  1438. +    if(m_SpaceAnchors.size()<=dwSpace)
  1439. +      return NULL ;
  1440. +    return m_Channels[m_SpaceAnchors[dwSpace]].Space.c_str() ;
  1441.  }
  1442.  
  1443.  //*****    Enum Channel Name   *****
  1444.  
  1445.  LPCTSTR CBonTuner::EnumChannelName(const DWORD dwSpace, const DWORD dwChannel)
  1446.  {
  1447. -   // 使用可能なチャンネルを返す
  1448. -   switch(dwSpace)
  1449. -   {
  1450. -       case 0UL :                              //VHF
  1451. -           if (dwChannel>=VHFNumChannel)
  1452. -               return(NULL);
  1453. -           return((LPCTSTR)VHFChInfo[dwChannel].Name);
  1454. -       case 1UL :                              //UHF
  1455. -           if (dwChannel>=UHFNumChannel)
  1456. -               return(NULL);
  1457. -           return((LPCTSTR)UHFChInfo[dwChannel].Name);
  1458. -       case 2UL :                              //CATV
  1459. -           if (dwChannel>=CATVNumChannel)
  1460. -               return(NULL);
  1461. -           return((LPCTSTR)CATVChInfo[dwChannel].Name);
  1462. -       case 3UL :                              //BS
  1463. -           if (dwChannel>=BSNumChannel)
  1464. -               return(NULL);
  1465. -           return((LPCTSTR)BSChInfo[dwChannel].Name);
  1466. -       case 4UL :                              //CS110
  1467. -           if (dwChannel>=CSNumChannel)
  1468. -               return(NULL);
  1469. -           return((LPCTSTR)CSChInfo[dwChannel].Name);
  1470. -       default  :
  1471. -           // 非対応のチューニング空間
  1472. +   if (is_invalid_space(dwSpace))
  1473.             return NULL;
  1474. -   }
  1475. +
  1476. +    DWORD start = m_SpaceAnchors[dwSpace] ;
  1477. +   DWORD end = dwSpace + 1 >= m_SpaceAnchors.size() ? (DWORD)m_Channels.size() : m_SpaceAnchors[dwSpace + 1];
  1478. +
  1479. +    if(dwChannel<end-start)
  1480. +      return m_Channels[start+dwChannel].Name.c_str() ;
  1481. +
  1482. +    return NULL ;
  1483.  }
  1484.  
  1485.  //*****    Set Channel *****
  1486.  
  1487.  const BOOL CBonTuner::SetChannel(const DWORD dwSpace, const DWORD dwChannel)
  1488.  {
  1489. -   switch(dwSpace)
  1490. -   {
  1491. -   case 0:                                         //VHF
  1492. -       if (dwChannel>=VHFNumChannel)
  1493. -           return(FALSE);
  1494. -       SetISDBTChannel(VHFChInfo[dwChannel].Channel);
  1495. -       break;
  1496. -   case 1:                                         //UHF
  1497. -       if (dwChannel>=UHFNumChannel)
  1498. -           return(FALSE);
  1499. -       SetISDBTChannel(UHFChInfo[dwChannel].Channel);
  1500. -       break;
  1501. -   case 2:                                         //CATV
  1502. -       if (dwChannel>=CATVNumChannel)
  1503. -           return(FALSE);
  1504. -       SetISDBTChannel(CATVChInfo[dwChannel].Channel);
  1505. -       break;
  1506. -   case 3:                                         //BS
  1507. -       if (dwChannel>=CATVNumChannel)
  1508. -           return(FALSE);
  1509. -       SetISDBSChannel(BSChInfo[dwChannel].Channel,BSChInfo[dwChannel].TSID);
  1510. -       break;
  1511. -   case 4:                                         //CS
  1512. -       if (dwChannel>=CATVNumChannel)
  1513. -           return(FALSE);
  1514. -       SetISDBSChannel(CSChInfo[dwChannel].Channel,CSChInfo[dwChannel].TSID);
  1515. -       break;
  1516. -   default:
  1517. -       return(FALSE);
  1518. -   }
  1519. +   if (is_invalid_space(dwSpace))
  1520. +       return NULL;
  1521. +
  1522. +    DWORD start = m_SpaceAnchors[dwSpace] ;
  1523. +   DWORD end = dwSpace + 1 >= m_SpaceAnchors.size() ? (DWORD)m_Channels.size() : m_SpaceAnchors[dwSpace + 1];
  1524. +
  1525. +    if(dwChannel<end-start) {
  1526. +      if( SetRealChannel(start+dwChannel) ){
  1527.     m_dwCurSpace = dwSpace;
  1528.     m_dwCurChannel = dwChannel;
  1529. -
  1530. -   return TRUE;
  1531. +        return TRUE ;
  1532. +      }
  1533. +    }
  1534. +    return FALSE ;
  1535.  }
  1536.  
  1537.  //*****    Get Current Space   *****
  1538. @@ -729,6 +860,20 @@
  1539.     return m_dwCurChannel;
  1540.  }
  1541.  
  1542. +//*****    Get Cur Real Channel    *****
  1543. +
  1544. +DWORD CBonTuner::GetCurRealChannel() const
  1545. +{
  1546. +  if(m_dwCurSpace>=m_SpaceAnchors.size())
  1547. +    return 0 ; // error
  1548. +  DWORD start = m_SpaceAnchors[m_dwCurSpace] ;
  1549. +  DWORD end = m_dwCurSpace + 1 >= m_SpaceAnchors.size() ? (DWORD)m_Channels.size() : m_SpaceAnchors[m_dwCurSpace + 1];
  1550. +  DWORD rch = start + m_dwCurChannel ;
  1551. +  if(rch>=end)
  1552. +    return 0 ; // error
  1553. +  return rch ;
  1554. +}
  1555. +
  1556.  //*****    Release *****
  1557.  
  1558.  void CBonTuner::Release()
  1559. @@ -741,13 +886,15 @@
  1560.  
  1561.  const bool CBonTuner::OnRecvFifoData(const DWORD dwThreadIndex, const BYTE *pData, const DWORD dwLen, CUsbFx2Driver *pDriver)
  1562.  {
  1563. -   CBlockLock Lock(&m_CriticalLock);
  1564. -
  1565. +    if (dwThreadIndex == m_dwFifoThreadIndex) {
  1566. +        //有効なチャンネルが選択されている時に限って
  1567. +        if(is_channel_valid){
  1568.     // FIFOバッファにプッシュ
  1569.     PushFifoBuff(pData,dwLen);
  1570. -  
  1571. +        }
  1572.     // イベントセット
  1573.     ::SetEvent(m_hOnStreamEvent);
  1574. +    }
  1575.  
  1576.     return(true);
  1577.  }
  1578. @@ -756,17 +903,16 @@
  1579.  
  1580.  void CBonTuner::AllocFifoBuff(void)
  1581.  {
  1582. -   // FIFOバッファをパージする
  1583. -   PurgeTsStream();
  1584. +   // FIFOバッファを空にする
  1585. +   FreeFifoBuff();
  1586.  
  1587.     // バッファプールを確保する
  1588. -   m_BufferPool.resize(ASYNCBUFFSIZE);
  1589. +    m_BufferPool.resize(max(ASYNCTSQUEUENUM,ASYNCTSQUEUEMAX));
  1590.  
  1591. -   for(DWORD dwPos = 0UL ; dwPos < ASYNCBUFFSIZE ; dwPos++){
  1592. +    for(DWORD dwPos = 0UL ; dwPos < ASYNCTSQUEUENUM ; dwPos++){
  1593.         m_BufferPool[dwPos].resize(TSDATASIZE);
  1594. +        m_EmptyFifoIndices.push(dwPos) ;
  1595.         }
  1596. -      
  1597. -   m_dwEmptyFifoPos = 0UL;
  1598.  }
  1599.  
  1600.  //*****    Free Fifo Buffer    *****
  1601. @@ -777,175 +923,347 @@
  1602.     PurgeTsStream();
  1603.  
  1604.     // バッファプールを開放する
  1605. -   m_BufferPool.clear();
  1606. +   while(!m_FifoIndices.empty()) {
  1607. +        m_FifoIndices.pop() ;
  1608. +    }
  1609. +
  1610. +   while(!m_EmptyFifoIndices.empty()) {
  1611. +        m_EmptyFifoIndices.pop() ;
  1612. +    }
  1613.  }
  1614.  
  1615.  //*****    Push Fifo Buffer    *****
  1616.  
  1617. -void CBonTuner::PushFifoBuff(const BYTE *pData,DWORD len)
  1618. +void CBonTuner::PushFifoBuff(const BYTE *pData, DWORD dwLen)
  1619.  {
  1620. -   // バッファプールの最大数を超える場合は最後尾を切り捨てる
  1621. -   while(m_FifoBuffer.size() >= ASYNCBUFFSIZE)
  1622. -   {
  1623. -       m_FifoBuffer.pop();
  1624. +  //CBlockLock Lock(&m_CriticalLock);
  1625. +
  1626. +  if (!dwLen)
  1627. +    return ;
  1628. +
  1629. +  m_CriticalLock.Lock() ;
  1630. +
  1631. +  size_t index ;
  1632. +  if(m_EmptyFifoIndices.empty()) {
  1633. +    // 空きがない rotate (データは破壊されドロップが確実に発生する)
  1634. +    index = m_FifoIndices.front() ;
  1635. +    m_FifoIndices.pop();
  1636. +  }else {
  1637. +    // 空き位置取得
  1638. +    index = m_EmptyFifoIndices.front() ;
  1639. +    m_EmptyFifoIndices.pop() ;
  1640. +  }
  1641. +
  1642. +  m_CriticalLock.Unlock() ;
  1643. +
  1644. +  // The number of empty indices is under the limit, or not.
  1645. +  if (m_EmptyFifoIndices.size()<ASYNCTSEMPTYBORDER) {
  1646. +    // Allocation ordering...
  1647. +    ::SetEvent(m_evAllocFifo) ;
  1648.     }
  1649.  
  1650. -   // バッファプールにデータコピー
  1651. -   BYTE *pWritePointer = &m_BufferPool[m_dwEmptyFifoPos][0];
  1652. -   ::CopyMemory(pWritePointer, pData, len/*TSDATASIZE*/);
  1653. +  // リサイズとデータ書き(No lock)
  1654. +  m_BufferPool[index].resize(dwLen) ;
  1655. +  BYTE *pWritePointer = static_cast<BYTE*>(m_BufferPool[index].top()) ;
  1656. +  CopyMemory(pWritePointer, pData, dwLen );
  1657. +
  1658.  
  1659.     // FIFOバッファにプッシュ
  1660. -   m_FifoBuffer.push(pWritePointer);
  1661. +  m_CriticalLock.Lock() ;
  1662. +  m_FifoIndices.push(index);
  1663. +  m_CriticalLock.Unlock() ;
  1664. +}
  1665. +
  1666. +
  1667. +//*****    Alloc Fifo Thread   *****
  1668. +
  1669. +void CBonTuner::AllocFifoThread (PVOID pv)
  1670. +{
  1671. +    register CBonTuner *_this = static_cast<CBonTuner*>(pv) ;
  1672. +    for(;;) {
  1673. +      DWORD dwRet = ::WaitForSingleObject(_this->m_evAllocFifo,TSTHREADWAIT) ;
  1674. +      if(dwRet==WAIT_FAILED) break ;
  1675. +      else if(dwRet == WAIT_OBJECT_0) { // Allocation ordered
  1676. +        _this->m_CriticalLock.Lock() ;
  1677. +        size_t nEmpty = _this->m_EmptyFifoIndices.size() ;
  1678. +        size_t nFifo = _this->m_FifoIndices.size() ;
  1679. +       _this->m_CriticalLock.Unlock();
  1680. +        // total : nFifo + nEmpty
  1681. +        while(nFifo+nEmpty<ASYNCTSQUEUEMAX&&nEmpty<ASYNCTSEMPTYBORDER) {
  1682. +          _this->m_BufferPool[nFifo+nEmpty].resize(TSDATASIZE) ; // Allocating...
  1683. +         _this->m_CriticalLock.Lock();
  1684. +          _this->m_EmptyFifoIndices.push(nFifo+nEmpty) ;
  1685. +          nEmpty = _this->m_EmptyFifoIndices.size() ;
  1686. +          nFifo = _this->m_FifoIndices.size() ;
  1687. +         _this->m_CriticalLock.Unlock();
  1688. +         if (!_this->fOpened) break;
  1689. +        }
  1690. +      }
  1691. +     if (!_this->fOpened) break;
  1692. +    }
  1693. +}
  1694. +
  1695. +
  1696. +//***** Init Tuner Property *****
  1697. +
  1698. +void CBonTuner::InitTunerProperty()
  1699. +{
  1700. +    //自分の名前を取得
  1701. +    char szMyPath[_MAX_PATH] ;
  1702. +    GetModuleFileNameA( m_hModule, szMyPath, _MAX_PATH ) ;
  1703. +    char szMyDrive[_MAX_FNAME] ;
  1704. +    char szMyDir[_MAX_FNAME] ;
  1705. +    char szMyName[_MAX_FNAME] ;
  1706. +    _splitpath_s( szMyPath, szMyDrive, _MAX_FNAME,szMyDir, _MAX_FNAME, szMyName, _MAX_FNAME, NULL, 0 ) ;
  1707. +    _strupr_s( szMyName, sizeof(szMyName) ) ;
  1708. +
  1709. +    // Fx2 の ID を決定
  1710. +    int nFx2Id=0 ;
  1711. +    sscanf_s( szMyName, "BONDRIVER_BULLDOG_%1d", &nFx2Id ) ;
  1712. +    m_yFx2Id = BYTE(nFx2Id) ;
  1713. +
  1714. +    //チューナー名を決定
  1715. +    _stprintf_s( m_szTunerName, 100, TEXT("%s(ID=%d)"), TEXT("ブルドッグ"), nFx2Id ) ;
  1716. +
  1717. +    // Ini ファイルをロード
  1718. +    m_InvisibleSpaces.clear() ;
  1719. +    m_InvalidSpaces.clear() ;
  1720. +   m_SpaceArrangement.clear() ;
  1721. +    LoadIniFile(string(szMyDrive)+string(szMyDir)+"BonDriver_Bulldog.ini") ;
  1722. +    LoadIniFile(string(szMyDrive)+string(szMyDir)+string(szMyName)+".ini") ;
  1723. +
  1724. +    // Channel ファイルをロード
  1725. +    if(!LoadChannelFile(string(szMyDrive)+string(szMyDir)+string(szMyName)+".ch.txt")) {
  1726. +       if(!LoadChannelFile(string(szMyDrive)+string(szMyDir)+"BonDriver_Bulldog.ch.txt"))
  1727. +         InitChannelToDefault() ;
  1728. +   }
  1729. +
  1730. +    // チャンネル情報再構築
  1731. +    RebuildChannels() ;
  1732. +}
  1733. +
  1734. +//*****    Laod Ini File *****
  1735. +
  1736. +bool    CBonTuner::LoadIniFile(std::string strIniFileName)
  1737. +{
  1738. +  if(GetFileAttributesA(strIniFileName.c_str())==-1) return false ;
  1739. +  const DWORD BUFFER_SIZE = 1024;
  1740. +  char buffer[BUFFER_SIZE];
  1741. +  ZeroMemory(buffer, BUFFER_SIZE);
  1742. +  const char *Section = "BonTuner";
  1743. +  #define LOADINT(key) do { \
  1744. +      key = GetPrivateProfileIntA(Section,#key, \
  1745. +        key,strIniFileName.c_str()) ; \
  1746. +    }while(0)
  1747. +  #define LOADSTR2(val,key) do { \
  1748. +      GetPrivateProfileStringA(Section,key,val.c_str(), \
  1749. +        buffer,BUFFER_SIZE,strIniFileName.c_str()) ; \
  1750. +      val = buffer ; \
  1751. +    }while(0)
  1752. +  #define LOADSTR(val) LOADSTR2(val,#val)
  1753. +  #define LOADWSTR(val) do { \
  1754. +      string temp = wcs2mbcs(val) ; \
  1755. +      LOADSTR2(temp,#val) ; val = mbcs2wcs(temp) ; \
  1756. +    }while(0)
  1757. +  LOADINT(TSDATASIZE) ;
  1758. +  LOADINT(TSQUEUENUM) ;
  1759. +  LOADINT(TSTHREADWAIT) ;
  1760. +  LOADINT(TSTHREADPRIORITY) ;
  1761. +  LOADINT(TSDUALTHREADING) ;
  1762. +  LOADINT(ASYNCTSQUEUENUM) ;
  1763. +  LOADINT(ASYNCTSQUEUEMAX) ;
  1764. +  LOADINT(ASYNCTSEMPTYBORDER) ;
  1765. +  LOADINT(ISDBTCOMMANDSENDTIMES) ;
  1766. +  LOADINT(ISDBTCOMMANDSENDWAIT) ;
  1767. +  LOADINT(ISDBSCOMMANDSENDTIMES) ;
  1768. +  LOADINT(ISDBSCOMMANDSENDWAIT) ;
  1769. +  wstring InvisibleSpaces ;
  1770. +  LOADWSTR(InvisibleSpaces) ;
  1771. +  split(m_InvisibleSpaces,InvisibleSpaces,L',') ;
  1772. +  vector<wstring> vInvalidSpaces ;
  1773. +  wstring InvalidSpaces ;
  1774. +  LOADWSTR(InvalidSpaces) ;
  1775. +  split(vInvalidSpaces,InvalidSpaces,L',') ;
  1776. +  if(!vInvalidSpaces.empty()) {
  1777. +    copy(vInvalidSpaces.begin(),vInvalidSpaces.end(),
  1778. +      inserter(m_InvalidSpaces,m_InvalidSpaces.begin())) ;
  1779. +  }
  1780. +  wstring SpaceArrangement ;
  1781. +  LOADWSTR(SpaceArrangement) ;
  1782. +  split(m_SpaceArrangement,SpaceArrangement,L',') ;
  1783. +  #undef LOADINT
  1784. +  #undef LOADSTR2
  1785. +  #undef LOADSTR
  1786. +  #undef LOADWSTR
  1787. +  return true ;
  1788. +}
  1789. +
  1790. +//*****    Load Channel File *****
  1791. +
  1792. +bool   CBonTuner::LoadChannelFile(std::string strChannelFileName)
  1793. +{
  1794. +    FILE *st=NULL ;
  1795. +    fopen_s(&st,strChannelFileName.c_str(),"rt") ;
  1796. +    if(!st) return false;
  1797. +    char s[512] ;
  1798. +
  1799. +    m_Channels.clear() ;
  1800. +    while(!feof(st)) {
  1801. +      s[0]='\0' ;
  1802. +      fgets(s,512,st) ;
  1803. +      string strLine = trim(string(s)) ;
  1804. +      wstring wstrLine = mbcs2wcs(strLine) ;
  1805. +      AddChannel(wstrLine) ;
  1806. +      //DBGOUT("%s",s) ;
  1807. +   }
  1808. +
  1809. +    fclose(st) ;
  1810. +
  1811. +    return true ;
  1812.  
  1813. -   // バッファプール位置更新
  1814. -   if(++m_dwEmptyFifoPos >= ASYNCBUFFSIZE)m_dwEmptyFifoPos = 0UL;
  1815.  }
  1816.  
  1817. -//*****    Load Ini File   *****
  1818. +//*****    Init Channel To Default *****
  1819.  
  1820. -void   CBonTuner::LoadIni(void)
  1821. +void    CBonTuner::InitChannelToDefault()
  1822.  {
  1823. -   _TCHAR  IniName[256];
  1824.     _TCHAR  bf[256];
  1825. -   _TCHAR  key[32];
  1826. -   _TCHAR  *p;
  1827. -   int     i;
  1828.  
  1829. -   memset(VHFChInfo,0x00,sizeof(TChannelInfo)*VHFMAXCHANNELS);
  1830. -   memset(UHFChInfo,0x00,sizeof(TChannelInfo)*UHFMAXCHANNELS);
  1831. -   memset(CATVChInfo,0x00,sizeof(TChannelInfo)*CATVMAXCHANNELS);
  1832. -   memset(BSChInfo,0x00,sizeof(TChannelInfo)*BSMAXCHANNELS);
  1833. -   memset(CSChInfo,0x00,sizeof(TChannelInfo)*CSMAXCHANNELS);
  1834. -   VHFNumChannel=0;
  1835. -   UHFNumChannel=0;
  1836. -   CATVNumChannel=0;
  1837. -   BSNumChannel=0;
  1838. -   CSNumChannel=0;
  1839. -
  1840. -   GetModuleFileName(NULL, IniName, MAX_PATH);
  1841. -   p=_tcsrchr(IniName, _T('\\'));
  1842. -   if (p)
  1843. -       *p=0;
  1844. -   _tcscat(IniName,_T("\\BonDriver_Bulldog.ini"));
  1845. +    m_Channels.clear() ;
  1846.  
  1847. -   if (GetFileAttributes(IniName)==-1)
  1848. +    for(int i=1;   i<=12;  i++)
  1849.     {
  1850. -       for(i=1;    i<=12;  i++)
  1851. -       {
  1852. -           _stprintf(bf,_T("0,%d,0x0000,%d"),i,i);
  1853. -           GetChannelInfo(bf,&VHFChInfo[i-1]);
  1854. +        _stprintf(bf,_T("VHF,0,%d,0x0000,%dch"),i,i);
  1855. +        AddChannel(bf);
  1856.         }
  1857. -       VHFNumChannel=i-1;
  1858. -       for(i=13;   i<=62;  i++)
  1859. -       {
  1860. -           _stprintf(bf,_T("0,%d,0x0000,%d"),i,i);
  1861. -           GetChannelInfo(bf,&UHFChInfo[i-13]);
  1862. -       }
  1863. -       UHFNumChannel=i-13;
  1864. -       for(i=13;   i<=63;  i++)
  1865. +
  1866. +    for(int i=13;  i<=62;  i++)
  1867.         {
  1868. -           _stprintf(bf,_T("0,%d,0x0000,C%d"),i+100,i);
  1869. -           GetChannelInfo(bf,&CATVChInfo[i-13]);
  1870. +        _stprintf(bf,_T("UHF,0,%d,0x0000,%dch"),i,i);
  1871. +        AddChannel(bf);
  1872.         }
  1873. -       CATVNumChannel=i-13;
  1874. -       for(i=0;    DefBSChInfo[i] != NULL; i++)
  1875. +
  1876. +    for(int i=13;  i<=63;  i++)
  1877.         {
  1878. -           GetChannelInfo(DefBSChInfo[i],&BSChInfo[i]);
  1879. +        _stprintf(bf,_T("CATV,0,%d,0x0000,C%dch"),i+100,i);
  1880. +        AddChannel(bf);
  1881.         }
  1882. -       BSNumChannel=i;
  1883. -       for(i=0;    DefCSChInfo[i] != NULL; i++)
  1884. +
  1885. +    for(int i=0;   DefBSChInfo[i] != NULL; i++)
  1886.         {
  1887. -           GetChannelInfo(DefCSChInfo[i],&CSChInfo[i]);
  1888. +        _stprintf(bf,_T("BS,%s"),DefBSChInfo[i]);
  1889. +        AddChannel(bf);
  1890.         }
  1891. -       CSNumChannel=i;
  1892.  
  1893. -       return;
  1894. +    for(int i=0;   DefCSChInfo[i] != NULL; i++)
  1895. +    {
  1896. +        _stprintf(bf,_T("CS110,%s"),DefCSChInfo[i]);
  1897. +        AddChannel(bf);
  1898.     }
  1899.  
  1900. -//Channel=ServiceID,PhysicalChannel,TSID,Name
  1901. +}
  1902.  
  1903. -   for(i=0;    i<VHFMAXCHANNELS;   i++)
  1904. -   {
  1905. -       _stprintf(key,_T("%d"),i);
  1906. -       GetPrivateProfileString(_T("VHF"),key,_T(""),bf,256,IniName);
  1907. -       if (bf[0]==0)
  1908. -           break;
  1909. +//*****    Add Channel *****
  1910.  
  1911. -       GetChannelInfo(bf,&VHFChInfo[i]);
  1912. +bool CBonTuner::AddChannel(std::wstring wstrLine)
  1913. +{
  1914. +    int t=0 ;
  1915. +    wstring params[5] ;
  1916. +    params[0] = params[1] = params[2] = params[3] = params[4] = L"" ;
  1917. +    for(int i=0;i<wstrLine.length();i++) {
  1918. +      if(wstrLine[i]==L';') break ;
  1919. +      else if(wstrLine[i]==L',') {
  1920. +        t++ ; if(t==5) break ;
  1921. +      }else params[t] += wstrLine[i] ;
  1922.     }
  1923. -   VHFNumChannel=i;
  1924. -
  1925. -   for(i=0;    i<UHFMAXCHANNELS;   i++)
  1926. -   {
  1927. -       _stprintf(key,_T("%d"),i);
  1928. -       GetPrivateProfileString(_T("UHF"),key,_T(""),bf,256,IniName);
  1929. -       if (bf[0]==0)
  1930. -           break;
  1931. -
  1932. -       GetChannelInfo(bf,&UHFChInfo[i]);
  1933. +    if(t>=4) {
  1934. +      for(int i=0;i<5;i++) params[i] = trim(params[i]) ;
  1935. +      int ServiceID = 0 ;
  1936. +      int Channel = 0 ;
  1937. +      float MegaHz = 0.f ;
  1938. +      int TSID = 0 ;
  1939. +      swscanf(params[1].c_str(),L"%i",&ServiceID) ;
  1940. +      if( params[2].length()>3&&
  1941. +          params[2].substr(params[2].length()-3)==L"MHz" ) {
  1942. +        swscanf(params[2].c_str(),L"%fMHz",&MegaHz) ;
  1943. +      }else {
  1944. +        swscanf(params[2].c_str(),L"%i",&Channel) ;
  1945.     }
  1946. -   UHFNumChannel=i;
  1947. -
  1948. -   for(i=0;    i<CATVMAXCHANNELS;  i++)
  1949. -   {
  1950. -       _stprintf(key,_T("%d"),i);
  1951. -       GetPrivateProfileString(_T("CATV"),key,_T(""),bf,256,IniName);
  1952. -       if (bf[0]==0)
  1953. -           break;
  1954. -
  1955. -       GetChannelInfo(bf,&CATVChInfo[i]);
  1956. +      swscanf(params[3].c_str(),L"%i",&TSID) ;
  1957. +      m_Channels.push_back(
  1958. +        CHANNEL(params[0],ServiceID,Channel,TSID,params[4],MegaHz)) ;
  1959. +      return true ;
  1960.     }
  1961. -   CATVNumChannel=i;
  1962. +    return false ;
  1963. +}
  1964.  
  1965. -   for(i=0;    i<BSMAXCHANNELS;    i++)
  1966. -   {
  1967. -       _stprintf(key,_T("%d"),i);
  1968. -       GetPrivateProfileString(_T("BS"),key,_T(""),bf,256,IniName);
  1969. -       if (bf[0]==0)
  1970. -           break;
  1971. +//*****    Rebuild Channels    *****
  1972.  
  1973. -       GetChannelInfo(bf,&BSChInfo[i]);
  1974. +void CBonTuner::RebuildChannels()
  1975. +{
  1976. +  // チャンネル並べ替え
  1977. +  struct space_finder : public std::unary_function<CHANNEL, bool> {
  1978. +    std::wstring space ;
  1979. +    space_finder(std::wstring _space) {
  1980. +      space = _space ;
  1981.     }
  1982. -   BSNumChannel=i;
  1983. -
  1984. -   for(i=0;    i<CSMAXCHANNELS;    i++)
  1985. -   {
  1986. -       _stprintf(key,_T("%d"),i);
  1987. -       GetPrivateProfileString(_T("CS110"),key,_T(""),bf,256,IniName);
  1988. -       if (bf[0]==0)
  1989. -           break;
  1990. -
  1991. -       GetChannelInfo(bf,&CSChInfo[i]);
  1992. +    bool operator ()(const CHANNEL &ch) const {
  1993. +      return space == ch.Space;
  1994. +    }
  1995. +  };
  1996. +  if (!m_InvisibleSpaces.empty() || !m_SpaceArrangement.empty()) {
  1997. +    CHANNELS newChannels ;
  1998. +    //CHANNELS oldChannels(m_Channels) ;
  1999. +    CHANNELS &oldChannels = m_Channels ;
  2000. +    CHANNELS::iterator beg = oldChannels.begin() ;
  2001. +    CHANNELS::iterator end = oldChannels.end() ;
  2002. +    for (CHANNELS::size_type i = 0; i < m_InvisibleSpaces.size(); i++) {
  2003. +      end = remove_if(beg, end, space_finder(m_InvisibleSpaces[i]));
  2004. +    }
  2005. +    for (CHANNELS::size_type i = 0; i < m_SpaceArrangement.size(); i++) {
  2006. +      space_finder finder(m_SpaceArrangement[i]) ;
  2007. +      remove_copy_if(beg, end, back_inserter(newChannels), not1(finder)) ;
  2008. +      end = remove_if(beg, end, finder) ;
  2009. +    }
  2010. +    copy(beg, end, back_inserter(newChannels)) ;
  2011. +    m_Channels.swap(newChannels) ;
  2012. +  }
  2013. +  // チャンネルアンカー構築
  2014. +  m_SpaceAnchors.clear() ;
  2015. +  m_ChannelAnchors.clear() ;
  2016. +  wstring space = L"" ;
  2017. +  for (CHANNELS::size_type i = 0;i < m_Channels.size();i++) {
  2018. +    if (m_Channels[i].Space != space) {
  2019. +      space = m_Channels[i].Space ;
  2020. +      m_SpaceAnchors.push_back(DWORD(i)) ;
  2021. +    }
  2022. +    if (m_InvalidSpaces.find(space) == m_InvalidSpaces.end())
  2023. +      m_ChannelAnchors.push_back(DWORD(i)) ;
  2024.     }
  2025. -   CSNumChannel=i;
  2026.  }
  2027.  
  2028. -//*****    Get Channel Info    *****
  2029. -
  2030. -//Channel=ServiceID,PhysicalChannel,TSID,Name
  2031. -
  2032. -void   CBonTuner::GetChannelInfo(_TCHAR *bf,TChannelInfo *ChInfo)
  2033. +// 通しチャンネル番号から空間番号取得
  2034. +DWORD CBonTuner::space_index_of(DWORD sch) const
  2035.  {
  2036. -   _TCHAR  *p,*q;
  2037. +  for(size_t i=m_SpaceAnchors.size();i>0;i--)
  2038. +    if(m_SpaceAnchors[i-1]<sch)
  2039. +      return DWORD(i-1) ;
  2040. +  return 0 ;
  2041. +}
  2042.  
  2043. -   memset(ChInfo,0x00,sizeof(TChannelInfo));
  2044. +// 通しチャンネル番号から空間チャンネル番号取得
  2045. +DWORD CBonTuner::channel_index_of(DWORD sch) const
  2046. +{
  2047. +  if(sch>=m_ChannelAnchors.size()) return 0 ;
  2048. +  return m_ChannelAnchors[sch] - m_SpaceAnchors[space_index_of(sch)] ;
  2049. +}
  2050.  
  2051. -   ChInfo->ServiceID=_tcstol(bf,&q,10);
  2052. -   if ((q) && (*q==_T(',')))
  2053. -   {
  2054. -       p=q+1;
  2055. -       ChInfo->Channel=_tcstol(p,&q,10);
  2056. -       if ((q) && (*q==_T(',')))
  2057. -       {
  2058. -           p=q+1;
  2059. -           ChInfo->TSID=_tcstol(p,&q,16);
  2060. -           if ((q) && (*q==_T(',')))
  2061. -           {
  2062. -               p=q+1;
  2063. -               _tcsncpy(ChInfo->Name,p,256);
  2064. -           }
  2065. -       }
  2066. -   }
  2067. +// 有効でない空間番号かどうか
  2068. +BOOL CBonTuner::is_invalid_space(DWORD spc) const
  2069. +{
  2070. +  if(spc>=m_SpaceAnchors.size()) return TRUE ;
  2071. +  std::wstring space_name = m_Channels[m_SpaceAnchors[spc]].Space ;
  2072. +  return m_InvalidSpaces.find(space_name)==m_InvalidSpaces.end() ? FALSE:TRUE ;
  2073.  }
  2074.  
  2075.  //*****    I2C Write   *****
  2076. @@ -981,7 +1299,7 @@
  2077.  {
  2078.     BYTE    cmd[64];
  2079.     DWORD   cmd_len=0;
  2080. -   int     i;
  2081. +   //int       i;
  2082.  
  2083.     cmd[cmd_len++]=CMD_I2C_READ;
  2084.     cmd[cmd_len++]=adrs;
  2085. @@ -1004,7 +1322,7 @@
  2086.  {
  2087.     BYTE    cmd[64];
  2088.     DWORD   cmd_len=0;
  2089. -   int     i;
  2090. +   //int       i;
  2091.  
  2092.     cmd[cmd_len++]=CMD_I2C_WRITE;
  2093.     cmd[cmd_len++]=adrs;
  2094. @@ -1032,7 +1350,7 @@
  2095.  {
  2096.     BYTE    cmd[64];
  2097.     DWORD   cmd_len=0;
  2098. -   int     i;
  2099. +   //int       i;
  2100.  
  2101.     cmd[cmd_len++]=CMD_I2C_WRITE;
  2102.     cmd[cmd_len++]=adrs;
  2103. diff -uPrb Org/BonTuner.h Mod/BonTuner.h
  2104. --- Org/BonTuner.h  2012-02-22 16:36:04.000000000 +0900
  2105. +++ Mod/BonTuner.h  2014-12-09 21:52:05.000000000 +0900
  2106. @@ -10,29 +10,94 @@
  2107.  #include "UsbFx2Driver.h"
  2108.  #include <vector>
  2109.  #include <queue>
  2110. -
  2111. -using std::vector;
  2112. -using std::queue;
  2113. -
  2114. -#define    VHFMAXCHANNELS  12
  2115. -#define    UHFMAXCHANNELS  50
  2116. -#define    CATVMAXCHANNELS 51
  2117. -#define    BSMAXCHANNELS   64
  2118. -#define    CSMAXCHANNELS   256
  2119. -
  2120. -
  2121. -typedef    struct {
  2122. -   WORD    ServiceID;
  2123. -   int     Channel;
  2124. -   WORD    TSID;
  2125. -   _TCHAR  Name[256];
  2126. -}  TChannelInfo;
  2127. +#include <string>
  2128. +#include <set>
  2129.  
  2130.  typedef enum   CLockStatus {stLock, stLostLock, stNoSignal, stUnknown };
  2131.  
  2132.  class CBonTuner :  public IBonDriver2,
  2133.             protected IUsbFx2DriverHost
  2134.  {
  2135. +private:
  2136. +    // CHANNEL/CHANNELS
  2137. +    struct CHANNEL {
  2138. +        std::wstring Space ;
  2139. +        WORD       ServiceID;
  2140. +        int            Channel;
  2141. +        float       MegaHz ;
  2142. +        WORD       TSID;
  2143. +        std::wstring   Name ;
  2144. +        bool isISDBT() { return TSID==0 ; }
  2145. +        bool isISDBS() { return !isISDBT() ; }
  2146. +        bool isChannelTuning() { return Channel!=0 ; }
  2147. +        bool isMegaHzTuning() { return !isChannelTuning() ; }
  2148. +        CHANNEL(std::wstring _Space, WORD _ServiceID,int _Channel,WORD _TSID,
  2149. +          std::wstring _Name, float _MegaHz=0.f) {
  2150. +            Space = _Space ;
  2151. +            ServiceID = _ServiceID ;
  2152. +            Channel = _Channel ;
  2153. +            TSID = _TSID ;
  2154. +            Name = _Name ;
  2155. +            MegaHz = _MegaHz ;
  2156. +        }
  2157. +        CHANNEL(const CHANNEL &_Src) {
  2158. +            Space = _Src.Space ;
  2159. +            ServiceID = _Src.ServiceID ;
  2160. +            Channel = _Src.Channel ;
  2161. +            TSID = _Src.TSID ;
  2162. +            Name = _Src.Name ;
  2163. +            MegaHz = _Src.MegaHz ;
  2164. +        }
  2165. +    } ;
  2166. +    typedef std::vector<CHANNEL> CHANNELS ;
  2167. +    // BUFFER/BUFFERPOOL
  2168. +    struct BUFFER {
  2169. +        BUFFER() : _buffer(NULL), _size(0UL) {}
  2170. +        BUFFER(const BUFFER &src )
  2171. +         : _buffer(NULL), _size(0UL) {
  2172. +          *this = src ;
  2173. +        }
  2174. +        BUFFER(const void *buffer, size_t size)
  2175. +         : _buffer(NULL), _size(0UL) {
  2176. +          resize(size) ;
  2177. +          if(_buffer&&_size==size)
  2178. +            CopyMemory(_buffer,buffer,size) ;
  2179. +        }
  2180. +        ~BUFFER() {
  2181. +          if(_buffer) std::free(_buffer) ;
  2182. +        }
  2183. +        BUFFER &operator =(const BUFFER &src) {
  2184. +          resize(src._size) ;
  2185. +          if(_buffer&&_size==src._size)
  2186. +            CopyMemory(_buffer,src._buffer,src._size) ;
  2187. +          return *this ;
  2188. +        }
  2189. +        void resize(size_t size) {
  2190. +          if(_size!=size) {
  2191. +            if(!size) {
  2192. +              if(_buffer) {
  2193. +                free(_buffer) ;
  2194. +                _buffer=NULL ;
  2195. +              }
  2196. +            }else {
  2197. +              if(_buffer) {
  2198. +                if(size>_size)
  2199. +                  _buffer = std::realloc(_buffer,size) ;
  2200. +              }else {
  2201. +                _buffer = std::malloc(size) ;
  2202. +              }
  2203. +            }
  2204. +            if(_buffer) _size = size ;
  2205. +            else _size = 0UL ;
  2206. +          }
  2207. +        }
  2208. +        void *top() const { return _buffer ; }
  2209. +        size_t size() const { return _size ; }
  2210. +    private:
  2211. +        void *_buffer ;
  2212. +        size_t _size ;
  2213. +    };
  2214. +    typedef std::vector<BUFFER> BUFFERPOOL ;
  2215.  public:
  2216.     CBonTuner();
  2217.     virtual ~CBonTuner();
  2218. @@ -42,8 +107,8 @@
  2219.     int I2CRead(unsigned char adrs,unsigned char reg,int len,unsigned char *data);
  2220.     int I2CRead(unsigned char adrs,unsigned tadrs,unsigned char reg,int len,unsigned char *data);
  2221.     void    SetTSID(int tsid);
  2222. -   void    SetISDBTChannel(int ch);
  2223. -   void    SetISDBSChannel(int ch,int tsid);
  2224. +   void    SetISDBTChannel(int ch,float MegaHz=0.f);
  2225. +   void    SetISDBSChannel(int ch,int tsid,float MegaHz=0.f);
  2226.     CLockStatus IsLockISDBT(void);
  2227.     CLockStatus IsLockISDBS(void);
  2228.     CLockStatus IsLock(void);
  2229. @@ -88,34 +153,52 @@
  2230.     void AllocFifoBuff(void);
  2231.     void FreeFifoBuff(void);
  2232.  
  2233. -   inline void PushFifoBuff(const BYTE *pData,DWORD len);
  2234. +   inline void PushFifoBuff(const BYTE *pData,DWORD dwLen);
  2235.  
  2236. -   void    LoadIni(void);
  2237. -   void    GetChannelInfo(_TCHAR *bf,TChannelInfo *ChInfo);
  2238. +    void   InitTunerProperty() ;
  2239. +   bool    LoadIniFile(std::string strIniFileName);
  2240. +   bool    LoadChannelFile(std::string strChannelFileName);
  2241. +   void    InitChannelToDefault() ;
  2242. +   bool    AddChannel(std::wstring wstrLine) ;
  2243. +    const BOOL SetRealChannel(const DWORD dwCh) ;
  2244. +    void    ResetFxFifo() ;
  2245.  
  2246.     CUsbFx2Driver   *m_pUsbFx2Driver;
  2247.     CCriticalLock   m_CriticalLock;
  2248.     HANDLE          m_hOnStreamEvent;
  2249.  
  2250. -   queue<BYTE *>   m_FifoBuffer;
  2251. -   vector<vector<BYTE>>    m_BufferPool;
  2252. -   DWORD           m_dwEmptyFifoPos;
  2253. +    BUFFERPOOL m_BufferPool ;
  2254. +    std::queue< size_t > m_FifoIndices;
  2255. +    std::queue< size_t > m_EmptyFifoIndices;
  2256. +    DWORD          m_dwFifoThreadIndex;
  2257. +
  2258. +    HANDLE m_thAllocFifo ;
  2259. +    HANDLE m_evAllocFifo ;
  2260. +    static void AllocFifoThread (PVOID pv) ;
  2261.    
  2262.     bool            fOpened;
  2263.     HANDLE          m_hMutex;
  2264.  
  2265. +    // チューナーのプロパティ
  2266. +    BYTE m_yFx2Id ;
  2267. +    TCHAR m_szTunerName[100] ;
  2268. +
  2269. +    // チャンネル情報
  2270. +    CHANNELS m_Channels ;
  2271. +    std::vector<DWORD> m_SpaceAnchors ;
  2272. +    std::vector<DWORD> m_ChannelAnchors ;
  2273. +    std::vector<std::wstring> m_InvisibleSpaces ;
  2274. +    std::set<std::wstring> m_InvalidSpaces ;
  2275. +    std::vector<std::wstring> m_SpaceArrangement ;
  2276. +    DWORD space_index_of(DWORD sch) const ;
  2277. +    DWORD channel_index_of(DWORD sch) const ;
  2278. +    BOOL is_invalid_space(DWORD spc) const ;
  2279. +    void RebuildChannels() ;
  2280. +
  2281.     DWORD           m_dwCurSpace;
  2282.     DWORD           m_dwCurChannel;
  2283. +   DWORD           GetCurRealChannel() const ;
  2284. +
  2285. +    BOOL is_channel_valid ;
  2286.  
  2287. -   TChannelInfo    VHFChInfo[VHFMAXCHANNELS];
  2288. -   TChannelInfo    UHFChInfo[UHFMAXCHANNELS];
  2289. -   TChannelInfo    CATVChInfo[CATVMAXCHANNELS];
  2290. -   TChannelInfo    BSChInfo[BSMAXCHANNELS];
  2291. -   TChannelInfo    CSChInfo[CSMAXCHANNELS];
  2292. -
  2293. -   int             VHFNumChannel;
  2294. -   int             UHFNumChannel;
  2295. -   int             CATVNumChannel;
  2296. -   int             BSNumChannel;
  2297. -   int             CSNumChannel;
  2298.  };
  2299. diff -uPrb Org/Cusb2/cusb2.cpp Mod/Cusb2/cusb2.cpp
  2300. --- Org/Cusb2/cusb2.cpp 2012-02-22 15:36:26.000000000 +0900
  2301. +++ Mod/Cusb2/cusb2.cpp 2014-12-05 20:31:35.000000000 +0900
  2302. @@ -65,6 +65,8 @@
  2303.             wchar_t wcs[64];
  2304.             size_t n;
  2305.             mbstowcs_s(&n, wcs, 64, (char *)string1, 64);
  2306. +           TRACE(L"fwload: Manufacturer=\"%s\", Compare=\"%s\"\r\n"
  2307. +             ,USBDevice->Manufacturer,wcs) ;
  2308.             if(wcscmp(USBDevice->Manufacturer, wcs) == 0)
  2309.                 return true;
  2310.         }
  2311. @@ -166,79 +168,160 @@
  2312.     return(ep->XferData(buf, len));
  2313.  }
  2314.  
  2315. -// Modified by 拡張ツール中の人
  2316. +
  2317. +// Modified by 拡張ツール中の人 ( Fixed by ◆PRY8EAlByw )
  2318.  void cusb2::thread_proc(cusb2_tcb *tcb)
  2319.  {
  2320.     u32 i;
  2321. -   u32 qnum=0;
  2322.     bool success = false;
  2323.     LONG len;
  2324.     CCyUSBEndPoint *ep;
  2325.  
  2326. +    tcb->idTh = ::GetCurrentThreadId() ;
  2327.  
  2328.     ep = tcb->ep;
  2329.     tcb->nsuccess = 0;
  2330.     tcb->nfailure = 0;
  2331. -   tcb->looping = true;
  2332. -   tcb->fTerminate=false;
  2333.  
  2334. +    tcb->fResetOrdered = false ;
  2335. +    tcb->evAbortOrdered = CreateEvent(NULL, false, false, NULL) ;
  2336. +    tcb->evResetCompleted = CreateEvent(NULL, false, false, NULL) ;
  2337. +    tcb->fTerminated = false ;
  2338. +    tcb->fDone = false ;
  2339. +    tcb->thTransfer = NULL ;
  2340. +
  2341. +   HANDLE *event = new HANDLE[tcb->ques+1];
  2342.     OVERLAPPED *ovlp = new OVERLAPPED[tcb->ques];
  2343.     PUCHAR *data = new PUCHAR[tcb->ques];
  2344.     PUCHAR *context = new PUCHAR[tcb->ques];
  2345.     ep->SetXferSize(tcb->xfer);
  2346. -   BOOL ret=SetThreadPriority(tcb->th, THREAD_PRIORITY_HIGHEST);
  2347. +   BOOL ret=SetThreadPriority(tcb->th, tcb->prior);
  2348. +
  2349. +    const DWORD WAIT_MSEC_LIMIT = tcb->wait ;
  2350.  
  2351. -   if(tcb->epaddr & 0x80)
  2352. +    DUAL_TRANSFER_CONTEXT *dtc = NULL ;
  2353. +
  2354. +    const bool incoming = (tcb->epaddr & 0x80) ? true : false ;
  2355. +    const bool dual = tcb->fDualTransfer && incoming ;
  2356. +
  2357. +    if(dual) {  // Setup the dual transfer threading context.
  2358. +      dtc = new DUAL_TRANSFER_CONTEXT ;
  2359. +      dtc->len = new s32[tcb->ques] ;
  2360. +      dtc->evDataAvailable = CreateEvent(NULL,false,false,NULL) ;
  2361. +      dtc->evTransferCompleted = CreateEvent(NULL,false,false,NULL) ;
  2362. +      dtc->ovlp = ovlp ;
  2363. +      dtc->data = data ;
  2364. +      dtc->context = context ;
  2365. +      dtc->idAborted = -1 ;
  2366. +      tcb->lpDualTransferContext = dtc ;
  2367. +      tcb->thTransfer = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)cusb2::data_transfer_thread_proc, tcb, CREATE_SUSPENDED, NULL) ;
  2368. +      SetThreadPriority(tcb->thTransfer,tcb->prior) ;
  2369. +    }
  2370. +
  2371. +   if(incoming)
  2372.     {   //IN(FX2->PC)転送
  2373.         for(i=0; i<tcb->ques; i++)
  2374.         {
  2375.             data[i] = new UCHAR[tcb->xfer];
  2376. -           ovlp[i].hEvent = CreateEvent(NULL, false, false, NULL);
  2377. +            if(dual) dtc->len[i] = -1 ; // Init all to no data available.
  2378. +           event[i] = CreateEvent(NULL, false, false, NULL) ;
  2379. +            ovlp[i].hEvent = event[i] ;
  2380.             context[i] = ep->BeginDataXfer(data[i], tcb->xfer, &(ovlp[i]));
  2381. -           qnum++;
  2382.         }
  2383. -       for(i=0;;)
  2384. -       {
  2385. -           if (tcb->fTerminate)
  2386. -               break;
  2387. -           if(!ep->WaitForXfer(&(ovlp[i]),500))
  2388. -           {
  2389. -               ep->Abort();
  2390. -               WaitForSingleObject(&(ovlp[i]),500);
  2391. +        event[tcb->ques] = tcb->evAbortOrdered ;
  2392. +       if(dual) {
  2393. +          // Start a data transfer threading process.
  2394. +          ::ResumeThread(tcb->thTransfer) ;
  2395. +        }
  2396. +        u32 next_wait_index = 0 ;
  2397. +        for(i=0;!tcb->fTerminated;)
  2398. +       {
  2399. +           if(dual) {
  2400. +              while(dtc->len[i]>=0) { // Wait for a data transfer completed event.
  2401. +                WaitForSingleObject(dtc->evTransferCompleted,WAIT_MSEC_LIMIT) ;
  2402. +                if(tcb->fResetOrdered) break ;
  2403. +                if(tcb->fTerminated) break ;
  2404. +              }
  2405. +              if(tcb->fTerminated) break ;
  2406. +            }
  2407. +
  2408. +            bool aborted = tcb->fResetOrdered ;
  2409. +            if(!aborted) {
  2410. +              #if 0
  2411. +              // 単にOVERLAPPEDのhEventを待機しているだけだと思われる…
  2412. +              aborted = !ep->WaitForXfer(&(ovlp[i]), WAIT_MSEC_LIMIT) ;
  2413. +              #else
  2414. +              if(i==next_wait_index) { // 待機完了しているものはスキップする
  2415. +                // ※ WaitForMultipleObjects で待てるハンドル数は最大64個まで
  2416. +                DWORD waitRes = WaitForMultipleObjects(tcb->ques+1,event,FALSE,WAIT_MSEC_LIMIT) ;
  2417. +                aborted = !(waitRes>=WAIT_OBJECT_0&&waitRes<WAIT_OBJECT_0+tcb->ques) ;
  2418. +                if(!aborted) {
  2419. +                  // 次期待機インデックス更新
  2420. +                  next_wait_index = waitRes-WAIT_OBJECT_0 + 1 ;
  2421. +                  if(next_wait_index>=tcb->ques) next_wait_index=0 ;
  2422. +                }
  2423. +              }
  2424. +              #endif
  2425. +            }
  2426. +            if(tcb->fTerminated) break ;
  2427. +
  2428. +            if (aborted)
  2429. +            {
  2430. +                if(dual) dtc->idAborted = i ;
  2431. +                else ep->Abort();
  2432. +                ::ResetEvent(tcb->evAbortOrdered) ;
  2433. +                tcb->fResetOrdered = false ;
  2434. +               //WaitForSingleObject(&(ovlp[i]),WAIT_MSEC_LIMIT);
  2435. +               len = 0;
  2436. +               success = false;
  2437. +                next_wait_index = i ;
  2438.             }
  2439. -
  2440. +           else {
  2441.             len = tcb->xfer;
  2442.             success = ep->FinishDataXfer(data[i], len, &(ovlp[i]), context[i]);
  2443. -           qnum--;
  2444. +           }
  2445.  
  2446. -           if(success)
  2447. -           {
  2448. -               if(tcb->looping)
  2449. -               {
  2450. -                   if(!tcb->cb_func(data[i], (u32)len))
  2451. +           if(success) {
  2452. +                if(dual) {
  2453. +                  dtc->len[i] = len ;
  2454. +                }else {
  2455. +                  if(!tcb->cb_func(data[i], (u32)len, tcb->idTh))
  2456.                     {
  2457. -                       tcb->looping = false;
  2458. +                    tcb->fTerminated = true;
  2459.                     }
  2460.                 }
  2461.                 tcb->nsuccess++;
  2462.             }
  2463.             else
  2464.             {
  2465. +               if(dual) {
  2466. +                  dtc->len[i] = 0 ;
  2467. +                }
  2468.                 tcb->nfailure++;
  2469.             }
  2470.  
  2471. -           if(tcb->looping)
  2472. -           {
  2473. -               context[i] = ep->BeginDataXfer(data[i], tcb->xfer, &(ovlp[i]));
  2474. -               qnum++;
  2475. +            if(dual) {
  2476. +               // Notify the transfer thread that one of new data is available.
  2477. +               SetEvent(dtc->evDataAvailable) ;
  2478.             }
  2479.  
  2480. +            if(!dual)
  2481. +              context[i] = ep->BeginDataXfer(data[i], tcb->xfer, &(ovlp[i]));
  2482. +
  2483. +            if(aborted) {
  2484. +              if(!dual) {
  2485. +                // Restart queueing all.
  2486. +                for(u32 j=0;j<tcb->ques-1;j++) {
  2487. +                  u32 t = (i+1+j)%tcb->ques ;
  2488. +                  ::ResetEvent(ovlp[t].hEvent) ;
  2489. +                  context[t] = tcb->ep->BeginDataXfer(data[t], tcb->xfer, &(ovlp[t]));
  2490. +                }
  2491. +                SetEvent(tcb->evResetCompleted) ;
  2492. +              }
  2493. +            }else {
  2494.             if(++i == tcb->ques) i = 0;
  2495. -           if(tcb->looping == false)
  2496. -           {
  2497. -               if(qnum == 0)
  2498. -                   break;
  2499.             }
  2500. +
  2501.         }
  2502.     }
  2503.     else
  2504. @@ -246,30 +329,24 @@
  2505.         for(i=0; i<tcb->ques; i++)
  2506.         {
  2507.             data[i] = new UCHAR[tcb->xfer];
  2508. -           ovlp[i].hEvent = CreateEvent(NULL, false, false, NULL);
  2509. -           if(tcb->looping)
  2510. +           event[i] = CreateEvent(NULL, false, false, NULL) ;
  2511. +           ovlp[i].hEvent = event[i] ;
  2512. +               if(!tcb->cb_func(data[i], (u32)tcb->xfer, tcb->idTh))
  2513.             {
  2514. -               if(!tcb->cb_func(data[i], (u32)tcb->xfer))
  2515. -               {
  2516. -                   tcb->looping = false;
  2517. -               }
  2518. +                   tcb->fTerminated = true;
  2519.             }
  2520.             context[i] = ep->BeginDataXfer(data[i], tcb->xfer, &(ovlp[i]));
  2521. -           qnum++;
  2522.         }
  2523. -       for(i=0;;)
  2524. +       for(i=0;!tcb->fTerminated;)
  2525.         {
  2526. -           if (tcb->fTerminate)
  2527. -               break;
  2528. -           if(!ep->WaitForXfer(&(ovlp[i]),500))
  2529. +           if(!ep->WaitForXfer(&(ovlp[i]),WAIT_MSEC_LIMIT))
  2530.             {
  2531.                 ep->Abort();
  2532. -               WaitForSingleObject(&(ovlp[i]),500);
  2533. +               //WaitForSingleObject(&(ovlp[i]),WAIT_MSEC_LIMIT);
  2534.             }
  2535.  
  2536.             len = tcb->xfer;
  2537.             success = ep->FinishDataXfer(data[i], len, &(ovlp[i]), context[i]);
  2538. -           qnum--;
  2539.  
  2540.             if(success)
  2541.             {
  2542. @@ -280,39 +357,98 @@
  2543.                 tcb->nfailure++;
  2544.             }
  2545.  
  2546. -           if(tcb->looping)
  2547. +           if(!tcb->cb_func(data[i], (u32)tcb->xfer, tcb->idTh))
  2548.             {
  2549. -               if(!tcb->cb_func(data[i], (u32)tcb->xfer))
  2550. -               {
  2551. -                   tcb->looping = false;
  2552. +                   tcb->fTerminated = true;
  2553.                 }
  2554.                 context[i] = ep->BeginDataXfer(data[i], tcb->xfer, &(ovlp[i]));
  2555. -               qnum++;
  2556. -           }
  2557.  
  2558.             if(++i == tcb->ques) i = 0;
  2559. -           if(tcb->looping == false)
  2560. -           {
  2561. -               if(qnum == 0)
  2562. -                   break;
  2563.             }
  2564.         }
  2565. +
  2566. +    tcb->fTerminated = true ;
  2567. +
  2568. +    if(dual) {
  2569. +      // Destroy the dual transfer threading context.
  2570. +      SetEvent(dtc->evDataAvailable) ;
  2571. +      WaitForSingleObject(tcb->thTransfer, INFINITE);
  2572. +      CloseHandle(tcb->thTransfer) ;
  2573. +      tcb->thTransfer=NULL ;
  2574. +      CloseHandle(dtc->evDataAvailable) ;
  2575. +      dtc->evDataAvailable=NULL ;
  2576. +      CloseHandle(dtc->evTransferCompleted) ;
  2577. +      dtc->evTransferCompleted=NULL ;
  2578. +      delete [] dtc->len ;
  2579. +      delete dtc ;
  2580. +      tcb->lpDualTransferContext = NULL ;
  2581.     }
  2582.  
  2583. +    ep->Abort() ;
  2584. +
  2585. +    CloseHandle(tcb->evResetCompleted) ; tcb->evResetCompleted = NULL ;
  2586. +    CloseHandle(tcb->evAbortOrdered) ; tcb->evAbortOrdered = NULL ;
  2587. +
  2588.     for(i=0; i<tcb->ques; i++)
  2589.     {
  2590. -       CloseHandle(ovlp[i].hEvent);
  2591. +       CloseHandle(event[i]);
  2592.         delete [] data[i];
  2593.     }
  2594.     delete [] context;
  2595.     delete [] data;
  2596.     delete [] ovlp;
  2597. +    delete [] event;
  2598. +    tcb->fDone = true ;
  2599. +}
  2600.  
  2601. -// _endthreadex( 0 );
  2602. -// return(0);
  2603. +// Appended by ◆PRY8EAlByw
  2604. +void cusb2::data_transfer_thread_proc(cusb2_tcb *tcb)
  2605. +{
  2606. +  DUAL_TRANSFER_CONTEXT *dtc = tcb->lpDualTransferContext ;
  2607. +  const DWORD WAIT_MSEC_LIMIT = tcb->wait ;
  2608. +  for(u32 i=0;!tcb->fTerminated;) {
  2609. +    if(i>=tcb->ques) i=0 ;
  2610. +    while(dtc->len[i]<0) { // Wait for a data available event.
  2611. +      WaitForSingleObject(dtc->evDataAvailable,WAIT_MSEC_LIMIT) ;
  2612. +      if(tcb->fTerminated) break ;
  2613. +    }
  2614. +    if(tcb->fTerminated) break ;
  2615. +    s32 len = dtc->len[i] ;
  2616. +    bool aborted = dtc->idAborted>=0 ;
  2617. +    if(len>=0) {
  2618. +      if(len>0&&!aborted) {
  2619. +        if(!tcb->cb_func(dtc->data[i], (u32)len, tcb->idTh)) {
  2620. +          tcb->fTerminated = true ; // error
  2621. +        }
  2622. +      }
  2623. +    }else tcb->fTerminated = true ; // error
  2624. +    if(!tcb->fTerminated) {
  2625. +      if(aborted) {
  2626. +        // Restart queueing all.
  2627. +       tcb->ep->Abort();
  2628. +       u32 id = dtc->idAborted;
  2629. +       for(u32 j=0;j<tcb->ques;j++) {
  2630. +          u32 t = (id+j)%tcb->ques ;
  2631. +          ::ResetEvent(dtc->ovlp[t].hEvent) ;
  2632. +          dtc->context[t] = tcb->ep->BeginDataXfer(dtc->data[t], tcb->xfer, &(dtc->ovlp[t]));
  2633. +          dtc->len[t] = -1 ;
  2634. +        }
  2635. +        i = id ;
  2636. +        dtc->idAborted = -1 ;
  2637. +        SetEvent(tcb->evResetCompleted) ;
  2638. +      }else {
  2639. +        dtc->context[i] = tcb->ep->BeginDataXfer(dtc->data[i], tcb->xfer, &(dtc->ovlp[i]));
  2640. +        dtc->len[i] = -1 ;
  2641. +      }
  2642. +    }
  2643. +    // Notify the main thread that one of new data transfering is completed.
  2644. +    SetEvent(dtc->evTransferCompleted) ;
  2645. +   if (!aborted) i++;
  2646. +  }
  2647.  }
  2648.  
  2649. -cusb2_tcb* cusb2::start_thread(u8 epaddr, u32 xfer, s32 ques, bool (*cb_func)(u8 *, u32))
  2650. +
  2651. +cusb2_tcb* cusb2::start_thread(u8 epaddr, u32 xfer, s32 ques, u32 wait, int prior, cb_func_t cb_func)
  2652.  {
  2653.     cusb2_tcb *tcb = new cusb2_tcb;
  2654.     tcb->epaddr = epaddr;
  2655. @@ -320,19 +456,19 @@
  2656.     tcb->epaddr = epaddr;
  2657.     tcb->xfer = xfer;
  2658.     tcb->ques = ques;
  2659. +    tcb->wait = wait;
  2660. +    tcb->prior = prior;
  2661.     tcb->cb_func = cb_func;                                 // Modified by 拡張ツール中の人
  2662.     tcb->th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)cusb2::thread_proc, tcb, 0, NULL);
  2663. -// tcb->th = (HANDLE)_beginthreadex(NULL,0,thread_proc,(void*)tcb,0/*CREATE_SUSPENDED*/,(unsigned*)&tcb->ThreadID);
  2664.     Sleep(100);
  2665.     return tcb;
  2666.  }
  2667.  
  2668.  void cusb2::delete_thread(cusb2_tcb *tcb)
  2669.  {
  2670. -   tcb->fTerminate=true;
  2671. -   WaitForSingleObject(tcb->th, 3000);
  2672. -// WaitForSingleObject(tcb->th, INFINITE);
  2673. -// CloseHandle(tcb->th);
  2674. +   tcb->fTerminated = true ;
  2675. +    WaitForSingleObject(tcb->th, INFINITE);
  2676. +    CloseHandle(tcb->th) ;
  2677.     delete tcb;
  2678.  }
  2679.  
  2680. diff -uPrb Org/Cusb2/cusb2.h Mod/Cusb2/cusb2.h
  2681. --- Org/Cusb2/cusb2.h   2012-02-22 15:34:52.000000000 +0900
  2682. +++ Mod/Cusb2/cusb2.h   2014-12-05 20:24:31.000000000 +0900
  2683. @@ -15,18 +15,83 @@
  2684.  
  2685.  #define CUSB_DEBUG   0
  2686.  
  2687. +typedef bool (*cb_func_t)(u8 *data, u32 ln, u32 idTh) ;
  2688. +
  2689. +struct DUAL_TRANSFER_CONTEXT
  2690. +{
  2691. +  HANDLE evDataAvailable ;
  2692. +  HANDLE evTransferCompleted ;
  2693. +  s32 *len ;
  2694. +  OVERLAPPED *ovlp ;
  2695. +  PUCHAR *data ;
  2696. +  PUCHAR *context ;
  2697. +  s32 idAborted ;
  2698. +};
  2699. +
  2700.  struct _cusb2_tcb
  2701.  {
  2702.     HANDLE          th;
  2703. +    DWORD idTh;
  2704.     CCyUSBEndPoint  *ep;
  2705.     u8              epaddr;
  2706.     LONG            xfer;
  2707.     u32             ques;
  2708. -   bool            (*cb_func)(u8 *, u32);
  2709. -   bool            looping;
  2710. +   cb_func_t cb_func ;
  2711.     u32             nsuccess;
  2712.     u32             nfailure;
  2713. -   bool            fTerminate;
  2714. +    bool fResetOrdered;
  2715. +    HANDLE evAbortOrdered ;
  2716. +    HANDLE evResetCompleted ;
  2717. +    bool fTerminated;
  2718. +    bool fDone;
  2719. +    //---- wait & thread priority -----
  2720. +    u32             wait  ;
  2721. +    int             prior ;
  2722. +    //---- dual transfer threading -----
  2723. +    bool            fDualTransfer ;
  2724. +    HANDLE          thTransfer ;
  2725. +    DUAL_TRANSFER_CONTEXT *lpDualTransferContext ;
  2726. +    //----
  2727. +    _cusb2_tcb() {
  2728. +      th = 0 ;
  2729. +      idTh = 0 ;
  2730. +      ep = 0 ;
  2731. +      epaddr = 0 ;
  2732. +      xfer = 0 ;
  2733. +      cb_func = 0 ;
  2734. +      nsuccess = 0 ;
  2735. +      nfailure = 0 ;
  2736. +      fResetOrdered = 0 ;
  2737. +      evAbortOrdered = 0 ;
  2738. +      evResetCompleted = 0 ;
  2739. +      fTerminated = 0 ;
  2740. +      fDone = 0 ;
  2741. +      wait = 500 ;
  2742. +      prior = 0 ;
  2743. +      thTransfer = 0 ;
  2744. +      fDualTransfer = 0 ;
  2745. +      lpDualTransferContext = 0 ;
  2746. +    }
  2747. +    void abort() {
  2748. +      fTerminated = true ;
  2749. +      if(evAbortOrdered) SetEvent(evAbortOrdered) ;
  2750. +      if(lpDualTransferContext) {
  2751. +        if(lpDualTransferContext->evDataAvailable)
  2752. +          SetEvent(lpDualTransferContext->evDataAvailable) ;
  2753. +        if(lpDualTransferContext->evTransferCompleted)
  2754. +          SetEvent(lpDualTransferContext->evTransferCompleted) ;
  2755. +      }
  2756. +    }
  2757. +    void reset() {
  2758. +      if(evResetCompleted) ResetEvent(evResetCompleted) ;
  2759. +      fResetOrdered = true ;
  2760. +      if(evAbortOrdered) SetEvent(evAbortOrdered) ;
  2761. +      if(lpDualTransferContext) {
  2762. +        if(lpDualTransferContext->evTransferCompleted)
  2763. +          SetEvent(lpDualTransferContext->evTransferCompleted) ;
  2764. +      }
  2765. +      if(evResetCompleted) WaitForSingleObject(evResetCompleted,wait*3) ;
  2766. +    }
  2767.  };
  2768.  
  2769.  typedef struct _cusb2_tcb cusb2_tcb;
  2770. @@ -47,13 +112,14 @@
  2771.     bool fwload(u8 id, u8 *fw, u8 *string1);
  2772.     CCyUSBEndPoint* get_endpoint(u8 addr);
  2773.     bool xfer(CCyUSBEndPoint *ep, PUCHAR buf, LONG &len);
  2774. -   cusb2_tcb *start_thread(u8 epaddr, u32 xfer, s32 ques, bool (*cb_func)(u8 *, u32));
  2775. +   cusb2_tcb *start_thread(u8 epaddr, u32 xfer, s32 ques, u32 wait, int prior, cb_func_t cb_func );
  2776.     void delete_thread(cusb2_tcb *tcb);
  2777.     bool PnpEvent(WPARAM wParam, LPARAM lParam);
  2778.  
  2779. -// Modified by 拡張ツール中の人
  2780. +// Modified by 拡張ツール中の人 ( Fixed by ◆PRY8EAlByw )
  2781.  protected:
  2782.     static void thread_proc(cusb2_tcb *tcb);   
  2783. +    static void data_transfer_thread_proc(cusb2_tcb *tcb);
  2784.  
  2785.  private:
  2786.     s32 check_fx2(u8 id);
  2787. diff -uPrb Org/Cusb2/UsbFx2Dirver.cpp Mod/Cusb2/UsbFx2Dirver.cpp
  2788. --- Org/Cusb2/UsbFx2Dirver.cpp  2012-02-22 15:50:18.000000000 +0900
  2789. +++ Mod/Cusb2/UsbFx2Dirver.cpp  2014-11-24 06:42:31.000000000 +0900
  2790. @@ -12,10 +12,7 @@
  2791.  #define new DEBUG_NEW
  2792.  #endif
  2793.  
  2794. -
  2795. -// FX2のファームウェアサイズ
  2796. -#define FIRMWARE_SIZE  (3893UL)                //(3367UL)
  2797. -
  2798. +using namespace std ;
  2799.  
  2800.  CUsbFx2Driver *CUsbFx2Driver::m_pThis = NULL;
  2801.  
  2802. @@ -31,7 +28,9 @@
  2803.     CloseDriver();
  2804.  }
  2805.  
  2806. -const bool CUsbFx2Driver::OpenDriver(const BYTE byDeviceID, const BYTE *pFirmWare, int size,const char *lpszFirmName)
  2807. +const bool CUsbFx2Driver::OpenDriver(
  2808. +  const BYTE byDeviceID, const BYTE *pFirmWare,
  2809. +   const DWORD FIRMWARE_SIZE, const char *lpszFirmName)
  2810.  {
  2811.     if(!pFirmWare)return false;
  2812.  
  2813. @@ -39,37 +38,52 @@
  2814.     CloseDriver();
  2815.    
  2816.     // ファームウェアをコピーする(cusb2内で書き換えられるため)
  2817. -   BYTE *abyFirmBuffer=new BYTE[size]; //[FIRMWARE_SIZE];
  2818. -   ::CopyMemory(abyFirmBuffer, pFirmWare, size);
  2819. +   BYTE *abyFirmBuffer = new BYTE[FIRMWARE_SIZE] ;
  2820. +   memcpy(abyFirmBuffer, pFirmWare, FIRMWARE_SIZE);
  2821.    
  2822.     // ファームウェアのダウンロードを行う
  2823. -   return fwload(byDeviceID, abyFirmBuffer, (BYTE *)lpszFirmName);
  2824. +   bool result = fwload(byDeviceID, abyFirmBuffer, (BYTE *)lpszFirmName);
  2825. +
  2826. +   delete [] abyFirmBuffer ;
  2827. +   return result ;
  2828.  }
  2829.  
  2830. -void CUsbFx2Driver::CloseDriver(void)
  2831. +void CUsbFx2Driver::CloseDriver( void )
  2832.  {
  2833.     // 全てのスレッドを終了させる
  2834. -   for(DWORD dwIndex = 0UL ; dwIndex < m_ThreadArray.size() ; dwIndex++)
  2835. -   {
  2836. -       if(!m_ThreadArray[dwIndex].pThreadTcb->looping)continue;
  2837. +  for ( DWORD dwIndex = 0UL ; dwIndex < m_ThreadArray.size() ; dwIndex++ ) {
  2838. +
  2839. +    try {
  2840.  
  2841.         // スレッド終了シグナルセット
  2842. -       m_ThreadArray[dwIndex].pThreadTcb->looping = false;
  2843. +      m_ThreadArray[ dwIndex ].pThreadTcb->abort() ;
  2844.  
  2845.         // スレッド終了を待つ
  2846. -       if(::WaitForSingleObject(m_ThreadArray[dwIndex].pThreadTcb->th, 3000UL) != WAIT_OBJECT_0)
  2847. -       {
  2848. +      DWORD time_limit = m_ThreadArray[ dwIndex ].pThreadTcb->wait * 2 + 5000 ;
  2849. +      if ( ::WaitForSingleObject( m_ThreadArray[ dwIndex ].pThreadTcb->th, time_limit ) != WAIT_OBJECT_0 ) {
  2850.             // スレッド強制終了
  2851. -           ::TerminateThread(m_ThreadArray[dwIndex].pThreadTcb->th, 0UL);
  2852. +        if ( !m_ThreadArray[ dwIndex ].pThreadTcb->fDone ) {
  2853. +          ::SuspendThread( m_ThreadArray[ dwIndex ].pThreadTcb->th ) ;
  2854. +          if ( m_ThreadArray[ dwIndex ].pThreadTcb->thTransfer ) {
  2855. +            ::SuspendThread( m_ThreadArray[ dwIndex ].pThreadTcb->thTransfer ) ;
  2856. +            ::TerminateThread( m_ThreadArray[ dwIndex ].pThreadTcb->thTransfer, 0UL );
  2857. +            ::CloseHandle( m_ThreadArray[ dwIndex ].pThreadTcb->thTransfer );
  2858.         }
  2859. +          ::TerminateThread( m_ThreadArray[ dwIndex ].pThreadTcb->th, 0UL );
  2860. +        }
  2861. +      }
  2862. +
  2863. +      ::CloseHandle( m_ThreadArray[ dwIndex ].pThreadTcb->th );
  2864. +      delete m_ThreadArray[ dwIndex ].pThreadTcb;
  2865. +
  2866. +    }catch ( ... ) { /* No action */ }
  2867.  
  2868. -       ::CloseHandle(m_ThreadArray[dwIndex].pThreadTcb->th);
  2869. -       delete m_ThreadArray[dwIndex].pThreadTcb;
  2870.     }
  2871.  
  2872.     // 内部状態をクリアする
  2873.     m_EndPointArray.clear();
  2874.     m_ThreadArray.clear();
  2875. +  m_PidIndicesMap.clear();
  2876.  }
  2877.  
  2878.  const bool CUsbFx2Driver::AddEndPoint(const BYTE byAddress, DWORD *pdwEpIndex)
  2879. @@ -123,7 +137,10 @@
  2880.     return TransmitData(dwEpIndex, abySendBuffer, dwLen);
  2881.  }
  2882.  
  2883. -const bool CUsbFx2Driver::CreateFifoThread(const BYTE byAddress, DWORD *pdwThreadIndex, const DWORD dwBufLen, const DWORD dwQueNum)
  2884. +const bool CUsbFx2Driver::CreateFifoThread(
  2885. +  const BYTE byAddress, DWORD *pdwThreadIndex, const DWORD dwBufLen,
  2886. +  const DWORD dwQueNum, const DWORD dwWait, const int iPrior,
  2887. +  const BOOL bDualTransferThreading )
  2888.  {
  2889.     // スレッド起動
  2890.     TAG_THREADINFO ThreadInfo;
  2891. @@ -136,13 +153,19 @@
  2892.     ThreadInfo.pThreadTcb->ep = get_endpoint(byAddress);
  2893.     ThreadInfo.pThreadTcb->xfer = dwBufLen;
  2894.     ThreadInfo.pThreadTcb->ques = dwQueNum;
  2895. +    ThreadInfo.pThreadTcb->wait = dwWait ;
  2896. +    ThreadInfo.pThreadTcb->prior = iPrior ;
  2897.     ThreadInfo.pThreadTcb->cb_func = CUsbFx2Driver::FifoRecvCallback;
  2898. +    ThreadInfo.pThreadTcb->fDualTransfer = bDualTransferThreading ? true : false ;
  2899.  
  2900.     ThreadInfo.pThreadTcb->th = ::CreateThread(NULL, 0UL, (LPTHREAD_START_ROUTINE)cusb2::thread_proc, (LPVOID)ThreadInfo.pThreadTcb, CREATE_SUSPENDED, &ThreadInfo.dwThreadID);
  2901.     if(!ThreadInfo.pThreadTcb->th)return false;
  2902.  
  2903. +
  2904.     // リストに登録
  2905. -   if(pdwThreadIndex)*pdwThreadIndex = m_ThreadArray.size();
  2906. +    DWORD dwThreadIndex = m_ThreadArray.size() ;
  2907. +   if(pdwThreadIndex)*pdwThreadIndex = dwThreadIndex ;
  2908. +    m_PidIndicesMap[ThreadInfo.dwThreadID] = dwThreadIndex ;
  2909.     m_ThreadArray.push_back(ThreadInfo);
  2910.    
  2911.     // レジューム
  2912. @@ -151,19 +174,27 @@
  2913.     return true;
  2914.  }
  2915.  
  2916. -bool CUsbFx2Driver::FifoRecvCallback(u8 *pData, u32 dwLen)
  2917. +const bool CUsbFx2Driver::ResetFifoThread(const DWORD dwThreadIndex)
  2918.  {
  2919. -   // 呼び出し元を特定するためにスレッドIDを取得
  2920. -   const DWORD dwThreadID = ::GetCurrentThreadId();
  2921. +   if(dwThreadIndex>=m_ThreadArray.size()) return false ;
  2922. +   m_ThreadArray[dwThreadIndex].pThreadTcb->reset() ;
  2923. +   return true ;
  2924. +}
  2925.    
  2926. -   for(DWORD dwIndex = 0UL ; dwIndex < m_pThis->m_ThreadArray.size() ; dwIndex++)
  2927. -   {
  2928. -       if(m_pThis->m_ThreadArray[dwIndex].dwThreadID == dwThreadID)
  2929. -       {
  2930. +bool CUsbFx2Driver::FifoRecvCallback(u8 *pData, u32 dwLen, u32 dwThreadID)
  2931. +{
  2932. +    #if 0
  2933. +    // 呼び出し元を特定するためにスレッドIDを取得
  2934. +   for(DWORD dwIndex = 0UL ; dwIndex < m_pThis->m_ThreadArray.size() ; dwIndex++){
  2935. +       if(m_pThis->m_ThreadArray[dwIndex].dwThreadID == dwThreadID){
  2936.             // インタフェースを呼び出す
  2937.             return m_pThis->m_pDriverHost->OnRecvFifoData(dwIndex, pData, dwLen, m_pThis);
  2938.         }      
  2939.     }
  2940. -
  2941. +    #else
  2942. +   map<u32,int>::iterator pos=m_pThis->m_PidIndicesMap.find(dwThreadID) ;
  2943. +    if(pos!=m_pThis->m_PidIndicesMap.end())
  2944. +     return m_pThis->m_pDriverHost->OnRecvFifoData(pos->second, pData, dwLen, m_pThis);
  2945. +    #endif
  2946.     return false;
  2947.  }
  2948. diff -uPrb Org/Cusb2/UsbFx2Driver.h Mod/Cusb2/UsbFx2Driver.h
  2949. --- Org/Cusb2/UsbFx2Driver.h    2012-02-18 15:46:56.000000000 +0900
  2950. +++ Mod/Cusb2/UsbFx2Driver.h    2014-11-24 06:42:32.000000000 +0900
  2951. @@ -6,15 +6,18 @@
  2952.  
  2953.  
  2954.  #include <vector>
  2955. +#include <map>
  2956.  #include "cusb2.h"
  2957.  
  2958.  
  2959. -using std::vector;
  2960. +//using std::vector;
  2961.  
  2962.  
  2963.  // デフォルトのFIFOバッファパラメータ設定
  2964.  #define DEF_BUFLEN (1024UL * 64UL)     // cap_stsから
  2965. -#define DEF_QUENUM (16UL)              // cap_stsから
  2966. +#define DEF_QUENUM 16UL                // cap_stsから
  2967. +#define DEF_WAIT   500UL
  2968. +#define DEF_PRIOR  THREAD_PRIORITY_HIGHEST
  2969.  
  2970.  
  2971.  /////////////////////////////////////////////////////////////////////////////
  2972. @@ -36,22 +39,28 @@
  2973.  // cusb2 ラッパークラス
  2974.  /////////////////////////////////////////////////////////////////////////////
  2975.  
  2976. -class CUsbFx2Driver : public cusb2
  2977. +class CUsbFx2Driver : private cusb2
  2978.  {
  2979.  public:
  2980.     CUsbFx2Driver(IUsbFx2DriverHost *pHostClass, HWND hHostHwnd = NULL);
  2981.     ~CUsbFx2Driver();
  2982.  
  2983. -   const bool OpenDriver(const BYTE byDeviceID, const BYTE *pFirmWare, int size,const char *lpszFirmName = NULL);
  2984. +   const bool OpenDriver(const BYTE byDeviceID, const BYTE *pFirmWare,
  2985. +      const DWORD FIRMWARE_SIZE, const char *lpszFirmName = NULL);
  2986.     void CloseDriver(void);
  2987.    
  2988.     const bool AddEndPoint(const BYTE byAddress, DWORD *pdwEpIndex = NULL);
  2989.     const bool TransmitData(const DWORD dwEpIndex, BYTE *pData, DWORD &dwLen);
  2990.     const bool TransmitFormatedData(const DWORD dwEpIndex, const DWORD dwDataNum, ...);
  2991. -   const bool CreateFifoThread(const BYTE byAddress, DWORD *pdwThreadIndex = NULL, const DWORD dwBufLen = DEF_BUFLEN, const DWORD dwQueNum = DEF_QUENUM);
  2992. +   const bool CreateFifoThread(
  2993. +      const BYTE byAddress, DWORD *pdwThreadIndex = NULL, const DWORD dwBufLen = DEF_BUFLEN,
  2994. +      const DWORD dwQueNum = DEF_QUENUM, const DWORD dwWait = DEF_WAIT, const int iPrior = DEF_PRIOR,
  2995. +      const BOOL bDualTransferThreading = FALSE );
  2996. +
  2997. +    const bool ResetFifoThread(const DWORD dwThreadIndex) ;
  2998.        
  2999.  protected:
  3000. -   static bool FifoRecvCallback(u8 *pData, u32 dwLen);
  3001. +   static bool FifoRecvCallback(u8 *pData, u32 dwLen, u32 dwThreadID);
  3002.  
  3003.     struct TAG_THREADINFO
  3004.     {
  3005. @@ -63,6 +72,7 @@
  3006.  
  3007.     IUsbFx2DriverHost *m_pDriverHost;
  3008.    
  3009. -   vector<CCyUSBEndPoint *> m_EndPointArray;
  3010. -   vector<TAG_THREADINFO> m_ThreadArray;
  3011. +   std::vector<CCyUSBEndPoint *> m_EndPointArray;
  3012. +   std::vector<TAG_THREADINFO> m_ThreadArray;
  3013. +    std::map<u32/*pid*/,int/*index*/> m_PidIndicesMap ;
  3014.  };
  3015. diff -uPrb Org/stdafx.cpp Mod/stdafx.cpp
  3016. --- Org/stdafx.cpp  2008-02-12 01:10:02.000000000 +0900
  3017. +++ Mod/stdafx.cpp  2014-01-10 03:55:10.000000000 +0900
  3018. @@ -3,7 +3,11 @@
  3019.  // stdafx.obj にはプリコンパイル済み型情報が含まれます。
  3020.  
  3021.  #include "stdafx.h"
  3022. -#include <Stdio.h>
  3023. +#include <cstring>
  3024. +#include <cstdio>
  3025. +#include <cstdlib>
  3026. +#include <cstdarg>
  3027. +#include <clocale>
  3028.  
  3029.  // TODO: このファイルではなく、STDAFX.H で必要な
  3030.  // 追加ヘッダーを参照してください。
  3031. @@ -18,6 +22,44 @@
  3032.         ::wvsprintf(szTempStr, szFormat, Args);
  3033.         va_end(Args);
  3034.  
  3035. -       ::OutputDebugString(szTempStr);
  3036. +        #ifndef DEBUG_TO_X_DRIVE
  3037. +        ::OutputDebugString(szTempStr) ;
  3038. +        #else
  3039. +        FILE *fp = NULL ;
  3040. +        fopen_s(&fp,"X:\\Debug.txt","a+t") ;
  3041. +        if(fp) {
  3042. +          size_t ln = wcslen(szTempStr) ;
  3043. +          if(ln) {
  3044. +            char *mbcs = new char[ln*2 + 2] ;
  3045. +            size_t mbLen = 0 ;
  3046. +            setlocale(LC_ALL,"japanese");
  3047. +            wcstombs_s(&mbLen, mbcs, ln*2+1, szTempStr, _TRUNCATE);
  3048. +            std::fputs(mbcs,fp) ;
  3049. +            delete [] mbcs;
  3050. +          }
  3051. +          std::fclose(fp) ;
  3052. +        }
  3053. +        #endif
  3054. +   }
  3055. +#endif
  3056. +
  3057. +#ifdef _DEBUG
  3058. +    void DBGOUT( const char* pszFormat,... )
  3059. +    {
  3060. +        std::va_list marker ;
  3061. +        char edit_str[1024] ;
  3062. +        va_start( marker, pszFormat ) ;
  3063. +        vsprintf_s( edit_str, sizeof(edit_str), pszFormat, marker ) ;
  3064. +        va_end( marker ) ;
  3065. +        #ifndef DEBUG_TO_X_DRIVE
  3066. +        OutputDebugStringA(edit_str) ;
  3067. +        #else
  3068. +        FILE *fp = NULL ;
  3069. +        fopen_s(&fp,"X:\\Debug.txt","a+t") ;
  3070. +        if(fp) {
  3071. +          std::fputs(edit_str,fp) ;
  3072. +          std::fclose(fp) ;
  3073. +        }
  3074. +        #endif
  3075.     }
  3076.  #endif
  3077. diff -uPrb Org/stdafx.h Mod/stdafx.h
  3078. --- Org/stdafx.h    2008-02-12 01:09:46.000000000 +0900
  3079. +++ Mod/stdafx.h    2014-01-04 03:30:32.000000000 +0900
  3080. @@ -20,6 +20,21 @@
  3081.  #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
  3082.  #endif
  3083.  
  3084. +#ifndef __BORLANDC__
  3085. +  #ifdef _MSC_VER
  3086. +    #if _MSC_VER <= 1200 // VC++ 6.0 以下
  3087. +      //色々と問題が多いコンパイラなので、場合分け用のフラグを設定しておく
  3088. +      #define __MSVC_1200__
  3089. +      //VC++ for構文のインライン変数除去マクロ
  3090. +      #define for if(0) ; else for
  3091. +    #endif
  3092. +    // C4786 警告を除去
  3093. +    #pragma warning (disable : 4786)
  3094. +  #endif
  3095. +#endif
  3096. +
  3097. +#define DEBUG_TO_X_DRIVE
  3098. +
  3099.  // トレース出力
  3100.  #ifdef _DEBUG
  3101.     #define TRACE MYTARACEFUNC
  3102. @@ -27,3 +42,11 @@
  3103.  #else
  3104.     #define TRACE __noop
  3105.  #endif
  3106. +
  3107. +// DBGOUT
  3108. +#ifdef _DEBUG
  3109. +    void DBGOUT( const char* pszFormat,... ) ;
  3110. +#else
  3111. +    #define DBGOUT __noop
  3112. +#endif
  3113. +
  3114. diff -uPrb Org/TC90532/MxL5007.cpp Mod/TC90532/MxL5007.cpp
  3115. --- Org/TC90532/MxL5007.cpp 2011-11-27 21:03:48.000000000 +0900
  3116. +++ Mod/TC90532/MxL5007.cpp 2014-11-13 21:58:49.000000000 +0900
  3117. @@ -315,7 +315,7 @@
  3118.     case MxL_MODE_CABLE:                       
  3119.         myIRV = IRV_Init_Cable;
  3120.         SetIRVBit(myIRV, 0x09, 0xFF, 0xC1);
  3121. -       SetIRVBit(myIRV, 0x0A, 0xFF, 8-IF_Diff_Out_Level)
  3122. +       SetIRVBit(myIRV, 0x0A, 0xFF, UINT8(8-IF_Diff_Out_Level));  
  3123.         SetIRVBit(myIRV, 0x0B, 0xFF, 0x17);                        
  3124.         break;
  3125.     }
  3126. diff -uPrb Org/TC90532/tc90532.cpp Mod/TC90532/tc90532.cpp
  3127. --- Org/TC90532/tc90532.cpp 2012-02-18 11:44:48.000000000 +0900
  3128. +++ Mod/TC90532/tc90532.cpp 2014-11-13 21:58:49.000000000 +0900
  3129. @@ -13,8 +13,6 @@
  3130.  #include "MxL5007.h"
  3131.  #include "tc90532.h"
  3132.  
  3133. -#define TC90502_OK              0
  3134. -#define TC90502_ERR             1
  3135.  
  3136.  #define    CH_MAX                  62//-13         //The Ch maximum number
  3137.  
  3138. @@ -61,18 +59,18 @@
  3139.  
  3140.  float BS_table[12] =
  3141.  {
  3142. -   1049.48,    //CH 1
  3143. -   1087.84,    //CH 3
  3144. -   1126.20,    //CH 5 
  3145. -   1164.56,    //CH 7
  3146. -   1202.92,    //CH 9
  3147. -   1241.28,    //CH 11
  3148. -   1279.64,    //CH 13
  3149. -   1318.00,    //CH 15
  3150. -   1356.36,    //CH 17
  3151. -   1394.72,    //CH 19
  3152. -   1433.08,    //CH 21
  3153. -   1471.44     //CH 23
  3154. +   1049.48f,   //CH 1
  3155. +   1087.84f,   //CH 3
  3156. +   1126.20f,   //CH 5
  3157. +   1164.56f,   //CH 7
  3158. +   1202.92f,   //CH 9
  3159. +   1241.28f,   //CH 11
  3160. +   1279.64f,   //CH 13
  3161. +   1318.00f,   //CH 15
  3162. +   1356.36f,   //CH 17
  3163. +   1394.72f,   //CH 19
  3164. +   1433.08f,   //CH 21
  3165. +   1471.44f    //CH 23
  3166.  };
  3167.  
  3168.  float CS_table[12] =
  3169. @@ -91,28 +89,34 @@
  3170.     2053        //CH 24
  3171.  };
  3172.  
  3173. -UINT8 SetMxl5007(UINT8 CH)
  3174. +UINT8 SetMxl5007(UINT8 CH, float MegaHz)
  3175.  {
  3176. -    UINT32 freq, x;
  3177.      MxL_ERR_MSG Status = MxL_OK;
  3178.      BOOL RFSynthLock, REFSynthLock;
  3179. -    SINT32 RF_Input_Level;
  3180. +    //SINT32 RF_Input_Level;
  3181.      MxL5007_TunerConfigS myTuner;
  3182.      unsigned long rf;
  3183. -    unsigned char bw;
  3184.  
  3185. -    x = CH;
  3186. -
  3187. -    if(CH < 4)          freq =  93000 + (x - 1) * 6000;
  3188. -    else if(CH < 8)     freq = 173000 + (x - 4) * 6000;
  3189. -    else if(CH < 13)    freq = 195000 + (x - 8) * 6000;
  3190. -    else if(CH < 63)   freq = 473143 + (x - 13) * 6000;
  3191. -   else if(CH < 123)   freq = 111143 + (x - 113) * 6000;
  3192. -   else if(CH < 136)   freq = 225143 + (x - 123) * 6000;
  3193. -   else                freq = 303143 + (x - 136) * 6000;
  3194. -
  3195. -    rf = freq * 1000UL;
  3196. -    bw = 6;
  3197. +    if(!CH) {
  3198. +      rf = UINT32(MegaHz * 1000000.f) ;
  3199. +    }else {
  3200. +      if(CH < 4)        rf =  93UL + (CH - 1)   * 6UL ;
  3201. +      else if(CH < 8)   rf = 173UL + (CH - 4)   * 6UL ;
  3202. +      else if(CH < 13)  rf = 195UL + (CH - 8)   * 6UL ;
  3203. +      else if(CH < 63) rf = 473UL + (CH - 13)  * 6UL ;
  3204. +      else if(CH < 122)    rf = 111UL + (CH - 113) * 6UL ;
  3205. +      else if(CH ==122) rf = 167UL ; // C22
  3206. +      #if 0
  3207. +      else if(CH ==123) rf = 225UL ;
  3208. +      else if(CH < 128)    rf = 233UL + (CH - 124) * 6UL ;
  3209. +      else if(CH < 136)    rf = 255UL + (CH - 128) * 6UL ;
  3210. +      #else
  3211. +      else if(CH < 136) rf = 225UL + (CH - 123) * 6UL ;
  3212. +      #endif
  3213. +      else             rf = 303UL + (CH - 136) * 6UL ;
  3214. +      rf *= 1000000UL ;
  3215. +      rf +=  142857UL ;
  3216. +    }
  3217.  
  3218.     myTuner.DemodAddr = DEMODTADRS;
  3219.      //Set Tuner's I2C Address
  3220. @@ -142,7 +146,7 @@
  3221.         //Init Tuner fail
  3222.      }
  3223.      //Tune Tuner
  3224. -    if(Status == MxL_Tuner_RFTune(&myTuner, rf, (MxL5007_BW_MHz)bw))
  3225. +    if(Status == MxL_Tuner_RFTune(&myTuner, rf, MxL_BW_6MHz))
  3226.      {
  3227.         //Tune Tuner fail
  3228.      }
  3229. @@ -162,7 +166,7 @@
  3230.      return 0;
  3231.  }
  3232.  
  3233. -UINT8 SetStv6110a(UINT8 BSCh)
  3234. +UINT8 SetStv6110a(UINT8 BSCh,float MegaHz)
  3235.  {
  3236.     UINT8 STB6110A[8] = {0x07,0x13,0xdc,0x85,0x17,0x01,0xe6,0x1e};
  3237.     UINT8 K;
  3238. @@ -173,14 +177,18 @@
  3239.     int rDivOpt = 0;
  3240.     int pCalc, i;
  3241.     UINT8 CF;
  3242. -   UINT8 buffer;
  3243. +   //UINT8 buffer;
  3244.     float RF;
  3245. -   float symb = 28.86;
  3246. +   float symb = 28.86f;
  3247.  
  3248. +   if(!BSCh) {
  3249. +     RF = MegaHz ;
  3250. +   }else {
  3251.     if (BSCh & 1)
  3252.         RF = BS_table[BSCh/2];
  3253.     else
  3254.         RF = CS_table[BSCh/2-1];
  3255. +   }
  3256.  
  3257.     for(i=0; i<8; i++)
  3258.     {
  3259. @@ -231,7 +239,7 @@
  3260.  
  3261.     divider = (UINT16)(((RF * (float)r * pow(2.0,(double)(P+1)) * 10.0 / (float)XTAL) + 5.0) / 10.0) ;
  3262.     STB6110A[2] = divider & 0x00ff;
  3263. -   STB6110A[3] = ((rDivOpt & 0x3) << 6) | (Presc << 5) | (P << 4) | ((divider & 0x700) >> 8);
  3264. +   STB6110A[3] = ((rDivOpt & 0x3) << 6) | (Presc << 5) | (P << 4) | ((divider & 0xF00) >> 8);
  3265.  
  3266.     if(WriteTuner(DemodAddress+1,0xC6,0x02,STB6110A[2]) != 0)
  3267.         return 1;
  3268. diff -uPrb Org/TC90532/tc90532.h Mod/TC90532/tc90532.h
  3269. --- Org/TC90532/tc90532.h   2012-02-07 20:05:32.000000000 +0900
  3270. +++ Mod/TC90532/tc90532.h   2014-11-15 21:31:29.000000000 +0900
  3271. @@ -2,6 +2,9 @@
  3272.  #ifndef TC90532_H
  3273.  #define TC90532_H
  3274.  
  3275. +#define TC90502_OK              0
  3276. +#define TC90502_ERR             1
  3277. +
  3278.  #define DemodAddress            0x10
  3279.  
  3280.  #define    DEMODTADRS              0x10
  3281. @@ -14,9 +17,11 @@
  3282.  #define ISDB_S                 2
  3283.  
  3284.  
  3285. -UINT8 SetMxl5007(UINT8 CH);
  3286. -UINT8 SetStv6110a(UINT8 BSCh);
  3287. +UINT8 SetMxl5007(UINT8 CH,float MegaHz=0);
  3288. +UINT8 SetStv6110a(UINT8 BSCh,float MegaHz=0);
  3289.  UINT8 SetTC90502(UINT8 TS);
  3290.  
  3291.  
  3292.  #endif     //TC90532_H
  3293. +// Fixed by ◆PRY8EAlByw
  3294. +// hyrolean-dtv@yahoo.co.jp
  3295. \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement