Introducción: Audio en segundo plano (aplicaciones de la Tienda de Windows Phone) (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows Runtime. Si estás desarrollando para Windows 10, consulta la documentación más reciente ]

Puedes escribir aplicaciones para Windows Phone 8.1 que reproduzcan audio en segundo plano. Es decir, que después de que el usuario presione el botón Atrás o Inicio del dispositivo, la aplicación puede seguir reproduciendo audio. En este artículo se describen los componentes de una aplicación con audio en segundo plano y cómo funcionan juntos.

Entre los escenarios para reproducir audio en segundo plano encontramos:

  • Listas de reproducción de larga duración El usuario selecciona brevemente una aplicación en primer plano para elegir e iniciar una lista de reproducción. Con ello, el usuario espera que dicha lista de reproducción siga sonando en segundo plano.
  • Uso del conmutador de tareas El usuario abre rápidamente una aplicación en primer plano para iniciar la reproducción de audio y, después, cambia a otra aplicación que ya estaba abierta mediante el conmutador de tareas. El usuario espera que el audio siga reproduciéndose en segundo plano.

Sugerencia  Puedes descargar el código de la muestra de audio en segundo plano para Windows Phone 8.1, que implementa el código que se comenta en esta introducción.

 

Arquitectura del audio en segundo plano

Una aplicación de audio en segundo plano usa agentes en segundo plano. Sin embargo, la forma en que se reproduce audio en segundo plano en Windows Phone 8.1 no es la misma que en Windows 8. El modelo también es diferente de los agentes de audio en segundo plano que se usan en versiones anteriores de Windows Phone.

Importante  

Puedes utilizar JavaScript para escribir aplicaciones de audio en segundo plano No obstante, Windows Phone 8.1 no permite que JavaScript se ejecute en procesos en segundo plano. Esto significa que tu interfaz de usuario y tu aplicación en primer plano pueden escribirse en JavaScript, pero tu tarea en segundo plano debe estar escrita en C# o C++. La muestra de audio en segundo plano para Windows Phone 8.1 proporciona un ejemplo de aplicación de JavaScript que admite el audio en segundo plano mediante el uso de un agente en segundo plano de C#.

 

El espacio de nombres Windows.Media.Playback presenta API genéricas de audio, que se pueden usar para reproducir música, incluso en primer plano, a pesar de que su principal objetivo es reproducir audio en segundo plano. Al usar esta API, existe un solo MediaPlayer global a través del cual se produce toda la reproducción. La aplicación de audio en segundo plano envía comandos al reproductor multimedia para definir la pista actual, iniciar la reproducción, detenerla, avanzar rápidamente, rebobinar, etc. Para estas acciones se llama a los métodos de la clase MediaPlayer. Después, el objeto de instancia del reproductor multimedia, al que se tiene acceso mediante la propiedad BackgroundMediaPlayer.Current, se comunica con el reproductor multimedia global para manipular la reproducción de audio.

No puedes crear nuevas instancias de MediaPlayer.

Usa la clase SystemMediaTransportControls para generar eventos que usará el control de volumen universal (UVC). El UVC es la interfaz de usuario que aparece cuando el usuario de la aplicación presiona el control de volumen en su dispositivo. Los SystemMediaTransportControls se usan para manipular el reproductor multimedia. Además de iniciar la reproducción de audio desde la aplicación, puedes controlar la reproducción de audio. Por ejemplo, usa SystemMediaTransportControls para enviar eventos a IBackgroundTask de tu aplicación y, así, podrás implementar la lógica de lista de reproducción. Se vuelve a tratar la tarea IBackgroundTask más adelante en el tema.

El siguiente diagrama sirve como vista muy sencilla de cómo se diseña el sistema. Una aplicación que reproduce audio en segundo plano está formada por dos procesos. El primero es la aplicación principal, que contiene la interfaz de usuario y está en funcionamiento en primer plano. El segundo es la tarea de reproducción en segundo plano, que contiene la maquinaria de reproducción de audio y, opcionalmente, alguna lógica de aplicación. El sistema operativo suspende o finaliza el proceso en primer plano según sus necesidades de recursos. El proceso en segundo plano sigue en funcionamiento.

