WAVE オーディオ デバイス インターフェイス コントロールを VB.NET で使用する際の注意点

WaveIn および WaveOut コントロールは、もともと Visual Basic Version 6.0 で使用するように設計されています。Visual Basic .NET でも使用可能ですが、使用する際にいくつか注意点があります。

データ型の違い

Visual Basic Version 6.0 と Visual Basic .NET では、同じデータ型名であってもビット幅が異なっているものがあります。本サイトのプログラマーズ リファレンスでは、Visual Basic Version 6.0 のデータ型で表記しています。Visual Basic .NET で使用する際には、下記テーブルを参考に、データ型を読み替えてください。

VB6 データ型VB.NET データ型データ幅
IntegerShort (Int16)16 ビット
LongInteger (Int32)32 ビット
データ型の違い

WaveIn.GetData メソッドの互換性

Visual Basic .NET では、WaveIn.GetData メソッドは正しく機能せず、常に 0 データ (無音) を返します。これを回避するには、以下の代替コードでプログラミングしてください。

  1. WaveIn_OnDone イベント プロシージャ内で、WaveIn.GetBufferAddress メソッドを呼び出し、内部バッファーのアドレスを取得します。
  2. 1 で取得したアドレスおよびデータ格納用配列を wifGetDataAny 関数に渡し、録音されたデータを配列にコピーします。
VB
' DLL プロシージャの宣言
Private Declare Auto Function wifGetData Lib "WaveIF.ocx" Alias "wifGetDataAny" (ByVal pDest() As Byte, ByVal pSrc As Integer, ByVal nLen As Integer) As Integer
VB
' WaveIn_OnDone イベント ハンドラ
Private Sub WaveIn_OnDone(ByVal eventSender As System.Object, ByVal eventArgs As AxWaveInterfaceLib._DWaveInEvents_OnDoneEvent) Handles WaveIn.OnDone
    ' データが録音されていれば、
    If (eventArgs.bytesRecorded > 0) Then
        ' バッファーのアドレスを格納する変数。
        Dim pSrc As Integer
        ' バッファーのアドレスを取得します。
        pSrc = WaveIn.GetBufferAddress(eventArgs.bufferIndex)
        ' 録音されたデータを配列にコピーします。
        wifGetData(Buffer, pSrc, eventArgs.bytesRecorded)
        
        ' 録音されたデータの処理
        '...
    End If
End Sub