Microsoft DirectX 8.0 (Visual Basic)

キャプチャ バッファの使い方

サウンドのキャプチャは、次のステップで構成される。

  1. DirectSoundCaptureBuffer8.Start メソッドを呼び出してバッファリングを開始する。入力デバイスから得たオーディオ データを、バッファの開始位置以降に書き込む。
  2. 希望の量のデータが利用可能になるまで待つ。キャプチャ カーソルが特定の地点に達する時期を決定する方法の 1 つについては、「キャプチャ バッファの通知」を参照すること。
  3. 十分なデータが利用可能になったとき、DirectSoundCaptureBuffer8.ReadBuffer メソッドを呼び出してキャプチャ バッファの一部を読み込む。

    読み込みを試みる部分が、キャプチャに使われようとしているメモリ部分と重なっていないことを確認するには、最初に DirectSoundCaptureBuffer8.GetCurrentPosition を呼び出して現在の読み込みカーソルの位置を取得する。読み込みカーソルについては、「キャプチャ バッファの情報」を参照すること。

  4. 全データのキャプチャが終わるまで、ステップ 2 から 3 を繰り返す。次に、DirectSoundCaptureBuffer8.Stop メソッドを呼び出す。

デフォルトでは、キャプチャ カーソルがバッファの最後に達すると、バッファはキャプチャリングを自動的に停止する。しかし、DirectSoundCaptureBuffer8.Start メソッドに渡す flags パラメータで DSCBSTART_LOOPING フラグを設定した場合は、アプリケーションが DirectSoundCaptureBuffer8.Stop メソッドを呼び出すまでキャプチャは続行される。

キャプチャ カーソルが通知位置に達するたびに、DirectXEvent8 を実装するフォームで次のプロシージャが呼び出される。このプロシージャは、利用可能な新しいデータの量を計算し、中間バッファにコピーしてからファイルに書き込む。

Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)

' 次のグローバル変数を使用する。
' lastPos As Long - キャプチャが開始されるたびに 0 に初期化される。
' BytesWritten As Long – これも 0 に初期化される。
' dscb As DirectSoundCaptureBuffer8
' dscbDesc As DSCBUFFERDESC
' EventStop As Long 
 
  Static curPos As Long
  Static curs As DSCURSORS
  Dim dataBuf() As Byte
  Dim dataSize As Long
  
  dscb.GetCurrentPosition curs
  curPos = curs.lWrite  ' Position up to which data is valid
    
  ' 一時的な中間データ バッファを作成する。
  ' lastPos は Long のグローバル変数であり、キャプチャが開始されるたびに
  ' 0 に初期化される。
  
  dataSize = curPos - lastPos
  If dataSize < 0 Then         ' curPos wrapped around.
    dataSize = dscbDesc.lBufferBytes - lastPos + curPos
  End If
      
  ReDim dataBuf(dataSize - 1)
  dscb.ReadBuffer lastPos, dataSize, dataBuf(0), DSCBLOCK_DEFAULT
  
  Put #1, , dataBuf
  BytesWritten = BytesWritten + dataSize
  lastPos = curPos
  
  If (eventid = EventStop) Then  
    CloseFile
  End If
  
End Sub

通知位置が設定されたときに、EventStop イベントはオフセット DSBPN_OFFSETSTOP に関連付けられている。このイベントはキャプチャ バッファの停止時に通知される。この通知に対して、アプリケーションは、ファイル ヘッダーに情報を追加してファイルを閉じるプロシージャを呼び出す。ウェーブ ファイルにファイル ヘッダーを書き込む方法については、「ウェーブ ファイルへの書き込み」を参照すること。