Mientras la reproducción de audio se produce en el proceso en segundo plano, el proceso en primer plano tiene acceso a toda la información a través de objetos proxy. El proceso en primer plano puede administrar las propiedades de la instancia de MediaPlayer en el proceso en segundo plano. La aplicación en primer plano puede recibir notificaciones de eventos relacionados con los recursos multimedia como MediaOpened, MediaEnded y MediaFailed. Cuando el proceso en primer plano finaliza o la aplicación se suspende, los archivos multimedia se siguen reproduciendo.

arquitectura del audio en segundo plano

Control de transporte multimedia del sistema

SystemMediaTransportControls es un nuevo conjunto de API introducido en Windows 8.1. Windows Phone 8.1 también implementa esta clase, pero como Windows Phone tiene un solo control de volumen global, tiene la interacción limitada a un proceso a la vez. En el contexto de las API de MediaPlayer, es de extrema importancia definir la instancia y todos los controladores del proceso en segundo plano. Así se garantiza que la conexión esté vinculada al proceso correcto en caso de que la aplicación en primer plano se finalice.

Enviar mensajes de una tarea a otra

En alguna ocasión te interesará que los dos procesos de una aplicación de audio en segundo plano se comuniquen. Por ejemplo, si quieres que la tarea en segundo plano notifique a la tarea en primer plano que se empieza a reproducir una pista nueva y, además, quieres enviar el título de la nueva canción a la tarea en primer plano para que lo muestre en pantalla. Un mecanismo de comunicación sencillo genera eventos tanto en el proceso en primer plano como en el proceso en segundo plano. Los métodos SendMessageToForeground y SendMessageToBackground, cada uno por separado, invocan eventos en la tarea correspondiente. Los datos se pueden transferir como un argumento al controlador de eventos en la tarea destinataria. Los datos se transfieren con una nueva clase llamada ValueSet. Esta clase es un diccionario que contiene una cadena como clave y otros tipos de valor como valores. Puedes transferir tipos de valor sencillos como, por ejemplo, int, string, bool, etc.

Ciclo de vida de tarea en segundo plano

La duración de una tarea en segundo plano está estrechamente ligada a la capacidad de la aplicación de reproducir música. Por ejemplo, cuando un usuario pone en pausa la reproducción de audio, el sistema puede finalizar o cancelar tu aplicación, según las circunstancias.

La tarea en segundo plano se inicia la primera vez que la aplicación accede a BackgroundMediaPlayer.Current en e código de la aplicación en primer plano o al registrar un controlador para el evento MessageReceivedFromBackground, lo que ocurra primero. Para garantizar que se han establecido canales de comunicación al llamar al método IBackgroundTask.Run, debes registrar la propiedad MessageReceivedFromBackground antes de acceder a la propiedad BackgroundMediaPlayer.Current por primera vez. Tu aplicación debe esperar a que tu tarea en segundo plano esté en funcionamiento antes de intentar iniciar una reproducción de audio. Así podrás suscribirte a los eventos multimedia.

Para mantener activa la tarea en segundo plano, tu aplicación tendrá que obtener una tarea BackgroundTaskDeferral en el método Run y llamar a BackgroundTaskDeferral.Complete cuando la instancia de tarea reciba los eventos Canceled o Completed. No esperes en el método Run, ya que consumiría recursos y podría provocar que se finalizara la tarea en segundo plano de tu aplicación.

Tu tarea en segundo plano recibe el evento Completed cuando se completa el método Run y no se solicita aplazamiento. En algunos casos, cuando tu aplicación obtiene el evento Canceled, también puede ir seguido del evento Completed.

