AudioRecord Class Probleme mit Callback

Wanderer

Wanderer

Neues Mitglied
0
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:
Benutzen denn alle hier die Audio Aufname per Busy-Loop?
 
Wanderer schrieb:
Benutzen denn alle hier die Audio Aufname per Busy-Loop?
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
 

Ähnliche Themen

S
Antworten
4
Aufrufe
956
Sempervivum
S
R
Antworten
3
Aufrufe
1.571
Ritartet
R
B
Antworten
4
Aufrufe
433
bb321
B
Zurück
Oben Unten