ロジック・コードの記述
以上を踏まえて、ロジック・コード(MainPage.xaml.vb)を記述していきます。
名前空間の読み込み
入出力を可能にする、System.IO名前空間をインポートしておきます。
1 | <!--//--><![CDATA[// ><!-- |
クラスの作成
Silverlightでオーディオ情報を取得するには、AudioSinkからカスタムオーディオシンクを派生させ、AudioSink.CaptureSource からオーディオ情報を受け取ります。そこで、「Inherits System.Windows.Media.AudioSink」と入力します。すると、下記のOnCaptureStarted、OnCaptureStopped、OnFormatChange、OnSamples メソッドのコードの大半が、自動的に追加されます。基本的な処理だけであれば、必要な作業は、パラメータや多少のコードを変更したり追加する程度です。
OnCaptureStartedメソッドは、オーディオ・データのキャプチャを開始した時に呼び出されます。この時点で、新規MemoryStreamを生成しておきます。MemoryStreamの引数に、内部配列のサイズを指定して初期化する場合は、32bit型整数を指定します。
OnCaptureStoppedは停止した時に、OnFormatChangeは、オーディオ形式が変更された時に、呼び出されます。ただし、オーディオのキャプチャを開始すると、OnFormatChangeが、最初のキャプチャに対して1回以上呼び出されることになっています。そこで、OnFormatChangeで取得するオーディオ形式を利用します。
OnSamplesは、オーディオ・サンプルのキャプチャを完了したときに呼び出されます。Stream.Writeメソッドに引数を指定してストリームに書き込みます。
01 | <!--//--><![CDATA[// ><!-- |
03 | Public Class savePcmDataClass |
04 | Inherits System.Windows.Media.AudioSink |
06 | Dim myStream As MemoryStream |
07 | Dim myFormat As AudioFormat |
09 | Protected Overrides Sub OnCaptureStarted() |
10 | myStream = New MemoryStream() |
13 | Protected Overrides Sub OnCaptureStopped() |
16 | Protected Overrides Sub OnFormatChange(ByVal audioFormat As System.Windows.Media.AudioFormat) |
17 | myFormat = audioFormat |
20 | Protected Overrides Sub OnSamples(ByVal sampleTime As Long, ByVal sampleDuration As Long, ByVal sampleData() As Byte) |
21 | myStream.Write(sampleData, 0, sampleData.Length) |
音声データを生成するには、ストリームとフォーマット形式を取得しておく必要があるので、上記に続けて、次の処理を記述します。
01 | <!--//--><![CDATA[// ><!-- |
03 | Public ReadOnly Property myAudioDataForSave() As Stream |
09 | Public ReadOnly Property myFormatForSave() As AudioFormat |
変数の宣言
キャプチャの開始と停止に利用する、新規CaptureSourceを宣言します。CaptureSource は、オーディオキャプチャを、オーディオキャプチャ・デバイスから利用するために使うクラスです。また、先に作成したクラスを録音と保存の際に利用するため宣言しておきます。
01 | <!--//--><![CDATA[// ><!-- |
03 | Partial Public Class MainPage<br /> |
10 | Dim recordingSound As New CaptureSource |
11 | Dim myCreateData As New savePcmDataClass |
ページがロードされた時の処理
CaptureDeviceConfiguration を用いて、システムで利用可能なオーディオデバイスの情報を取得し、デバイスからキャプチャにアクセスする際の、アクセス許可を与えます。GetAvailableAudioCaptureDevices で、システム上で利用可能なオーディオデバイスのコレクションを取得します。
1 | <!--//--><![CDATA[// ><!-- |
3 | Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded |
4 | recordingSound.AudioCaptureDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice |
[録音]ボタンがクリックされた時の処理
「録音」「停止」「保存」の3つのボタンをクリックした時の処理を、順次記述していきます。あらかじめ、各々のボタンについて、MainPage.xaml.vbの「MainPage」と「Declarations」を選択して、イベントのコードを追加しておきます(図6)。

|
図6:MainPage.xaml.vbの画面で、3つのボタンについてイベントを追加しておく(クリックで拡大) |
まず、「録音」ボタンがクリックされた時の処理を記述します。
このサンプルは、Trustedモードのアウト・オブ・ブラウザで実行させますので、インストールを促すメッセージを表示します。
先に作成したCaptureSourceに、オーディオをキャプチャします。CaptureSource.Startメソッドで、キャプチャを開始します。
'■「録音ボタン」がクリックされた時の処理
01 | <!--//--><
|
図7:Trustedモードを指定しない場合は、アクセス許可の確認メッセージが表示される(クリックで拡大) |
[停止]ボタンがクリックされた時の処理
「停止」ボタンがクリックされた時は、CaptureSource.Stop メソッドで、キャプチャデバイスからのキャプチャを停止します。
'■「停止ボタン」がクリックされた時の処理
01 | <!--//--><![CDATA[// ><!-- |
03 | Private Sub StopButton_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles StopButton.Click |
05 | TextBlock.Text = "録音中断しました" |
06 | StopButton.IsEnabled = False |
07 | SaveButton.IsEnabled = True |
[保存]ボタンがクリックされた時の処理
最後に「保存」ボタンがクリックされた時の処理を記述します。このサンプルでは、拡張子はwavとして保存しますので、ファイルの種類を決定するフィルター文字列に"Audio Files (*.wav)|*.wav"を指定して、新しいファイルダイアログを開きます。
音声データの入出力には、文字列用のStreamWriterではなく、バイトの入出力用のStream クラスを使います。
キャプチャしたデータをもとに、PCM形式のデータを生成する処理を実行します。この生成処理は、取得した多数のデータを利用するため、引数を渡して別プロシジャ(後述のsaveMyDataプロシジャ)として記述します。
'■「保存ボタン」がクリックされた時の処理
01 | <!--//--><
|
図8:正しいデータを生成できていない場合は、再生時にメッセージが表示される |
次回は、センサーから入力されたデータの取得と利用について紹介します。