En esta entrada vamos a aprovecharnos de la API de Bing Translator para explicar como reproducir sonidos en nuestro Windows Phone, para ello recuperamos el código del post Windows Phone–Tutorial XIII – Usando datos en Windows Phone 7–Web Services donde teníamos un traductor utilizando la API de Bings, en este ejemplo lo que vamos a hacer es utilizar bings para que el texto traducido lo “diga” el teléfono.
Lo primero que tenemos que hacer es invocar al método de la API de Bings SpeakAsync que nos devuelve una uri con el sonido del texto que enviemos, tan sencillo como
1 void proxy_TranslateCompleted(object sender, TranslateCompletedEventArgs e) 2 { 3 LanguageTo = e.Result; 4 LanguageServiceClient proxy = new LanguageServiceClient(); 5 proxy.SpeakCompleted += new System.EventHandler<SpeakCompletedEventArgs>(proxy_SpeakCompleted); 6 proxy.SpeakAsync(APPID, LanguageTo, LanguageToSelected.Code, "audio/wav"); 7 8 }
Como podeis ver en el código a la API solo hay que enviarle el ID de Bing el texto, el código del lenguaje y el formato del audio
En el evento proxy_SpeakCompleted reproduciremos el archivo con el sonido del texto, para ello debemos utilizar el método SoundEffect.FromStream, la clase SoundEffect se encuentra en XNA concretamente en el assembly Microsoft.Xna.Framework añadiendo esta referencia con solo el siguiente código reproduciríamos el archivo.
1 void proxy_SpeakCompleted(object sender, SpeakCompletedEventArgs e) 2 { 3 var client = new WebClient(); 4 client.OpenReadCompleted += ((s, args) => 5 { 6 SoundEffect se = SoundEffect.FromStream(args.Result); 7 se.Play(); 8 }); 9 client.OpenReadAsync(new Uri(e.Result)); 10 }
Si ejecutamos la aplicación cuando demos al botón de traducir obtendremos el error
System.InvalidOperationException was unhandled
Message=FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See http://go.microsoft.com/fwlink/?LinkId=193853 for details.
StackTrace:
at Microsoft.Xna.Framework.FrameworkDispatcher.AddNewPendingCall(ManagedCallType callType, UInt32 arg)
at Microsoft.Xna.Framework.UserAsyncDispatcher.HandleManagedCallback(ManagedCallType managedCallType, UInt32 managedCallArgs)
at Microsoft.Xna.Framework.UserAsyncDispatcher.AsyncDispatcherThreadFunction()
Esto es debido a que estamos utilizando un elemento de XNA en aplicaciones Silverlight, para hacerlo funcionar en aplicaciones de Silverlight debemos de seguir estos pasos
Crear la clase XNAAsyncDispatcher con el siguiente código
1 public class XNAAsyncDispatcher : IApplicationService 2 { 3 private DispatcherTimer frameworkDispatcherTimer; 4 5 public XNAAsyncDispatcher(TimeSpan dispatchInterval) 6 { 7 this.frameworkDispatcherTimer = new DispatcherTimer(); 8 this.frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick); 9 this.frameworkDispatcherTimer.Interval = dispatchInterval; 10 } 11 12 void IApplicationService.StartService(ApplicationServiceContext context) 13 { 14 this.frameworkDispatcherTimer.Start(); 15 } 16 void IApplicationService.StopService() 17 { 18 this.frameworkDispatcherTimer.Stop(); 19 } 20 void frameworkDispatcherTimer_Tick(object sender, EventArgs e) 21 { 22 FrameworkDispatcher.Update(); 23 } 24 }
Y por ultimo en el archivo App.xaml.cs en el constructor añadir la línea
1 this.ApplicationLifetimeObjects.Add(new XNAAsyncDispatcher(TimeSpan.FromMilliseconds(50)));
Ahora si funcionara y oiremos la traducción
En este post vamos a ver como utilizar el micrófono que viene en todos los teléfonos de Windows Phone