バックグラウンドで音楽を再生する(前編)

2011年9月2日(金)
PROJECT KySS

次に、いま追加した「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

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています