'09/06/25: HVT-BT200 制御ライブラリをVB6で使ってみる

PCは近くにあるのにTVが近くにない場合など、ネットワーク上のPCでTV放送が見られるように、WebTVと称してBS/地デジチューナー:HVT-BT200→キャプチャカード:MonsterX→エンコーダ:WMEってな形でブロードキャストしている。WebTVという名前の通り、UIはインターネットブラウザを使っているので、クライアントのアクションでチャンネルを変える場合、USBに接続できる赤外線学習リモコン:PC-OP-RS1を使って、それぞれのコマンドをHVT-BT200に送るようにしていた。
もうちょっとスマートにならないかなぁ?と思っていたら、HVT-BT200 Windows XP用ソフトウェアにI-O DATA HVT-BT200 HVT-T100制御ライブラリってのがあったので、さっそくVB6でやってみる(一時期サポートページ上から制御ライブラリの記述が消えていたが、6/25時点では再公開されている)。
まずは宣言部から、
'int HVTBT200_GetCount(int *pDeviceCount);
Public Declare Function HVTBT200_GetCount Lib "HVTBT200.dll" _
(ByVal ptr_iDevCount As Long) As Integer
'int HVTBT200_SetPower(int iNumber, BOOL bPower);
Public Declare Function HVTBT200_SetPower Lib "HVTBT200.dll" _
(ByVal iNumber As Integer, ByVal bPower As Boolean) As Integer
'int HVTBT200_SetChannel(int iNumber, int iChannel);
Public Declare Function HVTBT200_SetChannel Lib "HVTBT200.dll" _
(ByVal iNumber As Integer, ByVal iChannel As Integer) As Integer
'int HVTBT200_GetProgramName(int iNumber, char *pName, int *pSize, int *pChNum);
Public Declare Function HVTBT200_GetProgramName Lib "HVTBT200.dll" _
(ByVal iNumber As Integer, ByVal ptr_bName As Long, ByVal ptr_iSize As Long, ByVal ptr_iChNum As Long) As Integer
'int HVTBT200_GetStatus(int iNumber, BOOL *pPower, BOOL *pTunerLock);
Public Declare Function HVTBT200_GetStatus Lib "HVTBT200.dll" _
(ByVal iNumber As Integer, ByVal ptr_bPower As Long, ByVal ptr_bLock As Long) As Integer
Public Const HVTBT200_NO_ERROR = 0
Public Const HVTBT200_ERR_INIT = -1
Public Const HVTBT200_ERR_NOTFOUND = -2
Public Const HVTBT200_ERR_ALREADY_INIT = -3
Public Const HVTBT200_ERR_SETPOWER = -4
Public Const HVTBT200_ERR_SETCHANNEL = -5
Public Const HVTBT200_ERR_GETPROGRAMNAME = -6
Public Const HVTBT200_ERR_GETSTATUS = -7
Public Const HVTBT200_ERR_GETCOUNT = -8
Public Const HVTBT200_CHANNEL_UP = 0
Public Const HVTBT200_CHANNEL_DOWN = -1
Public Const HVTBT200_NETWORK_DTT = -2
Public Const HVTBT200_NETWORK_BS = -3
引数が変数へのポインタの場合、すべてLong型にしておいて、関数を使うときにVarPtrで目的とする変数のポインタを渡す形。だから、
Private Function GetProgName(ByVal iNumber As Integer, ByRef sName As String, ByRef iChNum As Integer) As Integer
Dim iSize As Integer
Dim sTemp As String
Dim bName() As Byte
'それぞれの変数に対し、記憶領域を確保するために値を代入(不足しないように大きめの)
sTemp = Space(4096)
bName = StrConv(sTemp, vbFromUnicode)
iSize = 32767
iChNum = 32767
'Long引数には変数のポインタを渡す
GetProgName = HVTBT200_GetProgramName(iNumber, VarPtr(bName(0)), VarPtr(iSize), VarPtr(iChNum))
'バイト配列をUnicode指定で文字列に
sName = StrConv(bName, vbUnicode)
sName = Trim(sName)
End Function
などとして、
Private Sub Command2_Click()
Dim iChNum As Integer
Dim sName As String
If GetProgName(1, sName, iChNum) = HVTBT200_NO_ERROR Then
Text1.Text = "Ch." & Format(iChNum, "000") & " - " & sName
Else
Text1.Text = "Error"
End If
End Sub
ってな感じで使える。HVTBT200.dllが原因なのか(?)デバッグ時には必ず「実行時エラー:49 DLLが正しく呼び出せません」が出るので、コンパイルを[ネイティブコード コンパイル]-[最適化なし]にした上でコンパイルして、exeを実行してみないと動くかどうかわからない(^^;。HVT-BT200もPC-OP-RS1と同様に、PCからはシリアルポートとして扱えるので、直接シリアルポート叩いて制御したほうが楽かも?
上記VBサンプルの実行ファイルとソースコード:HVT_VB_Sample.zip:97KB。
いちばん助かったのは、Encoder_OnClientConnect、Encoder_OnClientDisconnectによる電源のOn/Offが的確にできるようになったこと。リモコンだと電源がトグル動作になっていて、リモコン信号を取り逃した場合に対処のしようがなかった(^^;。それと番組情報取得はかなり時間がかかるようなので、Do Loopで関数の返値がHVTBT200_NO_ERRORになるのを待ったほうがいい場合もある。
制御ライブラリがもうちょっと進化して、音声切替や字幕切替をはじめとする付属リモコンで可能な操作を網羅してくれるとありがたい。