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;
}
SLresult result = SL_RESULT_SUCCESS;
+ ar->mNumChannels = 0;
+ ar->mSampleRateMilliHz = 0;
+
ar->mAudioRecord = NULL;
ar->mRecordSource = android::AUDIO_SOURCE_DEFAULT;
}
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));
}
}
+
+
+//-----------------------------------------------------------------------------
+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);
+ }
+ }
+}
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);
+