2013-06-08 4 views
0

Я использую следующий код. Он отлично работает и показывает частоту. Но каждый раз перед запуском приложения мне нужно переустановить его, чтобы он работал правильно. Может быть, объект не освобождается? Здесь я включаю код.Когда выпустить объект AudioRecord?

public class Test extends Activity{ 

String TAG; 
public boolean recording; 
AudioRecord recorder; 
int numCrossing,p; 
short audioData[]; 
int bufferSize,srate; 
TextView disp; 
float frequency; 
private static int[] sampleRate = new int[] { 44100, 22050, 11025, 8000 }; 

@Override 
protected void onCreate(Bundle Testing) { 
    // TODO Auto-generated method stub 
    super.onCreate(Testing); 
    setContentView(R.layout.activity_start); 
    disp = (TextView) findViewById (R.id.tvDisp); 

    Thread t1 = new Thread(new Runnable(){ 

     public void run() { 

      Log.i(TAG,"Setting up recording"); 
      for (int rate : sampleRate) { 
       try{ 

         Log.d(TAG, "Attempting rate " + rate); 

      bufferSize=AudioRecord.getMinBufferSize(rate,AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT)*3; //get the buffer size to use with this audio record 

      if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { 

      recorder = new AudioRecord (MediaRecorder.AudioSource.MIC,rate,AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT,bufferSize); //instantiate the AudioRecorder 
      srate = rate; 
      break; 
      } 

      } catch (Exception e) { 
       Log.e(TAG, rate + "Exception, keep trying.",e); 
      } 
     } 


      recording=true; //variable to use start or stop recording 
      audioData = new short [bufferSize]; //short array that pcm data is put into. 
      Log.i(TAG,"Got buffer size =" + bufferSize);     
      while (recording) { //loop while recording is needed 
        Log.i(TAG,"in while 1"); 
      if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED) // check to see if the recorder has initialized yet. 
      if (recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED) 
      recorder.startRecording(); //check to see if the Recorder has stopped or is not recording, and make it record. 

      else { 
        Log.i(TAG,"in else"); 
      recorder.read(audioData,0,bufferSize); //read the PCM audio data into the audioData array 

      numCrossing=0; //initialize your number of zero crossings to 0 
      for (p=0;p<bufferSize/4;p+=4) { 
        if (audioData[p]>0 && audioData[p+1]<=0) numCrossing++; 
        if (audioData[p]<0 && audioData[p+1]>=0) numCrossing++; 
        if (audioData[p+1]>0 && audioData[p+2]<=0) numCrossing++; 
        if (audioData[p+1]<0 && audioData[p+2]>=0) numCrossing++; 
        if (audioData[p+2]>0 && audioData[p+3]<=0) numCrossing++; 
        if (audioData[p+2]<0 && audioData[p+3]>=0) numCrossing++; 
        if (audioData[p+3]>0 && audioData[p+4]<=0) numCrossing++; 
        if (audioData[p+3]<0 && audioData[p+4]>=0) numCrossing++; 
        }//for p 

       for (p=(bufferSize/4)*4;p<bufferSize-1;p++) { 
        if (audioData[p]>0 && audioData[p+1]<=0) numCrossing++; 
        if (audioData[p]<0 && audioData[p+1]>=0) numCrossing++; 
        } 



      frequency=(srate/bufferSize)*(numCrossing/2);//calculating frequency 

      Log.i(TAG, "Calculated Frequency"); 
      runOnUiThread(new Runnable(){ 
       public void run() 
       { 
        Log.i(TAG,"In printing statement"); 
        disp.setText("The frequency is " + frequency); 
        if(frequency>=15000) 
         recording = false; 
       } 
      }); 


      }//else recorder started 


    } //while recording 

    if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING) 
    recorder.stop(); //stop the recorder before ending the thread 
    recorder.release(); //release the recorders resources 
    recorder=null; //set the recorder to be garbage collected. 

} // запустить

}); 
    t1.start(); 
} 

}

ответ

0

Я не сделал исчерпывающее чтение вашего кода, но я вижу, что вы настраиваете запись = ложь только тогда, когда частота> = 15000. Вы потенциально не выходите из цикла while.

BTW ... Я считаю, что это то, что происходит ... ваша нить связывает ресурсы записи вашего устройства. Когда вы покидаете действие, оставив приложение, поток продолжает работать. Когда вы снова пытаетесь запустить приложение, создается новый поток, но старый все еще работает и все еще связывает ресурсы записи. Я полагаю, переустановка приложения приводит к убийству этой изгоев.

+0

ok .. поэтому я могу сохранить что-то вроде кнопки остановки, чтобы остановить его и установить запись = false? – user2463212

+0

Да. То, что вы в конечном итоге сделаете, это установить переменную в потоке пользовательского интерфейса (или «основного»), который вы затем ссылаетесь в своей записи. Помните о синхронизации между потоками. Это особенно хороший учебник: http://math.hws.edu/javanotes/c12/s1.html Раздел 12.1.3 особенно применим. – UpLate

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