jueves, 26 de abril de 2012

Mejoras y resolución de problemas de la aplicación AudioSense


Los objetivos marcados para esta semana son los siguientes:
  • Mejorar el cálculo de las energías medias por barra para el ecualizador, distinguiendo entre voz y música.
  • Distinción entre voz y música para el cálculo del patrón de vibración.
  •  Mejorar el patrón de vibración en lo que se refiere a duración máxima del patrón de vibración.
  • Deshabilitar el giro de pantalla.
  • Solucionar el problema con el mensaje inicial del toogleButton.   
  • Deshabilitar las vibraciones en las diferentes opciones de cierre de la aplicación.
Para mejorar el aspecto del ecualizador gráfico hacemos que la relación no sea lineal, en lo que se refiere a muestras por barra. 

Cuando se trata de música usamos las frecuencias de las notas musicales de la cuarta hasta la séptima octava. Tuvimos que aumentar el número de barras de 16 a 28. Por tanto en el caso de música cada barra contiene la energía media de la frecuencia de la nota musical y de su sostenido, si existe.  

Cuando se trata de voz hacemos uso de la escala Bark, la cual nos da las frecuencias más importantes de la voz. Como no llegábamos a cubrir 28 valores para 28 barras y sabiendo que el espectro más importante de la voz se encuentra entre 0 y 2kHz, añadimos varias frecuencias que creíamos también importantes.

También decidimos mejorar el patrón de vibración, siendo diferente el cálculo en caso de ser voz que en el caso de ser música. Lo que hemos hecho es que si se trata de la voz sólo analizaremos el rango de frecuencias de 0 a 2000Hz ignorando el resto. Esto lo haremos simplemente sumando en la energía total  las 64 primeras muestras en el caso de que sea voz lo que grabamos. También la frecuencia central de máxima energía sólo se estudiará en el rango de 0 a 2kHz. En el caso de música, el cálculo de patrones sigue siendo el mismo al nombrado en anteriores blogs.

A la hora de pensar cómo mejorar los patrones de vibración, se nos ocurrió que podíamos mejorarlos si permitíamos al usuario que decidiese cual era el tiempo máximo que podía durar el patrón de vibración, es decir, que elija entre 1 segundo, 500ms, 200ms y 100ms. Esta opción depende de la apreciación táctil del usuario y la velocidad del hablante con el que desea comunicarse. Lo que hicimos fue definir 4 radioButtons y los unimos en un grupo para que sólo uno de ellos pueda estar activado. Los valores asociados a éstos son los inversos de los tiempos arriba mencionados, es decir, 10Hz, 5Hz, 2Hz o 1Hz. La selección de estos botones depende de lo dicho antes, por tanto si el usuario tiene buena apreciación táctil y la velocidad del hablante con el que desea comunicarse es normal debe elegir 10Hz y si al contrario tiene mala apreciación táctil debe elegir 1Hz y el hablante debe llevar un ritmo lento de habla para no perderse ninguna información.

Para hacer lo anteriormente explicado creamos 4 radio botones y los unimos en un grupo para que solo uno de ellos pueda estar activado. 

La elección de una de las 4 opciones, cambiará ciertos parámetros del código que son: la duración máxima del patrón de vibración y cada cuantas interrupciones del Timer se refrescan los patrones de vibración.

La interfaz gráfica final de la aplicación AudioSense es la siguiente:

 
Después  de todo esto, nos dedicamos a resolver ciertos problemas de la aplicación. Un problema que teníamos era que cuando girábamos la pantalla del móvil la aplicación dejaba de funcionar decidimos,  así que decidimos que la mejor solución era bloquear el giro de pantalla. Para ello en el fichero Manifest.xml de nuestra aplicación android, donde también se definen los permisos, lo que hicimos fue añadir lo siguiente:              android:screenOrientation="nosensor"

Teníamos otro problema con el mensaje/texto inicial asociado al toogleButton, puesto que al iniciar la aplicación en vez de poner Empezar ponía Desconectado, aunque en el resto de pulsaciones de botón los mensajes eran los correctos. Después de intentar encontrar una posible solución de configuración de botones, encontramos otra solución. Esta fue simular una doble pulsación  del toogleButton mediante la instrucción performClick() al inicio de la aplicación, consiguiendo así que mostrará el mensaje inicial correcto. 

Teníamos otro problema que era que las vibraciones no se terminaban siempre, sólo en el uso normal explicado en el manual de usuario. Es decir, que si pulsábamos el botón central, el botón de atrás o sucedía cualquier otro evento del dispositivo móvil ajeno a la aplicación la vibración de nuestra aplicación continuaba.

Esto era un grave problema ya que para  que dejara de vibrar y de grabar teníamos que entrar en las opciones del dispositivo y detener la aplicación desde allí. Lo que necesitábamos es que se finalizará la actividad en esos casos.

Realizando varias pruebas nos dimos cuenta de que al pulsar la tecla de atrás o el botón central o cualquier otro evento del móvil, se ejecuta el onPause y después se fuerza la ejecución del onStop. Por lo que lo que hacemos es definirlos y en el caso de que se esté grabando y vibrando en ese momento, es decir, la variable grabando esté a 1 ponemos la variable de grabando a 0 para que termine todo el proceso en paralelo de grabación y de vibración (al poner grabando a 0 se finaliza el proceso background de AsyncTask). Además en el onStop realizamos el método performClick() el cual hace que se pulse el botón de Terminar, para que cuando volvamos a entrar a la aplicación, ésta esté en su estado inicial.

                Para también arreglar el problema asociado a la pulsación única del botón Salir, como hemos comentado en el apartado de Listeners, forzamos que en su listener además de poner grabando a 0, se realice el onDestroy el cual cancela las vibración, termina la actividad actual mediante el método finish y borra todo espacio de memoria ocupado por el proceso de grabación mediante el método release().

Nuestros próximos objetivos serán:
  • Creación de una aplicación de traducción de mensajes a código Morse.

No hay comentarios:

Publicar un comentario