Descargar el código del ejemplo anterior y abrir mediante VSCode. Ahora, modifica el código
de tal manera que en vez de ser audioplayer nos encontremos con tres botones: Record, Play
y Upload (en este último , por el momento no se programará nada).
Crea una clase de nombre App en el fichero public/js/main.js. La clase debe contener los
siguientes métodos: constructor(), init(), initAudio(), loadBlob(),
initRecord(), record(), stopRecording(), playAudio(), stopAudio(),
upload(), deleteFile(). A modo de atributos tendremos, entre otros: this.audio(con
el fin de almacenar el elemento Audio), this.blob (para almacenar el contenido del audio) y this.state (para almacenar el estado actual en un elemento JSON). De momento
estarán vacíos, los iremos rellenando poco a poco.
Los botones se deben generar de manera dinámica al cargarse la ventana (con el evento
window.onload). Cada botón estará en un archivo JS. Por ejemplo, para usar el botón
Record (para grabar) haremos lo siguiente:
// public/js/main.js
import { recordFn } from "/js/recordButton.js";
[...]
const liRecordButton = document.getElementById("liRecordButton");
liRecordButton.innerHTML = recordFn();
En el método init(), pedir permiso para grabar. Al aceptar esa petición, el navegador creará un stream. A continuación, llamará a los métodos initaudio() e initRecord(stream).
El método initAudio() crea una elemento de tipo audio (this.audio) y gestiona los
siguientes eventos sobre dicho elemento: onloadedmetadata, ondurationchange,
ontimeupdate y onended. En cada uno de los gestores, por el momento tan sólo se pide
escribir por consola (console.log). Crea el fichero Ejercicios.md en tu proyecto. Dentro,
genera una tabla con el comentado Audio event listener. Por cada uno , comenta para qué se
utiliza y añade un ejemplo. Por ejemplo:
Objetivo: este evento se lanza cuando el audio finaliza su reproducción.
Posible uso: puede ser valioso cuando deseamos realizar una tarea nada más acabar el
audio. Así, reproducir una canción tras otra de un playlist.
El método initRecord() recogerá un stream como parámetro de entrada que le pasará al
constructor MediaRecorder para inicializar la grabación (en un objeto mediaRecorder).
Programa los eventos ondataavailable y onstop para el objeto mediaRecorder.
El último de dichos eventos generará un Blob (this.blob) y llamará al método loadBlob.
El método loadBlob() se encargará de establecerel parámetro blob como fuente del
elemento de audio (this.audio.src).
Recuerda que usaremos el objeto JSON state para gestionar el estado de la aplicación.
El método setState realizará una fusión entre el objeto JSON actual (this.state)
y el nuevo estado recibido como parámetro (state). A continuación, llamará al método
render().
setState(state) {
this.state = Object.assign({}, this.state, state);
this.render();
}
El método render() actualizará la interfaz de la aplicación en función de la situación actual
(playing, recording, uploaded, deleting, ...). Por ejemplo, en el estado playing irá actualizando el tiempo que queda para finalizar el audio (03:12, 03:11, 03:10... etc. Hasta 00:00). Este
7
último ejemplo lo puedes lograr de manera sencilla, llamando al método setState en el
gestor del evento this.audio.ontimeupdate.
Para poder probar tu código implementa los métodos record, stopRecording, playAudio
y stopAudio.
El código súbelo al proyecto grupal de tu GitHub y asígnale la etiqueta milestone1