2014-09-19 2 views
0

Я пытаюсь получить звук из приложения Android. Пока я могу отправить DatagramPacket из приложения Android. Но когда я пытаюсь получить этот DatagramPacket на моем сервере JAVA в моем localhost, отображается java.lang.IllegalArgumentException.FloatControl.setValue, показывающий java.lang.IllegalArgumentException

public class Server { 

AudioInputStream audioInputStream; 
static AudioInputStream ais; 
static AudioFormat format; 
static boolean status = true; 
static int port = 8888; 
static int sampleRate = 44100; 

public static void main(String args[]) throws Exception { 

    System.out.println("entering"); 
    DatagramSocket serverSocket = new DatagramSocket(8888); 

    /** 
    * Formula for lag = (byte_size/sample_rate)*2 Byte size 9728 will 
    * produce ~ 0.45 seconds of lag. Voice slightly broken. Byte size 1400 
    * will produce ~ 0.06 seconds of lag. Voice extremely broken. Byte size 
    * 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken 
    * then 9728. 
    */ 

    byte[] receiveData = new byte[4000]; 

    format = new AudioFormat(sampleRate, 16, 1, true, false); 

    while (status == true) { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, 
       receiveData.length); 

     serverSocket.receive(receivePacket); 

     ByteArrayInputStream baiss = new ByteArrayInputStream(
       receivePacket.getData()); 

     ais = new AudioInputStream(baiss, format, receivePacket.getLength()); 

     toSpeaker(receivePacket.getData()); 


    } 
} 

public static void toSpeaker(byte soundbytes[]) { 
    try { 
     System.out.println("I am in to speaker"); 
     DataLine.Info dataLineInfo = new DataLine.Info(
       SourceDataLine.class, format); 
     SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem 
       .getLine(dataLineInfo); 

     sourceDataLine.open(format); 

     FloatControl volumeControl = (FloatControl) sourceDataLine 
       .getControl(FloatControl.Type.MASTER_GAIN); 
     volumeControl.setValue(100.0f); 

     sourceDataLine.start(); 
     sourceDataLine.open(format); 

     sourceDataLine.start(); 

     System.out.println("format? :" + sourceDataLine.getFormat()); 

     sourceDataLine.write(soundbytes, 0, soundbytes.length); 
     System.out.println(soundbytes.toString()); 
     sourceDataLine.drain(); 
     sourceDataLine.close(); 
    } catch (Exception e) { 
     System.out.println("Not working in speakers..."); 
     e.printStackTrace(); 
    } 
} 

}

Когда я пытаюсь отправить аудио на сервер класса Java server бросает это исключение. Это производится volumeControl.setValue(100.0f);. Потому что когда я установил volumeControl.setValue(6.0);, все это прекрасно работает. Что вызывает эту ошибку и есть ли способ ее исправить?

java.lang.IllegalArgumentException: Requested value 100.0 exceeds allowable maximum value 6.0206. 
at javax.sound.sampled.FloatControl.setValue(FloatControl.java:218) 
at com.sun.media.sound.DirectAudioDevice$DirectDL$Gain.setValue(DirectAudioDevice.java:853) 
at com.company.Server.toSpeaker(Server.java:72) 
at com.company.Server.main(Server.java:54) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
+0

Очевидно, что максимальное значение 6.0206. Почему вы хотите установить значение 100.0? – Seelenvirtuose

+0

http://stackoverflow.com/questions/15955958/android-audiorecord-to-server-over-udp-playback-issues здесь они устанавливают значение 100.0f, и оно работает. Поэтому я думаю, что это можно установить. – 2014-09-19 06:56:45

+0

Это будет зависеть от максимума, который был установлен при создании 'FloatControl'. Вы можете запросить максимум, сначала получив 'MASTER_GAIN'' FloatControl' с 'line.getControl (FloatControl.Type.MASTER_GAIN)', а затем вызовите 'getMaximum()' на возвращаемом объекте. Я не могу сказать, что понимаю, почему вы даже хотите попробовать применить 100 дБ усиления в потоке. – Michael

ответ

0

Радиус действия FloatControl может варьироваться в зависимости от SourceDataLine, так что вы должны использовать FloatControl.getMinimum() и FloatControl.getMaximum() методы, чтобы выяснить диапазон, которым разрешено устанавливать.

Вы также можете позвонить FloatControl.getUnits(), чтобы получить строку, сообщающую вам единицы управления (обычно дБ).

FloatControl.getPrecision() дает вам точность управления.

В качестве примера на моих динамиках Mac диапазон Master Gain составляет -80,0 - 6,0206 дБ.

Смежные вопросы