OSDN Git Service

Fix bug 3009239
authorJean-Michel Trivi <jmtrivi@google.com>
Mon, 20 Sep 2010 02:21:36 +0000 (19:21 -0700)
committerJean-Michel Trivi <jmtrivi@google.com>
Mon, 20 Sep 2010 02:21:36 +0000 (19:21 -0700)
Query AudioRecord position for SLRecordItf->GetPosition()

Change-Id: I1a520b281d44105d34c92fd555e71013d5170c76

opensles/libopensles/IRecord.c
opensles/libopensles/android_AudioRecorder.cpp
opensles/libopensles/android_AudioRecorder.h

index 9e779fd..f39459c 100644 (file)
@@ -92,9 +92,19 @@ static SLresult IRecord_GetPosition(SLRecordItf self, SLmillisecond *pMsec)
         result = SL_RESULT_PARAMETER_INVALID;
     } else {
         IRecord *this = (IRecord *) self;
-        interface_lock_peek(this);
+        SLmillisecond position;
+        interface_lock_shared(this);
+#ifdef ANDROID
+        // Android does not use the mPosition field for audio recorders
+        if (SL_OBJECTID_AUDIORECORDER == InterfaceToObjectID(this)) {
+            android_audioRecorder_getPosition(InterfaceToCAudioRecorder(this), &position);
+        } else {
+            position = this->mPosition;
+        }
+#else
         SLmillisecond position = this->mPosition;
-        interface_unlock_peek(this);
+#endif
+        interface_unlock_shared(this);
         *pMsec = position;
         result = SL_RESULT_SUCCESS;
     }
index f86e7e2..e1e942e 100644 (file)
@@ -290,6 +290,9 @@ SLresult android_audioRecorder_create(CAudioRecorder* ar) {
 
     SLresult result = SL_RESULT_SUCCESS;
 
+    ar->mNumChannels = 0;
+    ar->mSampleRateMilliHz = 0;
+
     ar->mAudioRecord = NULL;
     ar->mRecordSource = android::AUDIO_SOURCE_DEFAULT;
 
@@ -471,6 +474,7 @@ void android_audioRecorder_useEventMask(CAudioRecorder *ar) {
     }
 
     if (eventFlags & SL_RECORDEVENT_HEADATNEWPOS) {
+        SL_LOGV("pos update period %ld", pRecordItf->mPositionUpdatePeriod);
          ar->mAudioRecord->setPositionUpdatePeriod(
                 (uint32_t)((((int64_t)pRecordItf->mPositionUpdatePeriod
                 * sles_to_android_sampleRate(ar->mSampleRateMilliHz)))/1000));
@@ -503,3 +507,20 @@ void android_audioRecorder_useEventMask(CAudioRecorder *ar) {
     }
 
 }
+
+
+//-----------------------------------------------------------------------------
+void android_audioRecorder_getPosition(CAudioRecorder *ar, SLmillisecond *pPosMsec) {
+    if ((NULL == ar) || (NULL == ar->mAudioRecord)) {
+        *pPosMsec = 0;
+    } else {
+        uint32_t positionInFrames;
+        ar->mAudioRecord->getPosition(&positionInFrames);
+        if (ar->mSampleRateMilliHz == 0) {
+            *pPosMsec = 0;
+        } else {
+            *pPosMsec = ((int64_t)positionInFrames * 1000) /
+                    sles_to_android_sampleRate(ar->mSampleRateMilliHz);
+        }
+    }
+}
index 6720e86..43eeb16 100644 (file)
@@ -54,3 +54,6 @@ extern void android_audioRecorder_destroy(CAudioRecorder* ar);
 extern void android_audioRecorder_setRecordState(CAudioRecorder* ar, SLuint32 state);
 
 extern void android_audioRecorder_useEventMask(CAudioRecorder *ar);
+
+extern void android_audioRecorder_getPosition(CAudioRecorder *ar, SLmillisecond *pPosMsec);
+