バックグラウンドで音楽を再生する(前編)
2011年9月2日(金)
次に、いま追加した「Windows Phone オーディオ再生エージェント」テンプレートプロジェクト内の、「AudioPlayer.vb」クラス内にリスト1のコードを記述します。
ロジックコードを記述する
リスト1 (AudioPlayer.vb)
Option Strict On Imports System Microsoft.Phone.BackgroundAudio名前空間は、他のアプリケーションがフォアグラウンドで実行している間に、バックグラウンドでのオーディオ再生機能を提供するクラスを含む名前空間です。 Imports Microsoft.Phone.BackgroundAudio System.Collection.Generic名前空間には、ジェネリックコレクションを定義するインターフェースとクラスが含まれています。 Imports System.Collections.Generic Public Class AudioPlayer Inherits AudioPlayerAgent Shared変数currentIndexを宣言します。この変数は現在のトラック数を保持します。 Shared currentIndex As Integer = 0
AudioTrackクラス型のリストであるMusicList関数を定義します。
AudioTrackクラス型の新しいリストであるseilList変数を宣言します。AudioTrackクラスはオーディオの1つのトラックを表すクラスです。 AddメソッドでAudioTrackのコンストラクタにパラメータを指定していきます。AudioTrackのコンストラクタの書式は下記の通りです。UIで使用される画像のパスには、画像を配置しているImageフォルダを連結しています。 New AudioTrack(トラックへのURIパス、ストリーミングを使用する場合は UriKind 値を指定します,トラックのTitle,トラックのArtist名,トラックのAlbum名,UIで使用される画像のURIパス) Private Function MusicList() As List(Of AudioTrack) Dim seiList As New List(Of AudioTrack) seiList.Add(New AudioTrack(New Uri("AGAIN_Trial.wav", UriKind.Relative), "AGAIN", "Sei", "SeiCollection", New Uri("Image/cherry1.jpg", UriKind.Relative))) seiList.Add(New AudioTrack(New Uri("DontCryMama_Trial.wav", UriKind.Relative), "Don't Cry,Mama", "Sei", "SeiCollection", New Uri("Image/cherry2.jpg", UriKind.Relative))) seiList.Add(New AudioTrack(New Uri("SambaDeOpacidade_Trial.wav", UriKind.Relative), "Samba De Opacidade", "Sei", "SeiCollection", New Uri("Image/cherry3.jpg", UriKind.Relative))) seiList.Add(New AudioTrack(New Uri("TheGreenBells_Trial.wav", UriKind.Relative), "The Green Bells", "Sei", "SeiCollection", New Uri("Image/cherry4.jpg", UriKind.Relative))) Return seiList End Function
BackgroundAudioPlayer型のplayerを引数としたPlayTrackプロシージャ
BackgroundAudioPlayerクラスは、再生、一時停止、早送り、および巻き戻しなどのオーディオ再生機能に、バックグラウンドでアクセスするための機能を提供するクラスです。 BackgroundAudioPlayerのTrackプロパティに、currentIndex変数に該当するMusicListを指定します。Volumeには1を指定します。0~1の間の値を指定できます。 Private Sub PlayTrack(player As BackgroundAudioPlayer) player.Track = MusicList(currentIndex) player.Volume = 1 End Sub
次の曲を再生する処理
現在のトラック数を保持する変数currentIndexの値が、全曲の数と同じか、全曲の数より大きかった場合は、currentIndexの値を0で初期化します。currentIndexは0から開始するため、全曲の数は-1した値になります。currentIndexの値が全曲の数より小さい間は、currentIndexの値を1ずつ増加します。PlayTrackプロシージャを実行します。最後の曲まで再生されると、先頭の曲に移動します。 Private Sub PlayNext(player As BackgroundAudioPlayer) If currentIndex >= MusicList.Count - 1 Then currentIndex = 0 Else currentIndex = Math.Min(currentIndex + 1, MusicList.Count - 1) End If PlayTrack(player) End Sub
前の曲を再生する処理
currentIndexの値が0か0より小さい場合は、currentIndexは全曲の数で初期化します。 currentIndexの値が0より大きい場合は1ずつ減算します。PlayTrackプロシージャを実行します。先頭の曲まで再生されると、最後の曲に移動します。 Private Sub PlayPrev(Player As BackgroundAudioPlayer) If currentIndex <= 0 Then currentIndex = MusicList.Count - 1 Else currentIndex = Math.Max(currentIndex - 1, 0) End If PlayTrack(Player) End Sub
再生状態が変更された時に呼び出される、OnPlayStateChangedイベントをオーバーライドする処理
再生状態によって条件分岐します。トラックの再生準備ができている場合(PlayState.TrackReady)は、再生を実行します。 最後まで音楽が再生し終わった時(PlayState.TrackEnded)は、次の曲に移ります。 Protected Overrides Sub OnPlayStateChanged(player As BackgroundAudioPlayer, track As AudioTrack, playState As PlayState) MyBase.OnPlayStateChanged(player, track, playState) Select Case (playState) Case Microsoft.Phone.BackgroundAudio.PlayState.TrackReady player.Play() Exit Select Case Microsoft.Phone.BackgroundAudio.PlayState.TrackEnded PlayNext(player) Exit Select End Select NotifyComplete() End Sub
ユーザーがアプリケーションのUIを使用してアクションを要求し、アプリケーションがアクションの通知を要求した際に呼び出される、OnUserActionをオーバーライドする処理
ユーザーのアクションによって条件分岐を行います。 Playで、再生または再生を再開します。Pauseで再生を一時停止します。SkipPreviousで前のトラックにスキップします。SkipNextで次のトラックにスキップします。 Protected Overrides Sub OnUserAction(player As BackgroundAudioPlayer, track As AudioTrack, action As UserAction, param As Object) Select Case action Case UserAction.Play PlayTrack(player) Exit Select Case UserAction.Pause player.Pause() Exit Select Case UserAction.SkipPrevious PlayPrev(player) Exit Select Case UserAction.SkipNext PlayNext(player) Exit Select End Select NotifyComplete() End Sub
自動的に追加されたコード
追加するコードはありません。 Protected Overrides Sub OnError(player As BackgroundAudioPlayer, track As AudioTrack, [error] As System.Exception, isFatal As Boolean) MyBase.OnError(player, track, [error], isFatal) 'TODO: Add code to handle error conditions NotifyComplete() End Sub
自動的に追加されたコード
追加するコードはありません。 Protected Overrides Sub OnCancel() MyBase.OnCancel() NotifyComplete() End Sub End Class
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- 翻訳された英文の表示と読み上げ
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- パノラマページを作成する(後編)
- Bing APIを使ってWeb検索とImage検索を実装する
- 場所と写真を記録するプログラムを作って思い出のシーンを保存しよう
- データ保存・bing検索・簡易縦書き機能の実装
- ContextMenuコントロールを使う、加速度センサー、GPSでの位置情報取得
- LaunchersとChoosersを使ってみる
- 撮影した写真の管理ができるマイフォトアプリを作る
- ShareLinkTaskを使ったSNSでのリンク共有とHubTileのサンプル