17

Jan

I servizi di background audio in Windows Phone Mango: realizziamo un player multimediale – L’applicazione

Nel post precedente abbiamo gettato le basi necessarie per capire come implementare i servizi di background audio in un’applicazione Windows Phone. In questo vedremo concretamente come realizzare un player multimediale, che farà uso di un background agent che ci permetterà di ascoltare la musica anche ad applicazione chiusa.

Prepariamo il terreno

Se ricordate quanto detto nel post precedente, le applicazioni Windows Phone sono in grado di manipolare oggetti di tipo AudioTrack, che rappresentano i nostri brani. Il file musicale vero e proprio può essere memorizzato in due posizioni diverse: su un server web oppure nell’Isolated Storage. Per la demo che andremo a realizzare, memorizzeremo le tracce su un server web locale: per tale scopo, avremo bisogno di IIS installato sulla nostra macchina o, in alternativa, di creare un progetto web nel quale includeremo i nostri file, il quale verrà ospitato da IIS Express.

Dato che non tutti potrebbero avere IIS a portata di mano, procederemo con la seconda strada: apriamo Visual Studio e creiamo un progetto di tipo ASP.NET Empty Web Application. Ora copiamo al suo interno alcuni MP3 (l’esempio che trovate in allegato al post ne contiene tre non protetti da copyright, quindi potete usare quelli se volete), dopodichè facciamo clic con il tasto destro sul progetto e scegliamo Use IIS Express (vi ricordo che per sfruttare IIS Express e avere a disposizione questa opzione dovete avere installato il SP1 di Visual Studio 2010).

Notiamo l’indirizzo che verrà assegnato al nostro sito da IIS Express: per verificare che tutto stia funzionando correttamente, inseriamo nel nostro browser l’URL per raggiungere uno degli MP3 (ad esempio, http://localhost:3891/FirstTrack.mp3). Se tutto è andato a buon fine, il browser dovrebbe trovare il file e iniziare la riproduzione o il download.

Ora siamo pronti per realizzare l’applicazione vera e propria.

L’applicazione Windows Phone

Come spiegato nel post precedente, tutta la logica di riproduzione è contenuta nel background agent: quello che perciò andremo a fare nella nostra applicazione è semplicemente dare all’utente la possibilità di avviare la riproduzione, nonchè cambiare le informazioni visualizzate a video a seconda della traccia corrente.

Aggiungiamo alla soluzione che abbiamo creato un nuovo progetto di tipo Windows Phone e iniziamo a costruire, nel file MainPage.xaml, l’interfaccia della nostra applicazione:


      
      

Abbiamo inserito un pulsante per gestire la riproduzione e una serie di TextBlock, in cui visualizzeremo le informazioni sulla traccia correntemente in riproduzione. Vediamo ora la logica dietro a questa interfaccia:

public partial class MainPage : PhoneApplicationPage
      {
      private BackgroundAudioPlayer player;

      // Constructor
      public MainPage()
      {
      InitializeComponent();
      player = BackgroundAudioPlayer.Instance;
      player.PlayStateChanged += new EventHandler(player_PlayStateChanged);
      }

      private void btnPlay_Click(object sender, RoutedEventArgs e)
      {
      player.Play();
      }

      void player_PlayStateChanged(object sender, EventArgs e)
      {
      if (player.PlayerState == PlayState.Playing)
      Dispatcher.BeginInvoke(() => btnPlay.Content = "Pause");
      else
      Dispatcher.BeginInvoke(() => btnPlay.Content = "Play");

      if (player.PlayerState == PlayState.Playing)
      {

      Dispatcher.BeginInvoke(() =>
      {
      txtTitle.Text = player.Track.Title;
      txtArtist.Text = player.Track.Artist;
      txtAlbum.Text = player.Track.Album;
      });
      }
      }
      }

Come vedete, mancando tutta la logica di riproduzione, il codice non è molto lungo e complesso.

  • In fase di inizializzazione della view, recuperiamo l’istanza corrente del player audio in background. Essendoci un’unica istanza condivisa in tutta l’applicazione, non ne viene creata una nuova ma si recupera quella esistente tramite la classe BackgroundAudioPlayer.
  • Sottoscriviamo l’evento PlayStateChanged, che viene scatenato ogni qualvolta lo stato della riproduzione cambia.
  • Al click sul pulsante, lanciamo il comando Play, che avvia la riproduzione vera e propria, la quale verrà gestita però dal background agent.

A confermare quanto dicevamo prima, possiamo notare che nell’evento player_PlayStateChanged andiamo solo a gestire aspetti legati alla UI: cambiamo il testo del pulsante a seconda se il player è in pausa o in riproduzione e andiamo a valorizzare i vari TextBlock con le informazioni contenute nella proprietà Track dell’oggetto di tipo BackgroundAudioPlayer (che contiene per l’appunto l’oggetto AudioTrack correntemente in riproduzione).

Notate l’uso del Dispatcher, dato che l’evento PlayStateChanged viene eseguito in un thread separato da quello che gestisce la UI.

Il background agent

Se provate ad eseguire l’applicazione, non succederà niente: questo perchè manca il background agent con tutta la logica di riproduzione, che andremo a realizzare nel post successivo. Stay tuned!

by Il blog di Matteo Pagani on 1/17/2012
Post archive