Una tarea en segundo plano se puede cancelar en las siguientes situaciones:

  • Se inicia una nueva aplicación con funciones en reproducción de audio.
  • También se ha iniciado una tarea en segundo plano pero aún no hay música en reproducción y, después, la aplicación en primer plano se suspende.
  • Un momento después de que la tarea en segundo plano se haya iniciado, se pone en pausa la reproducción y la aplicación en primer plano se suspende. La causa de la pausa de la reproducción puede ser una acción del usuario u otras interrupciones multimedia como, por ejemplo, llamadas telefónicas entrantes o llamadas VoIP. Si la llamada telefónica o llamada VoIP finaliza en cinco minutos o menos, la aplicación recibirá la notificación Run con el botón SystemMediaTransportControlsButton.Play indicado en los argumentos SystemMediaTransportControlsButtonPressedEventArgs. Si no, el usuario tendrá que iniciar la reproducción de música de forma explícita mediante el UVC. El UVC no pierde su estado. Sin embargo, cuando el usuario presiona el botón Reproducir, se vuelve a iniciar la tarea en segundo plano. A continuación, recibes una llamada del método Run y una notificación SystemMediaTransportControlsButton.Play.

Una tarea en segundo plano se puede finalizar sin advertencia si se dan las siguientes circunstancias:

  • Entra una llamada VoIP y no hay suficiente memoria.
  • Se infringe una directiva de recursos.
  • La cancelación o finalización de la tarea no se realiza correctamente.

Procedimientos recomendados del audio en segundo plano

La canalización multimedia es de naturaleza asincrónica. Es decir, los eventos activados solo garantizan que se produzcan esos eventos, pero no en qué orden. Por ejemplo, cuando la aplicación captura un archivo de audio de un origen remoto, captura también varios eventos de cambio de estado como, por ejemplo, Starting, Paused, Closed, etc. A estos controladores no se les llama necesariamente en el mismo orden cada vez. No te bases en gran medida en los valores CurrentState de tu controlador CurrentStateChanged.

MediaOpened es un evento muy importante y desempeña varias funciones. Si has definido AutoPlay como false y defines un origen para MediaPlayer, seguirás recibiendo MediaOpened. Esto indica que la canalización multimedia se ha iniciado y que tus recursos multimedia están listos para reproducirse. Cuando defines un origen, la reproducción multimedia se inicia automáticamente. No tienes que llamar a Play después de definir el origen. Otra técnica muy buena es iniciar la reproducción de forma explícita cuando los recursos multimedia están preparados. Para ello, se define AutoPlay como false y se llama específicamente a Play en tu controlador MediaOpened.

Puedes llamar a SetUriSource, SetFileSource, SetMediaSource o SetStreamSource para definir el origen multimedia como varios tipos de contenido diferentes. MediaPlayer también tiene la capacidad de reproducir contenido protegido. Además de depender de que se defina un origen de URI, el sistema también depende de objetos de aplicación o de código de aplicación en funcionamiento en la memoria. Además, el proceso en segundo plano no tendrá información sobre la memoria para procesos de la tarea en primer plano. Por lo tanto, asegúrate de haber definido el origen de todos los objetos únicamente en el proceso en segundo plano. Si tu aplicación intenta definir un origen que no sea un URI en el proceso en primer plano, el sistema iniciará una InvalidCastException.

BackgroundMediaPlayer.Shutdown cerrará la canalización multimedia y liberará el objeto MediaPlayer de la memoria. Si vuelves a intentar obtener acceso a una referencia a BackgroundMediaPlayer.Current después de llamar a Shutdown, recibirás un error. La función Shutdown está diseñada para que una aplicación limpie la canalización multimedia cuando su tarea se haya cancelado.

Cuando se suspenda tu aplicación, no te olvides de cancelar la suscripción a los eventos MediaPlayer. De lo contrario, puede que observes actividad no deseada que podría provocar la finalización del proceso en primer plano. Pero no quiere decir que el proceso en primer plano deje de aparecer en el conmutador de tareas ni que el usuario no pueda volver a la aplicación. Cuando tu aplicación se reanude, si aún dispones de una referencia a un MediaPlayer suspendido, se producirá un error si la tarea de audio en segundo plano se ha cancelado y la canalización multimedia se ha cerrado.

Temas relacionados

Muestra de audio en segundo plano para Windows Phone 8.1

Cómo depurar una tarea en segundo plano