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