En este post vamos a ver como utilizar el micrófono que viene en todos los teléfonos de Windows Phone, lo vamos a ver desde la perspectiva de un proyecto Silverlight ya que en XNA es distinto, para empezar debemos de añadir a nuestro proyecto el assembly Microsoft.Xna.Framework y recordar tal y como vimos en el post Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone añadir la clase XNADispatcher , el assembly Microsoft.Xna.Framework y en el App.xaml activarlo
1 <Application.ApplicationLifetimeObjects>
2 <local:XNADispatcher DispatchIntervalInMilliseconds="50"/>
3 <!--Required object that handles lifetime events for the application-->
4 <shell:PhoneApplicationService
5 Launching="Application_Launching" Closing="Application_Closing"
6 Activated="Application_Activated" Deactivated="Application_Deactivated"/>
7 </Application.ApplicationLifetimeObjects>
El porque y contenido de la clase ya fue explicado en el post anterior así que vamos a pasar directamente a como podemos utilizar el micrófono dentro de nuestro windows phone, para su utilización se nos provee de la clase Microphone ubicada en el assembly Microsoft.Xna.Framework con el método Start empezar a escuchar y Stop para parar de escuchar, cuando activamos el micrófono la señal nos llega a través del evento BufferReady que tenemos que estar escuchando y cuando termine transforma esta señal a un archivo reproducible por ejemplo de tipo wav.
Para ver como lo realizamos vamos a mostrar una aplicación con tres botones de start, stop y play, no los voy a esconder, ni mostrar mensajes de que botón esta en ese momento, el objetivo de este programa es ver como recogemos la entrada del micrófono , la guardamos en nuestro teléfono como un archivo de tipo wav y la reproducimos, a partir de ahí vuestra imaginación para ampliarla y mejorarla . Tampoco voy a utilizar el template de MVVM sino que voy a codificar directamente en la página.
Lo primero que tenemos que hacer es definir las variables que vamos a utilizar, es decir el micrófono, su buffer y donde lo vamos a almacenar.
1 Microphone microphone = Microphone.Default;
2 byte[] microphoneBuffer;
3 MemoryStream audioStream;
4 byte[] recording;
Una vez que lo tenemos codificamos el botón Start, en el lo que haremos será activar el micrófono, definir el evento de recogida de la señal y el tamaño del buffer de esta señal, es decir, cada cuanto almacenamos en el buffer.
1 private void StartButton_Click(object sender, RoutedEventArgs e)
2 {
3 audioStream = new MemoryStream();
4 microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
5 microphoneBuffer =
6 new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
7 microphone.BufferReady += microphoneBuffer_BufferReady;
8 microphone.Start();
9 }
En el evento BufferReady vamos almacenando las sucesivas señales, en seste caso cada segundo, y como podéis ver en un MemoryStream
1 void microphoneBuffer_BufferReady(object sender, EventArgs e)
2 {
3 microphone.GetData(microphoneBuffer);
4 audioStream.Write(microphoneBuffer, 0, microphoneBuffer.Length);
5 }
6
Por ultimo en el botón Stop paramos la lectura del micrófono, transformamos a un fichero wav , lo grabamos en el teléfono y lo reproducimos
1 private void StopButton_Click(object sender, RoutedEventArgs e)
2 {
3 microphone.Stop();
4 microphone.BufferReady -= microphoneBuffer_BufferReady;
5 audioStream.Flush();
6 recording = audioStream.ToArray();
7 audioStream.Dispose();
8
9 using (var iss = new IsolatedStorageFileStream("recording.wav",
10 FileMode.OpenOrCreate,
11 IsolatedStorageFile.GetUserStoreForApplication()))
12 {
13 var bytesToWrite = SoundUtilities.ConvertRawSamplesToWav(recording,
14 new SoundUtilities.WaveFormat()
15 {
16 AverageBytesPerSecond = microphone.SampleRate * 2,
17 BlockAlign = 2,
18 Channels = 1,
19 Encoding = 1,
20 SamplesPerSecond = microphone.SampleRate
21 });
22 iss.Write(bytesToWrite, 0, bytesToWrite.Length);
23 }
24
25 }
26
Como podéis ver en el código de arriba utilizo una clase SoundUtilities que encontré por la red para transformar a ficheros wav, una vez transformados lo guardo en el teléfono el archivo.
Ya solo nos queda reproducir el archivo, para ello utilizamos la clase SoundEffect de XNA
1 private void PlayRecordingButton_Click(object sender, RoutedEventArgs e)
2 {
3 var effect = new SoundEffect(recording, microphone.SampleRate,
4 AudioChannels.Mono);
5 effect.Play();
6 }
Habéis podido observar que es muy sencillo utilizar el micrófono, lo que no es posible y envidió de Android es que no podemos transformarlo a Texto, en cambio, la API de Android si lo implementa.
Os dejo el código como siempre