diff options
| author | Jean-Michel Trivi <> | 2009-03-24 17:55:14 -0700 | 
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-24 17:55:14 -0700 | 
| commit | 470f71f4a4d6d3a504b62473bd435bf80493414f (patch) | |
| tree | 826fde73356264b2f803b7ad41ebcb2e0f9ea303 /media/java | |
| parent | de7c071e7391faac28e3de8a4891f0f564c37e04 (diff) | |
| download | frameworks_base-470f71f4a4d6d3a504b62473bd435bf80493414f.zip frameworks_base-470f71f4a4d6d3a504b62473bd435bf80493414f.tar.gz frameworks_base-470f71f4a4d6d3a504b62473bd435bf80493414f.tar.bz2 | |
Automated import from //branches/donutburger/...@140566,140566
Diffstat (limited to 'media/java')
| -rw-r--r-- | media/java/android/media/AudioRecord.java | 161 | 
1 files changed, 74 insertions, 87 deletions
| diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 0ef7760..a49bd67 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -165,27 +165,24 @@ public class AudioRecord       */      private Object mRecordingStateLock = new Object();      /** -     * The listener the AudioRecord notifies when a previously set marker is reached. -     *  @see #setMarkerReachedListener(OnMarkerReachedListener) +     * The listener the AudioRecord notifies when the record position reaches a marker +     * or for periodic updates during the progression of the record head. +     *  @see #setRecordPositionUpdateListener(OnRecordPositionUpdateListener) +     *  @see #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)       */ -    private OnMarkerReachedListener mMarkerListener = null; +    private OnRecordPositionUpdateListener mPositionListener = null;      /** -     * Lock to protect marker listener updates against event notifications +     * Lock to protect position listener updates against event notifications       */ -    private final Object mMarkerListenerLock = new Object(); +    private final Object mPositionListenerLock = new Object();      /** -     * The listener the AudioRecord notifies periodically during recording. -     *  @see #setPeriodicNotificationListener(OnPeriodicNotificationListener) +     * Handler for marker events coming from the native code       */ -    private OnPeriodicNotificationListener mPeriodicListener = null; +    private NativeEventHandler mEventHandler = null;      /** -     * Lock to protect periodic listener updates against event notifications +     * Looper associated with the thread that creates the AudioRecord instance       */ -    private final Object mPeriodicListenerLock = new Object(); -    /** -     * Handler for events coming from the native code -     */ -    private NativeEventHandler mNativeEventHandler = null; +    private Looper mInitializationLooper = null;      /**       * Size of the native audio buffer.       */ @@ -217,6 +214,11 @@ public class AudioRecord      throws IllegalArgumentException {             mState = STATE_UNINITIALIZED;          mRecordingState = RECORDSTATE_STOPPED; +         +        // remember which looper is associated with the AudioRecord instanciation +        if ((mInitializationLooper = Looper.myLooper()) == null) { +            mInitializationLooper = Looper.getMainLooper(); +        }          audioParamCheck(audioSource, sampleRateInHz, channelConfig, audioFormat); @@ -319,21 +321,6 @@ public class AudioRecord      }     -    // Convenience method for the creation of the native event handler -    // It is called only when a non-null event listener is set. -    // precondition: -    //    mNativeEventHandler is null -    private void createNativeEventHandler() { -        Looper looper; -        if ((looper = Looper.myLooper()) != null) { -            mNativeEventHandler = new NativeEventHandler(this, looper); -        } else if ((looper = Looper.getMainLooper()) != null) { -            mNativeEventHandler = new NativeEventHandler(this, looper); -        } else { -            mNativeEventHandler = null; -        } -    } -          /**       * Releases the native AudioRecord resources. @@ -433,7 +420,6 @@ public class AudioRecord      }      /** -     * {@hide}       * Returns the minimum buffer size required for the successful creation of an AudioRecord       * object.       * @param sampleRateInHz the sample rate expressed in Hertz. @@ -602,36 +588,40 @@ public class AudioRecord      // Initialization / configuration      //--------------------        /** -     * Sets the listener the AudioRecord notifies when a previously set marker is reached. +     * Sets the listener the AudioRecord notifies when a previously set marker is reached or +     * for each periodic record head position update.       * @param listener       */ -    public void setMarkerReachedListener(OnMarkerReachedListener listener) { -        synchronized (mMarkerListenerLock) { -            mMarkerListener = listener; -        } -        if ((listener != null) && (mNativeEventHandler == null)) { -            createNativeEventHandler(); -        } +    public void setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener) { +        setRecordPositionUpdateListener(listener, null);      } -     -    /** -     * Sets the listener the AudioRecord notifies periodically during recording. -     * @param listener -     */ -    public void setPeriodicNotificationListener(OnPeriodicNotificationListener listener) { -        synchronized (mPeriodicListenerLock) { -            mPeriodicListener = listener; -        } -        if ((listener != null) && (mNativeEventHandler == null)) { -            createNativeEventHandler(); + +    public void setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener,  +                                                    Handler handler) { +        synchronized (mPositionListenerLock) { +             +            mPositionListener = listener; +             +            if (listener != null) { +                if (handler != null) { +                    mEventHandler = new NativeEventHandler(this, handler.getLooper()); +                } else { +                    // no given handler, use the looper the AudioRecord was created in +                    mEventHandler = new NativeEventHandler(this, mInitializationLooper); +                } +            } else { +                mEventHandler = null; +            }          } +              }      /** -     * Sets the marker position at which the listener, if set with  -     * {@link #setMarkerReachedListener(OnMarkerReachedListener)}, is called. +     * Sets the marker position at which the listener is called, if set with  +     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener)} or  +     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)}.       * @param markerInFrames marker position expressed in frames       * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},       *  {@link #ERROR_INVALID_OPERATION}  @@ -642,8 +632,9 @@ public class AudioRecord      /** -     * Sets the period at which the listener, if set with -     * {@link #setPositionNotificationPeriod(int)}, is called. +     * Sets the period at which the listener is called, if set with +     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener)} or  +     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)}.       * @param periodInFrames update period expressed in frames       * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_INVALID_OPERATION}       */ @@ -659,70 +650,65 @@ public class AudioRecord       * Interface definition for a callback to be invoked when an AudioRecord has       * reached a notification marker set by setNotificationMarkerPosition().       */ -    public interface OnMarkerReachedListener  { +    public interface OnRecordPositionUpdateListener  {          /**           * Called on the listener to notify it that the previously set marker has been reached           * by the recording head.           */          void onMarkerReached(AudioRecord recorder); -    } - - -    /** -     * Interface definition for a callback to be invoked for each periodic AudioRecord  -     * update during recording. The update interval is set by setPositionNotificationPeriod(). -     */ -    public interface OnPeriodicNotificationListener  { +                  /** -         * Called on the listener to periodically notify it that the recording head has reached +         * Called on the listener to periodically notify it that the record head has reached           * a multiple of the notification period.           */          void onPeriodicNotification(AudioRecord recorder);      } +     +          //---------------------------------------------------------      // Inner classes      //-------------------- +            /** -     * Helper class to handle the forwarding of native events to the appropriate listeners -     */ -    private class NativeEventHandler extends Handler -    { -        private AudioRecord mAudioRecord; - -        public NativeEventHandler(AudioRecord ar, Looper looper) { +     * Helper class to handle the forwarding of native events to the appropriate listener +     * (potentially) handled in a different thread +     */   +    private class NativeEventHandler extends Handler { +         +        private final AudioRecord mAudioRecord; +         +        NativeEventHandler(AudioRecord recorder, Looper looper) {              super(looper); -            mAudioRecord = ar; +            mAudioRecord = recorder;          } - +                  @Override          public void handleMessage(Message msg) { -            if (mAudioRecord == null) { -                return; +            OnRecordPositionUpdateListener listener = null; +            synchronized (mPositionListenerLock) { +                listener = mAudioRecord.mPositionListener;              } +                          switch(msg.what) {              case NATIVE_EVENT_MARKER: -                synchronized (mMarkerListenerLock) { -                    if (mAudioRecord.mMarkerListener != null) { -                        mAudioRecord.mMarkerListener.onMarkerReached(mAudioRecord); -                    } +                if (listener != null) { +                    listener.onMarkerReached(mAudioRecord);                  }                  break;              case NATIVE_EVENT_NEW_POS: -                synchronized (mPeriodicListenerLock) { -                    if (mAudioRecord.mPeriodicListener != null) { -                        mAudioRecord.mPeriodicListener.onPeriodicNotification(mAudioRecord); -                    } +                if (listener != null) { +                    listener.onPeriodicNotification(mAudioRecord);                  }                  break;              default:                  Log.e(TAG, "[ android.media.AudioRecord.NativeEventHandler ] " +                          "Unknown event type: " + msg.what); -                break; +            break;              }          } -    } +    };      //--------------------------------------------------------- @@ -737,9 +723,10 @@ public class AudioRecord              return;          } -        if (recorder.mNativeEventHandler != null) { -            Message m = recorder.mNativeEventHandler.obtainMessage(what, arg1, arg2, obj); -            recorder.mNativeEventHandler.sendMessage(m); +        if (recorder.mEventHandler != null) { +            Message m =  +                recorder.mEventHandler.obtainMessage(what, arg1, arg2, obj); +            recorder.mEventHandler.sendMessage(m);          }      } | 
