[WP7] Mango : créer une application de streaming Radio avec AudioPlayerAgent

Le 8 août 2011 à 20:42

Actuellement sous WP7 Nodo, lorsque vous utilisez une application autre que Zune pour la lecture audio (application radio, Deezer, application GPS… etc) l’audio s’arrête à partir du moment où vous switchez sur une autre application : elle ne continue  donc pas de jouer en background.

Avec Mango, il est désormais possible de le faire. Pour cela, il faut utiliser un Agent disponible sur le dernier SDK 7.1 : AudioPlayerAgent. Cet agent va nous permettre de contrôler ce qui va être jouer et d’interagir selon ce que l’utilisateur va faire (boutons lecture/pause, morceau précédent/suivant) et ce qu’on va afficher (titre, nom de l’album, image de l’album… etc).

Ici, je vais créer une mini application (simple) de streaming d’une radio. Bien entendu il pourrait être complexifié pour y ajouter le contrôle de plusieurs flux de radio. Mais en voyant l’exemple, vous comprendrez que c’est très facilement adaptable :).

Pour commencer, on va créer une application WP7.1, puis on va y ajouter un projet Windows Phone Audio Playback Agent :

image

Le template va nous créer une classe qu’on va compléter. Cette classe dérive de AudioPlayerAgent. La classe surcharge les méthodes OnPlayStateChanged (à chaque fois qu’on change l’état du track), OnUserAction (quand l’utilisateur appuie sur un bouton) et OnError (quand une exception est déclenché).

Il faut savoir qu’une source de flux est définie par la classe AudioTrack.
On va déjà définir un AudioTrack pointant vers notre flux radio (ici France Info):

private static readonly AudioTrack Track =
    new AudioTrack(
     new Uri(@"http://mp3.live.tv-radio.com/franceinfo/all/franceinfo.mp3", UriKind.Absolute),
     "France Info live", "France Info", "France Info podcast", null, null, 
     EnabledPlayerControls.Pause);

 

EnabledPlayerControls va nous permettre de choisir les actions qui seront possibles pour l’utilisateur, ici j’ai désactivé la possible de faire suivant et précédent.
Maintenant on va écrire le code de la méthode surchagée OnUserAction. Cela nous permettra selon l’action demandé de mettre en pause le flux ou de le lire, selon ce que l’utilisateur a souhaité faire :

protected override void OnUserAction(BackgroundAudioPlayer player,
AudioTrack track, UserAction action, object param)
{
    switch (action)
    {
        case UserAction.Play:
            if (PlayState.Paused == player.PlayerState)
            {
                player.Play();
            }
            else
            {
                player.Track = Track;
            }
            break;

        case UserAction.Pause:
            player.Pause();
            break;
    }
    
    NotifyComplete();
}

 

Maintenant on va s’occupé de la méthode OnPlayStateChanged, qui va nous permettre d’éffectuer des actions selon le Playstate :

switch (playState)
{
    case PlayState.TrackReady:
        player.Play();
        break;
}

NotifyComplete();

 

Et voila, c’est quasiment terminé pour notre agent !

Du côté du projet WP7, pour pouvoir manipuler l’agent, il suffit d’utiliser la classe BackgroundAudioPlayer :

Pour lire :

BackgroundAudioPlayer.Instance.Play();

 

Pour supprimer la lecture :

BackgroundAudioPlayer.Instance.Close();

 

P1040263-(1)

 

Lorsque vous serez sur le home screen, vous aurez l’information de la lecture en cours, et lorsque vous serez sur l’accueil et que vous utilisez les boutons de volume, vous aurez également l’information du morceau en cours. 

Pour télécharger les sources, c’est par ici.
A bientôt !

Ajouter un commentaire

biuquote
  • Commentaire
  • Prévisualiser
Loading

A propos de l'auteur

Mathieu Perrein est Software Solutions Architect, Microsoft Student Partner de 2010 à 2012.

 

MSP

 

MSP

MSP

 MSPD

MCT

 

Facebook

 

Ce blog est strictement personnel et les opinions exprimées ici n'engagent donc que moi, et pas mon employeur.

Tags

Vous avez désactivé JavaScript ou bien vous possédez une ancienne version d'Adobe Flash Player. Téléchargez la dernière version de Flash Player.