Microsoft DirectX 8.0 (Visual Basic) |
サウンドのキャプチャは、次のステップで構成される。
読み込みを試みる部分が、キャプチャに使われようとしているメモリ部分と重なっていないことを確認するには、最初に DirectSoundCaptureBuffer8.GetCurrentPosition を呼び出して現在の読み込みカーソルの位置を取得する。読み込みカーソルについては、「キャプチャ バッファの情報」を参照すること。
デフォルトでは、キャプチャ カーソルがバッファの最後に達すると、バッファはキャプチャリングを自動的に停止する。しかし、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 に関連付けられている。このイベントはキャプチャ バッファの停止時に通知される。この通知に対して、アプリケーションは、ファイル ヘッダーに情報を追加してファイルを閉じるプロシージャを呼び出す。ウェーブ ファイルにファイル ヘッダーを書き込む方法については、「ウェーブ ファイルへの書き込み」を参照すること。