Espero que por favor me indiquen que opinan de este código que he realizado.
Esto es un pequeño bosquejo de que tipo son los datos... no es un código lineal
Código Java:
Ver original
AudioFormat FormatoAudio;
Código Java:
Ver original
LineaDatoDestino.open(FormatoAudio); LineaDatoDestino.start();
Código Java:
Ver original
int TallaBuffer = int)FormatoAudio.getSampleRate()*FormatoAudio.getFrameSize(); byte ArregloByte[] = new byte[TallaBuffer];
Antes de entrar en el tema:
Código Java:
Ver original
capturando = true; try { while (capturando) { int Leidos = LineaDatoDestino.read(ArregloByte, 0, ArregloByte.length); if (Leidos > 0) { CopiadorTexto(ArregloByte); if(jcbEscuchar.isSelected()){ Repetir(ArregloByte,Leidos); } FlujoSalida.write(ArregloByte, 0, Leidos); } }
ArregloByte es un arreglo de tipo byte que se define anteriormente...
Sabemos que el audio se puede almacenar en cuatro, tres, dos y un byte...aunque realmente he intentado con formatos de cuatro y tres bytes y no me funcionan (ese es otro tema)... sin embargo el motivo es capturar almacenar la informacion de audio sin importar el número de bytes (de 1 a 4) y si es almacenado de manera BigEndian o LittleEndian...
Cuando capturo el dato en un entero, quiero aumentar el volumen (Multiplicando por 2) o disminuirlo (Dividiendo x 2)..y posteriormente almacenarlo en el mismo arreglo..
Código Java:
Ver original
private void Repetir(byte[] ArregloByte, final int Leidos){ final byte VectorDatoByte[] = ArregloByte.clone(); int talla = FormatoAudio.getSampleSizeInBits(); boolean SignificacionInicial = FormatoAudio.isBigEndian(); int NumeroByte = 0; switch (talla) { case 32: NumeroByte = 4; break; case 24: NumeroByte = 3; break; case 16: NumeroByte = 2; break; case 8: NumeroByte = 1; break; } int Entero = 0; byte byte0; byte byte1; byte byte2; byte byte3; for (int ND = 0;ND<VectorDatoByte.length/NumeroByte; ND++){ byte0 = (ND*NumeroByte+0)< VectorDatoByte.length?VectorDatoByte[ND*NumeroByte+0]:0; byte1 = (ND*NumeroByte+1)< VectorDatoByte.length?VectorDatoByte[ND*NumeroByte+1]:0; byte2 = (ND*NumeroByte+2)< VectorDatoByte.length?VectorDatoByte[ND*NumeroByte+2]:0; byte3 = (ND*NumeroByte+3)< VectorDatoByte.length?VectorDatoByte[ND*NumeroByte+3]:0; if (NumeroByte==4){ if(SignificacionInicial){ Entero = (int)(((byte3 & 0xFF) << 24)|((byte2 & 0xFF) << 16)|((byte1 & 0xFF) << 8)|((byte0 & 0xFF) << 0)); }else{ Entero = (int)(((byte0 & 0xFF) << 24)|((byte1 & 0xFF) << 16)|((byte2 & 0xFF) << 8)|((byte3 & 0xFF) << 0)); } } if (NumeroByte==3){ if(SignificacionInicial){ Entero = (int)(((byte2 & 0xFF) << 16)|((byte1 & 0xFF) << 8)|((byte0 & 0xFF) << 0)); }else{ Entero = (int)(((byte0 & 0xFF) << 16)|((byte1 & 0xFF) << 8)|((byte2 & 0xFF) << 0)); } } if (NumeroByte==2){ if(SignificacionInicial){ Entero = (int)(((byte1 & 0xFF) << 8)|((byte0 & 0xFF) << 0)); }else{ Entero = (int)(((byte0 & 0xFF) << 8)|((byte1 & 0xFF) << 0)); } } if (NumeroByte==1){ Entero = (int)(((byte0 & 0xFF)<< 0)); } if (Magnitud <1) { //Divide x 2 Entero = (int)(Entero >> 1); } if (Magnitud >1) { //Multiplica x 2 Entero = (int)(Entero << 1); } if (NumeroByte==4){ if(SignificacionInicial){ if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 8) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+2)){VectorDatoByte[ND*NumeroByte+2] = (byte)((Entero >> 16) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+3)){VectorDatoByte[ND*NumeroByte+3] = (byte)((Entero >> 24) & 0xFF);} }else{ if (VectorDatoByte.length>(ND*NumeroByte+3)){VectorDatoByte[ND*NumeroByte+3] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+2)){VectorDatoByte[ND*NumeroByte+2] = (byte)((Entero >> 8) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 16) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 24) & 0xFF);} } } if (NumeroByte==3){ if(SignificacionInicial){ if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 8) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+2)){VectorDatoByte[ND*NumeroByte+2] = (byte)((Entero >> 16) & 0xFF);} }else{ if (VectorDatoByte.length>(ND*NumeroByte+2)){VectorDatoByte[ND*NumeroByte+2] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 8) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 16) & 0xFF);} } } if (NumeroByte==2){ if(SignificacionInicial){ if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 8) & 0xFF);} }else{ if (VectorDatoByte.length>(ND*NumeroByte+1)){VectorDatoByte[ND*NumeroByte+1] = (byte)((Entero >> 0) & 0xFF);} if (VectorDatoByte.length>(ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 8) & 0xFF);} } } if (NumeroByte==1){ if ((VectorDatoByte.length>ND*NumeroByte+0)){VectorDatoByte[ND*NumeroByte+0] = (byte)((Entero >> 0) & 0xFF);} } } //Fin Ciclo For
quiero saber si mi código está bien... y si está bien porque al disminuir el volumen (Dividir x2) hay mucho ruido...
Saludos y gracias de antemano...