Generation App – Día 19 – El micrófono con Silverlight/XNA

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.

  1. Ejecuta Visual Studio 2010 Express para Windows Phone.

  2. Crea un nuevo proyecto seleccionando haciendo clic en Archivo | Nuevo Proyecto

  3. La ventana de Nuevo Proyecto aparece. Expande las plantillas de Visual C#, y selecciona la plantilla Silverlight para Windows Phone.

  4. Ahora selecciona la plantilla Aplicación Windows Phone. Coloca de nombre de proyecto tu preferencia.

  5. 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.

  6. Da clic a OK. El proyecto nuevo es creado y se despliega el archivo MainPage.xamlen el diseñador de Visual Studio.

  7. En el Solution Explorer, da un clic derecho a References -> Add Reference…

  8. Agrega la librería Microsoft.Xna.Framework de la lista de componentes .NET y da clic a OK.

  9. Si ves un dialogo advirtiéndote acerca de agregar assembly de Silverlight, da clic enYes.

  10. 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;
  11. 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; 
        // ...
  12. 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 InitializeComponentpara 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();
  13. 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);
        } 
        ...
  14. 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);
    }
  15. 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étodoMicrophone.Start.

    private void recordButton_Click(object sender, RoutedEventArgs e)
    {
        microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
        buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
        microphone.Start();
    }
  16. 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();
        }
    }
  17. 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.

Autor: Jorge Ramirez     Síguelo en twitter @JorgeRamirezMSP
Publicación original –> http://j.mp/13g5OWR
Fuente 1 –> http://j.mp/VC11dM

Anuncios

1 comentario

Archivado bajo Windows Phone

Una respuesta a “Generation App – Día 19 – El micrófono con Silverlight/XNA

  1. Pingback: Con Generation App nunca fue tan fácil desarrollar para Windows Phone « El Blog de MSP para Latinoamerica [BETA]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s