MediaElement y reproducir sonido en Windows Store y Windows Phone

Como ya dice el título, MediaElement es un control que nos permite reproducir sonido tanto en aplicaciones Windows Phone (MediaElement para Windows Phone) como en aplicaciones Windows Store (MediaElement para Windows Store). Con mi experiencia quiero contar algunas cosas respecto a este control.

Primero, en Windows Phone tiene algún que otro fallo, a veces no reproduce el sonido, sobretodo si la aplicación está trabajando duro, no sé, quizá cuando está cargando el archivo de audio.

Otro problema es si tenemos más de un MediaElement que quieren reproducir sonido declarados en XAML; en cuanto activamos el segundo el primero deja de reproducir. En este escenario debemos usar XNA Framework para reproducir el sonido.

También, la reproducción continua del mismo, por ejemplo un botón que al pulsar reproduce un sonido, si lo pulsamos muchas veces y de forma continua el sonido de la nueva pulsación corta la del anterior.

A favor debo decir que es la forma más fácil que tenemos de reproducir sonido en Windows Phone, con el permiso del control de comportamiento PlaySoundAction.

Segundo, en Windows Store es más estable. No he detectado en ningún momento que deje de reproducir sonido pase lo que pase.

Además, ya no tenemos el problema de que si hay más de un control MediaElement uno deja de hacer reproducir el otro. Es decir, en Windows Store podemos reproducir varios MediaElement a la vez.

Pero, SI continua el problema del botón que se pulsa repetitivamente y con mucha velocidad. El sonido que reproduce el boton corta el sonido de la pulsación anterior. Para arreglar tenemos dos opciones:

1) Des de código creas el control MediaElement para cada pulsación del botón y lo haces reproducir


storageFile = await installedLocation.GetFileAsync("Assets\\Sounds\\hahahaaa.wav");
sound = await storageFile.OpenReadAsync();
Sound = new MediaElement();
Sound.AutoPlay = true;
Sound.SetSource(sound, storageFile.ContentType);

Pros: Fácil e intuitivo

Contras: Este control no lanzará jamás ningún evento, por tanto la única opción es reproducir con el AutoPlay=true. Eso implica que no puedes controlar cuando se reproduce el sonido porque tienes el tiempo que tarda el archivo de audio a cargarse dentro del control MediaElement. Otro problema, es que produce bajadas de rendimiento aleatorios importantes donde deja el Thread UI ocupado durante media segundo más o menos, lo que hace que en algunos casos la interacción con tu aplicación sea un desastre.

2) Usar XAudio2 de DirectX

Consulta un buen ejemplo aquí: XAudio2 audio file playback sample

Pros: máximo rendimiento y reproducción perfecta

Contras: Programar con C++ (que si somos de .Net pues es un poco diferente) y trabajar con DirectX

Nota : Si eres un maestro en C++ y sabes de DirectX ya no tienes ningún contra. Así que adelante 🙂

Anuncis

String resources in Windows Store Apps

Microsoft technologies are changing constantly and without pause. This is good for us (developers), it keeps us busy 🙂

Resources in .Net always were files with .resx extension and easily usable from code through static class that is not available in Windows Store Apps. Why? I don’t know.

In Windows Store Apps exists files with resw extension. In this file you can put string resources only, remember in resx you could put any kind of resources (files, string, audio, images)

Luckily, using in XAML is easier now. Look an example:


<TextBlock x:Uid="/Errors/AlreadyRegistered"></TextBlock>

Where:

Errros : is the name of resw file. Unique in all solution. Complete path isn’t possible

AlreadyRegisteres : Is the string resource in resw file

In the other hand, using in code is more difficult or maybe less intuitive. Look an example:


var res =  Windows.ApplicationModel.ResourceLoader('Errors');
res.GetString('AlreadyRegistered');

Loading strings from libraries, controls, or software development kits (SDKs).

However, loading resources from another library seems easier in Windows Store than old platforms. Oh my gosh, I said old? 🙂

ResourceLoader R = new Windows.ApplicationModel.Resources.ResourceLoader(“ContosoControl/Resources”);
R.getString(“loadingStr”); // which came from ContosoControl’s Resources.resw

Where :

ContosoControl : External library name

Resources : resw file name

loadingStr : string resource

More information:

How to load string resources (Windows Store apps using C#/VB/C++ and XAML)

 

 

Mouse events Grid Control

In this article is explained How to handle mouse event on entire Grid Control in WPF or Windows Store apps or Windows Phone apps.
It is really simple and I would not write anything about that in my blog if I had not had problems with this simple action in my Windows Phone project that I am working.
At the bottom of this article it says the gold rule:
In order for this to work you need to always set the Grid Background, either to transparent or to whatever you like, because if its null the event isn’t triggered…

And that’s true, remember to put a background on your Grid, by default could be set to null.