none
Problema con el valor de una variable global + BackgroundAgent RRS feed

  • Pregunta

  • Buenas a toda la comunidad. Estoy intentando hacer una pequeña radio que obtiene las tracks de internet en vivo y que funcione en segundo plano. Siguiendo ejemplos de Microsoft, he llegado creado una lista de las tracks. El problema es el siguiente: intento usar una variable publica declarada en mi agente de audio en segundo plano:

    AudioPlayer.cs
    
    using System;
    using System.Windows;
    using Microsoft.Phone.BackgroundAudio;
    using System.Collections.Generic; 
    
    namespace BackgroundStreamer
    {
        public class AudioPlayer : AudioPlayerAgent
        {	
    		public static int ActualPage {get; set;} 	
    			
    		public AudioPlayer()
            {	
                if (!_classInitialized)
                {
                    _classInitialized = true;
                    Deployment.Current.Dispatcher.BeginInvoke(delegate
                    {
                        Application.Current.UnhandledException += AudioPlayer_UnhandledException;
                    });
                }
            }
    		
            private static volatile bool _classInitialized;
    		
            // PLAYSLIST
            private static List<AudioTrack> _playList = new List<AudioTrack>
            {
                new AudioTrack(new Uri("http://194.169.201.177:8085/radio0.mp3", UriKind.Absolute), 
                        "Radio 0", null, null, null),
    				
    			new AudioTrack(new Uri("http://194.169.201.177:8085/radio1.mp3", UriKind.Absolute), 
                        "Radio 1", null, null, null),	
    				
    			new AudioTrack(new Uri("http://194.169.201.177:8085/radio2.mp3", UriKind.Absolute), 
                        "Radio 2", null, null, null)
    		};
    
    
    		
            private void PlayTrack(BackgroundAudioPlayer player)
    		{
    				player.Track = _playList[ActualPage];
    		}
    
    
            protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
            {
                switch (playState)
                    {
                        case PlayState.TrackReady:
                            player.Play();
                            break;
                    }
    
                NotifyComplete();
            }
    
            protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
            {
                switch (action)
                {
                    case UserAction.Play:
                        PlayTrack(player);
                        break;
    
                    case UserAction.Pause:
                        player.Pause();
                        break;
                }
    
                NotifyComplete();
            }
    
            private void AudioPlayer_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    System.Diagnostics.Debugger.Break();
                }
            }
    
            protected override void OnError(BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal)
            {
                if (isFatal)
                {
                    Abort();
                }
                else
                {
                    NotifyComplete();
                }
            }
            protected override void OnCancel()
            {
    
            }		
    	}
    }

    Como podéis, public static int ActualPage {get; set;} es la variable que pretendo declarar y a la vez usar para seleccionar la track que quiero reproducir en cada caso desde: 

    private void PlayTrack(BackgroundAudioPlayer player)
    		{
    				player.Track = _playList[ActualPage];
    		}

    El problema viene cuando intento asignarle un valor a la variable desde una de las pages que reproducirá una de las radios. 3 pages que reproducen 3 sources de radio diferentes. Aquí podéis ver la primera page que debería reproducir la primera track.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.BackgroundAudio;
    using Microsoft.Phone.Shell;
    using BackgroundStreamer;
    
    
    namespace Radio.Samples
    {		
        public partial class sample : PhoneApplicationPage
        {		
    		public sample()
            {	
                BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);
    			//BackgroundStreamer.AudioPlayer.ActualPage = 0;
    			InitializeComponent();
            }
    
            #region Button Click Event Handlers
    
    		
    		private void PlayPause_Click(object sender, System.EventArgs e)
            {
    			ApplicationBarIconButton PlayPause = (ApplicationBarIconButton)ApplicationBar.Buttons[0];
    			
    			
    			if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
                {
                    BackgroundAudioPlayer.Instance.Pause();
    				PlayPause.IconUri = new Uri("/icons/appbar.transport.play.rest.png", UriKind.Relative);
    				PlayPause.Text="play";
    
                }
                else
                {
                    BackgroundAudioPlayer.Instance.Play();
    				PlayPause.IconUri = new Uri("/icons/appbar.transport.pause.rest.png", UriKind.Relative);
    				PlayPause.Text="pause";
                }
            }
    
            #endregion Button Click Event Handlers
    		
    		protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {	
    			//BackgroundStreamer.AudioPlayer.ActualPage = 0;
            }
    
                else if(null != BackgroundAudioPlayer.Instance.Track)
                {
                    //txtCurrentTrack.Text = "Estás escuchando:  " + BackgroundAudioPlayer.Instance.Track.Title;
    				//Loading.Opacity = 1.0;
                }
            }
        }
    }

    Como podéis ver en forma de comentarios he intentado asignar un valor al int que tenia como variable: BackgroundStreamer.AudioPlayer.ActualPage = 0; en el OnNavigationTo, en el public sample, e incluso en el onClick de mi botón de play-pause. La aplicación o se me ROMPE al navegar a la página sample o NO REPRODUCE NINGUNA TRACK o REPRODUCE LA QUE QUIERE. Lo que me pierde es que no me da error alguno al compilar...

    Muchas gracias! A ver si alguien me puede iluminar un poco .P

    domingo, 17 de junio de 2012 22:51

Respuestas

Todas las respuestas