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

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30