2015-03-06 9 views
0

Я пытаюсь получить объем от моего Android часов Wear: MOTO 360. Но я получаю только значения 0 ИКХ из Audiorecord.read .....audiorecord андроид значения износа 0

я бег записи процесс в отдельном потоке. Ниже приведен фрагмент моего кода, есть ли у вас какие-либо идеи, что я делаю неправильно?

Большое спасибо за помощь

jn.

REREDIT: новый результат с MOTO. Это выглядит действительно странно!

03-15 20: 38: 08.740 1420-3994 /? W/mot_vr_audio_hw: Не разрешать wake(), так как DSP отключен

RE-EDIT: Я пробовал использовать свой код с другим WATCH (Sony). Журналы более явны

03-08 22: 11: 40.342 1165-1650 /? D/MICRO: ЗАПИСЬ НА 44100 Гц В БУФЕРЕ 15052

03-08 22: 11: 40.343 153-153 /? E/AudioPolicyManager: startInput (21) не выполнен: другой вход 19 уже запущен

03-08 22: 11: 40.343 1165-1650 /? E/AudioRecord: start() status -38

Эта ошибка, кажется, срабатывает, когда одновременно активны 2 объекта звукового сопровождения. Но я уверен, что моя только началась. Как вы думаете, это может быть объект System Audiorecord, который предотвращает запуск моей шахты?

EDIT: У меня есть это в моем износе проявляется использует разрешение-андроид: имя = «android.permission.RECORD_AUDIO»

private int sampleRateInHz = 8000; 
private int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 

public void run(){ 

    running=true; 
    bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz, channelConfig, audioFormat, bufferSize); 
    Log.d(TAG,"WILL RECORD AT "+sampleRateInHz+"Hz IN A BUFFER OF "+bufferSize); 
    recording=true; 

    try{ 
     while (recording){ 

      if ((recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)&&(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)){ 
       recorder.startRecording(); 
       Log.d(TAG,"START RECORDING DUDE"); 
      } 

      int theVolume = getVolume(sampleRateInHz, bufferSize); 

      Thread.sleep(10); 
     } 
     if (!recording){ 
      Thread.currentThread().interrupt(); 
      Log.d(TAG,"MIC THREAD STOPPED"); 
     } 

    }catch (InterruptedException e){ 
     e.printStackTrace(); 
    } 

private int getVolume(int sampleRate, int bufferSize){ 
    short[] audioData = new short [bufferSize]; 

    int nbOfSamples = recorder.read(audioData,0,bufferSize); 

    int numSamples = audioData.length; 
    int numCrossing = 0; 
    double volume = 0; 
    for (int p = 0; p < numSamples-1; p++){ 
     volume += audioData[p]*audioData[p]; 
    } 

    Log.d(TAG,"volume from pcm: "+volume); 
    volume = Math.sqrt(volume/nbOfSamples); 


    currentVolume = (int) (0.5*currentVolume+ 0.5*volume); 
    Log.d(TAG,"currentVolume: "+currentVolume); 

    return currentVolume; 
} 

ответ

1

Больше кода было бы полезно. Но похоже, что микрофон уже используется. Я столкнулся с некоторыми из этих проблем. Если вы запускаете это в потоке, вы можете случайно запустить несколько потоков. Также, если вы запускаете это в службе, вы можете запускать несколько сервисов. Теперь, если вы выполните поиск Google, «можно запустить несколько экземпляров одной и той же службы», вы найдете много людей, которые скажут «нет». Но дело в том, что да, вы можете одновременно использовать несколько экземпляров одного и того же сервиса. Мой совет: Log.d случайное число в каждом цикле записи. Для того, чтобы убедиться, что только один поток работает в то время

public void run(){ 
    int randThreadNumber = randInt(0,100); 
    while (recording) { 
     Log.d("MYTAG", "Rand number " + randThreadNumber); 
     ..........more code............. 
    } 
    ..........more code............. 
} 

public static int randInt(int min, int max) { 
    Random rand = new Random(); 
    int randomNum = rand.nextInt((max - min) + 1) + min; 

    return randomNum; 
} 

Еще одна вещь, которая может привести к вам не удастся получить доступ к деку Android Wear, если часы прослушивает «OK Google» Так что, если вы пытаетесь захватить аудио, пока часы находятся в состоянии, которое будет отвечать на «OK Google», запись звука не будет работать.

Вот хороший способ, чтобы увидеть, если микрофон доступен

while(recording) 
{ 
    readResult = audio_recorder.read(buf, 0, buf.length); 

    //See if read worked 
    if(readResult != -3) { 
     // yay it worked. Do stuff 
    } else { 
     // if result is -3 then the watch's mic was inaccessible, wait then retry 
     Log.d(TAG, "Waiting for Watch to give up Microphone"); 
     try { 
      Thread.sleep(100, 0); 
      audio_recorder.startRecording(); // restart audio recording 
     } catch(Exception e) { 
      Log.e(TAG, "exception", e); // Error trying to sleep thread 
     } 
    } 
} 

EDIT Также вызов Thread.sleep(10); между каждым вызовом чтения является бесполезным, так как метод чтения блокирует. Если ему нечего предложить, он будет ждать, а затем вернуться, когда он будет готов.

+0

благодарит за прекрасный ответ!Я попробую ваш случайный номер, это очень хороший совет. Я также буду записывать readresult = -3, чтобы уловить эту проблему. Я знаю, что знаю результаты. Интересным моментом является то, что я пробовал использовать один и тот же код на другом устройстве (sony smartwatch 3), и у меня нет ПРОБЛЕМЫ, присоединяющейся к микрофону ..... ..... – bisonfute

+0

Я не понял смысл вашего EDIT. Я делаю нить sleep AFTER read(). Потому что мне не нужна очень высокая частота микрофона. Я читаю() блокирует, отлично, но я хочу приостановить минимальное время (может быть больше, если read() блоки), прежде чем перезапустить read()). Я где-то ошибаюсь? – bisonfute

+0

Я попробовал прочитать результат audiorecord.read(), и это дает мне большое положительное число, например 1323. Я думаю, это означает, что все кажется правильным. Но сегодня у меня новая ОШИБКА: 03-15 20: 38: 08.740 1420-3994 /? W/mot_vr_audio_hw: Не разрешать wake(), поскольку DSP отключен – bisonfute