Windows Phone provee una plataforma multimedia robusta que permite aplicaciones a hacer streaming de video y audio, manejo del radio, y la integración con el Hub de música y videos. En la lección de este día, te mostrare la forma como obtener input de audio utilizando el micrófono del Windows Phone con aplicaciones Silverlight usando la clase Microsoft.Xna.Framework.Audio.Microphone.
-
Ejecuta Visual Studio 2010 Express para Windows Phone.
-
Crea un nuevo proyecto seleccionando haciendo clic en Archivo | Nuevo Proyecto
-
La ventana de Nuevo Proyecto aparece. Expande las plantillas de Visual C#, y selecciona la plantilla Silverlight para Windows Phone.
-
Ahora selecciona la plantilla Aplicación Windows Phone. Coloca de nombre de proyecto tu preferencia.
-
Da clic a OK. La ventana de selección de plataforma Windows Phone aparece. Selecciona Windows Phone OS 7.1 para la versión de Windows Phone objetivo.
-
Da clic a OK. El proyecto nuevo es creado y se despliega el archivo MainPage.xaml en el diseñador de Visual Studio.
-
En el Solution Explorer, da un clic derecho a References -> Add Reference…
-
Agrega la librería Microsoft.Xna.Framework de la lista de componentes .NET y da clic a OK.
-
Si ves un dialogo advirtiéndote acerca de agregar assembly de Silverlight, da clic en Yes.
-
Agrega las siguientes directivas en el archivo MainPage.xaml.cs
using System.IO; using System.Windows.Threading; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio;
-
En MainPage.xaml.cs, declara las siguientes variables globales en tu clase MainPage
public partial class MainPage : PhoneApplicationPage { Microphone microphone = Microphone.Default; byte[] buffer; MemoryStream stream = new MemoryStream(); SoundEffect sound; // ... -
Ya que estamos usando XNA Game Studio en una aplicación Silverlight, debemos simular el Game Loop que XNA implementa por nosotros. Agrega el siguiente código en el constructor de la clase MainPage después de la llamada InitializeComponent para simular el Game Loop de XNA:
// Timer to simulate the XNA Game Studio game loop (Microphone is from XNA Game Studio) DispatcherTimer dt = new DispatcherTimer(); dt.Interval = TimeSpan.FromMilliseconds(50); dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; dt.Start(); -
Ahora agrega un manejador de evento Microsoft.BufferReady en el constructor de la clase MainPage:
microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
Tu declaración de variables y eventos del constructor se deberá ver algo como esto:
public partial class MainPage : PhoneApplicationPage { Microphone microphone = Microphone.Default; byte[] buffer; MemoryStream stream = new MemoryStream(); SoundEffect sound; // Constructor public MainPage() { InitializeComponent(); // Timer to simulate the XNA Game Studio game loop (Microphone is from XNA Game Studio) DispatcherTimer dt = new DispatcherTimer(); dt.Interval = TimeSpan.FromMilliseconds(33); dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; dt.Start(); microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady); } ... -
Implementa el manejador de evento BufferReady. Este manejador copia los datos del micrófono a un buffer y escribe ese buffer a un stream:
void microphone_BufferReady(object sender, EventArgs e) { microphone.GetData(buffer); stream.Write(buffer, 0, buffer.Length); } -
Ahora agrega una manera que el usuario pueda activar el micrófono para captar audio. Puedes agregar un botón Start (nombrado recordButton) donde este crea un buffer de 1 segundo y empieza a coleccionar datos llamando al método Microphone.Start.
private void recordButton_Click(object sender, RoutedEventArgs e) { microphone.BufferDuration = TimeSpan.FromMilliseconds(1000); buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; microphone.Start(); } -
Agrega una manera para que el usuario pueda detener la captura de audio del micrófono. Puedes agregar un botón Stop (nombrado stopButton), y agregarle un manejador de evento clic, donde este chequea si el estado del micrófono esta activo, lo detiene.
private void stopButton_Click(object sender, RoutedEventArgs e) { if (microphone.State == MicrophoneState.Started) { microphone.Stop(); } } -
Finalmente, agrega un botón para que el usuario pueda reproducir la grabación capturada por el micrófono. Agrégale un manejador de evento Clic, donde este instancia un nuevo objeto SoundEffect usando el stream de donde los datos de audio fueron guardados. Luego, se invoca SoundEffect.Play para reproducir la grabación.
private void playButton_Click(object sender, RoutedEventArgs e) { sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono); sound.Play(); }
Observa que con unos cuantos pasos, puedes acceder al micrófono para hacer cualquier cantidad de cosas que desees implementar en tu aplicación.
Fuente:
How to: Acces the Microphone in a Silverlight Application for Windows Phone
