1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

AudioRecord Class Probleme mit Callback

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Wanderer, 11.02.2010.

  1. Wanderer, 11.02.2010 #1
    Wanderer

    Wanderer Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    29.01.2010
    Phone:
    Motorola Milestone
    Hallo!

    meine Applikation soll Audio Daten in den Arbeitsspeicher aufnehmen, und dann weiterverarbeiten. Deshalb benutze ich die AudioRecord Klasse und nicht den MediaRecorder.

    Bisher hatte ich einen Loop, der per "read" AudioDaten abholt und dann für eine weile schlafen gelegt wird. Das hat prinzipiell funktioniert, nur dass das Device extrem langsam wurde (trotz des schlafens).
    Ich habe das nun umgekrempelt und will mit dem "OnRecordPositionUpdateListener" auf hereinkommende Daten reagieren.
    Alles scheint zu funktionieren (Öffnen des Audio Devices etc.), nur wird der Listener scheinbar nie aufgerufen. Weiss jemand, warum?

    Info:
    Ich arbeite auf einem echten Device, kein Emulator. Das Aufnahme in einem Pseudo Busy Loop funktioniert. Nur die CallBack Funktionen des Listeners werden nie aufgerufen.

    Hier ist ein Auschnitt aus meinem Source:
    Code:
    public class myApplication extends Activity {
    
      /* audio recording */
      private static final int AUDIO_SAMPLE_FREQ = 16000;
      private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ * 2 * 3; // = 3000ms
      private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE = AUDIO_SAMPLE_FREQ  / 10 * 2; // = 200ms
    
      private short[] mAudioBuffer = null; // audio buffer
      private int mSamplesRead; // how many samples are recently read
      private AudioRecord mAudioRecorder; // Audio Recorder
    
      ...
    
      private OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener() {
      
        public void onPeriodicNotification(AudioRecord recorder) {
          mSamplesRead = recorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
          if (mSamplesRead > 0) {
    
            // do something here...
    
          }
        }
    
        public void onMarkerReached(AudioRecord recorder) {
          Error("What? Hu!? Where am I?");
        }
      };
    
      ...
    
      public void onCreate(Bundle savedInstanceState) {
    
      try {
          mAudioRecorder = new AudioRecord(
              android.media.MediaRecorder.AudioSource.MIC, 
              AUDIO_SAMPLE_FREQ,
              AudioFormat.CHANNEL_CONFIGURATION_MONO,
              AudioFormat.ENCODING_PCM_16BIT,  
              AUDIO_BUFFER_BYTESIZE);
        } catch (Exception e) {
          Error("Unable to init audio recording!");
        }
    
        mAudioBuffer = new short[AUDIO_BUFFER_SAMPLEREAD_SIZE];
        mAudioRecorder.setPositionNotificationPeriod(AUDIO_BUFFER_SAMPLEREAD_SIZE);
        mAudioRecorder.setRecordPositionUpdateListener(mRecordListener);
        mAudioRecorder.startRecording();
    	
        /* test if I can read anything at all... (and yes, this here works!) */
        mSamplesRead = mAudioRecorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
    
      }
    }
    
     
    Zuletzt bearbeitet: 11.02.2010
  2. Wanderer, 15.02.2010 #2
    Wanderer

    Wanderer Threadstarter Neuer Benutzer

    Beiträge:
    7
    Erhaltene Danke:
    0
    Registriert seit:
    29.01.2010
    Phone:
    Motorola Milestone
    Benutzen denn alle hier die Audio Aufname per Busy-Loop?
     
  3. Dickwan, 06.03.2011 #3
    Dickwan

    Dickwan Neuer Benutzer

    Beiträge:
    1
    Erhaltene Danke:
    0
    Registriert seit:
    06.03.2011
    Hallo Wander,
    konntest du das problem lösen. Ihc habe auch erst mit der Schleife aufgenommen. War aber mit der lösung nicht ganz zufrieden.
    der Ansatz mit dem updateListener funktionner ganz gu bei mit. hier ein Auszug vom Kode:

    Code:
    /* Method used for recording */
        private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener() {
            
            @Override
            public void onPeriodicNotification(AudioRecord arg0) {
                // Fill buffer
                wavRecorder.read(buffer, 0,buffer.length);
                
                try {
                    if (state == State.RECORDING){
                    // Write buffer to file
                    randomAccessWriter.write(buffer);
                    // Update data size
                    payloadSize += buffer.length;
                    Log.i(TAG, "Recorder is "+ getState());
                   }
                } catch (IOException e) {
                    Log.e(TAG, "Error in updateListener, recording aborted", e);
                    stop();
                }
            }
            
            @Override
            public void onMarkerReached(AudioRecord arg0) {
                Log.i(TAG, "Marker reached");
            }
        };
    Dein Code sieht eigentlich ganz in Ordnung. Sollte es nicht funzen. Überprüfe mal ganz genau ob der Configurations Parameters für den audioRecord object correct sind. Ist mal nämlich das Problem bei mir gewesen.
    
    
    ich habe mich stark an dem code von Rehearsal Assistant orientiert.


    Hoffe est hilft.

    Ich habe allerding noch zwischen durch Bufferoverflows, die ich nicht beseitigen könnte.

    PS: Arbeit bis jez nur mit dem Emulator (und seine Beschränkungen:thumbdn:)

    Gruß

    Dickwan
     

Diese Seite empfehlen