jueves, 17 de mayo de 2012

Desarrollo de apps con Titanium:Captura y reproducción de Audio

Muchas de las veces queremos desarrollar apps para capturar audio y después de ello guardarlas para luego reproducirlas, esto ha impulsado mucho la combinación de notas en audio más la nube que ha sido una combinación perfecta en esta temporada tecnologica.Para ello necesitamos tener un esqueleto de interfaz:


//crea ventana
var win = Titanium.UI.currentWindow;
//variables
var archivo;
var tiempo;
var sonido;
var duracion = 0;

var etiqueta = Titanium.UI.createLabel({
 text: ' ',
 top:150,
 color: '#999',
 textAlign:'center',
 width: 250,
 height:'auto'
});

win.add(etiqueta);

//label volumen
var volumen = Titanium.UI.createLabel({
 text: "Volumen: "+Ti.Media.volume,
 bottom:50,
 color:'#999',
 textAlign:'center',
 width: 250,
 height: 'auto'
});
//label de switch
var etiquetaSwitch = Titanium.UI.createLabel({
 text:'Alta fiedilidad: ',
 width: 250,
 height:'auto',
 textAlign:'center',
 color:'#999',
 bottom:115
});
//switch
var switchL = Titanium.UI.createSwitch({
 value:false,
 bottom:80
});

win.add(etiquetaSwitch);
win.add(switchL);
//boton del play
var play = Titanium.UI.createButton({
 title:'Reproduce Grabacion',
 width:200,
 height:40,
 top:80
 });
win.add(play);
//boton de grabacion
var start = Titanium.UI.createButton({
 title:'Comenzar Grabacion',
 width:200,
 height:40,
 top:20
});

win.add(start);


Y veremos una interfaz como esta:


Ahora le daremos funcionalidad haciendo lo siguiente:

//crea ventana
var win = Titanium.UI.currentWindow;
//variables
var archivo;
var tiempo;
var sonido;
var duracion = 0;

var etiqueta = Titanium.UI.createLabel({
 text: ' ',
 top:150,
 color: '#999',
 textAlign:'center',
 width: 250,
 height:'auto'
});

win.add(etiqueta);

//label volumen
var volumen = Titanium.UI.createLabel({
 text: "Volumen: "+Ti.Media.volume,
 bottom:50,
 color:'#999',
 textAlign:'center',
 width: 250,
 height: 'auto'
});
//label de switch
var etiquetaSwitch = Titanium.UI.createLabel({
 text:'Alta fiedilidad: ',
 width: 250,
 height:'auto',
 textAlign:'center',
 color:'#999',
 bottom:115
});
//switch
var switchL = Titanium.UI.createSwitch({
 value:false,
 bottom:80
});

win.add(etiquetaSwitch);
win.add(switchL);
//boton del play
var play = Titanium.UI.createButton({
 title:'Reproduce Grabacion',
 width:200,
 height:40,
 top:80
 });
win.add(play);
//boton de grabacion
var start = Titanium.UI.createButton({
 title:'Comenzar Grabacion',
 width:200,
 height:40,
 top:20
});

win.add(start);

//Creamos la instancia de un objeto del metodo AudioRecorder llamado grabando
var grabacion = Ti.Media.createAudioRecorder();

/*
Para una compresion por default usamos Ti.Media.AUDIO_FORMAT_LINEAR_PCM
Nos comprimira el archivo en un tamanio pequenio y optimo para el telefono
Para un formato por default usamos Ti.Media.AUDIO_FILEFORMAT_CAF
Nos dara una buena calidad en el audio
*/
grabacion.compression = Ti.Media.AUDIO_FORMAT_LINEAR_PCM;
grabacion.format = Ti.Media.AUDIO_FILEFORMAT_CAF;
Ti.Media.addEventListener('recordinginput',function(e){
 //en caso de grabacion se da un click en el evento de start
 if(!e.available && grabacion.recording){
  start.fireEvent('click',{});
 }
});
//si se modifico el volumen se actualizara
Ti.Media.addEventListener('volume', function(e){
 volumen.text = "Volumen: "+e.volume;
});
//muestra los niveles de sonido y duracion
function muetraNiveles() 
{
 var peak = Ti.Media.peakMicrophonePower;
    var avg = Ti.Media.averageMicrophonePower;
    duracion ++;
    etiqueta.text ='Duracion: '+duracion+' segundos\npeak power: '+peak+'\navg power: '+avg;
}
//evento al comenzar grabacion
start.addEventListener('click', function()
   {
    if(start.title == "Detener Grabacion")
    {
     //guarda lo grabado en archivo
     archivo = grabacion.stop();
     //cambia la etiqueta start
     start.title= "Comienzar Grabacion";
     //nos muestra la opcion de reproducir
     play.show();
     //limpia el intervalo de tiempo
     clearInterval(tiempo);
     Ti.Media.stopMicrophoneMonitor();
 } else {
  //dar error en caso de que no haiga hardware necesario
    if (!Ti.Media.canRecord) {
      Ti.UI.createAlertDialog({
        title:'Error!',
        message:'No hay dispositivo de grabacion disponible'
      }).show();
return; }
 //cambia etiqueta start
    start.title = "Detener Grabacion";
    //comienza grabar
    grabacion.start();
    //esconde etiqueta Reproducir
    play.hide();
    Ti.Media.startMicrophoneMonitor();
    //inicia en ceros duracion y luego nos muestra el tiempo transcurido
    duracion = 0;
    tiempo = setInterval(muestraNiveles,1000);
  }
});
play.addEventListener('click', function()
{
  if (sonido && sonido.playing)
  {
   //detiene la grabacion
    sonido.stop();
    //libera
    sonido.release();
    sonido = null;
    //cambia etiqueta
    play.title = 'Reproduce Grabacion';
} else {
 //guarda el nuevo archivo
    sonido = Titanium.Media.createSound({sonido:archivo});
    sonido.addEventListener('complete', function()
    {
     //cambia etiqueta play
      play.title = 'Reproduce Grabacion';
    });
    //cambia etiqueta play y reproduce
    sonido.play();
    play.title = 'Detiene Grabacion';
  }
});
//cambia formato por medio del switch
switchL.addEventListener('change',function(e)
{
  if (!switchL.value)
  {
    grabacion.compression = Ti.Media.AUDIO_FORMAT_ULAW;
     }
else {
       grabacion.compression = Ti.Media.AUDIO_FORMAT_LINEAR_PCM;
     }
});



Y como resultado veremos lo siguiente:


1 comentario: