aaudio: Fix getFramesWritten() for callback mode.
Plus other small fixes for CTS and cleanup
Bug: 37910599
Test: test_aaudio.cpp
Change-Id: I65a23daf99e9de857d3ce9fd12e9f11c614e298e
Signed-off-by: Phil Burk <philburk@google.com>
diff --git a/media/libaaudio/src/client/AudioStreamInternal.cpp b/media/libaaudio/src/client/AudioStreamInternal.cpp
index 810751a..5214db8 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternal.cpp
@@ -791,4 +791,10 @@
return framesRead;
}
-// TODO implement getTimestamp
+int64_t AudioStreamInternal::getFramesWritten()
+{
+ int64_t getFramesWritten = mAudioEndpoint.getDownDataWriteCounter()
+ + mFramesOffsetFromService;
+ ALOGD_IF(MYLOG_CONDITION, "AudioStreamInternal::getFramesWritten() returns %lld", (long long)getFramesWritten);
+ return getFramesWritten;
+}
diff --git a/media/libaaudio/src/client/AudioStreamInternal.h b/media/libaaudio/src/client/AudioStreamInternal.h
index e550ba3..18a55cf 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.h
+++ b/media/libaaudio/src/client/AudioStreamInternal.h
@@ -77,6 +77,7 @@
int32_t getFramesPerBurst() const override;
int64_t getFramesRead() override;
+ int64_t getFramesWritten() override;
int32_t getXRunCount() const override {
return mXRunCount;
diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp
index 462ecb3..e5239e8 100644
--- a/media/libaaudio/src/core/AAudioAudio.cpp
+++ b/media/libaaudio/src/core/AAudioAudio.cpp
@@ -195,26 +195,21 @@
streamBuilder->setFramesPerDataCallback(frames);
}
-// TODO merge AAudioInternal_openStream into AAudioStreamBuilder_openStream
-static aaudio_result_t AAudioInternal_openStream(AudioStreamBuilder *streamBuilder,
- AAudioStream** streamPtr)
-{
- AudioStream *audioStream = nullptr;
- aaudio_result_t result = streamBuilder->build(&audioStream);
- if (result != AAUDIO_OK) {
- return result;
- } else {
- *streamPtr = (AAudioStream*) audioStream;
- return AAUDIO_OK;
- }
-}
-
AAUDIO_API aaudio_result_t AAudioStreamBuilder_openStream(AAudioStreamBuilder* builder,
AAudioStream** streamPtr)
{
+ AudioStream *audioStream = nullptr;
ALOGD("AAudioStreamBuilder_openStream() ----------------------------------------------");
AudioStreamBuilder *streamBuilder = COMMON_GET_FROM_BUILDER_OR_RETURN(streamPtr);
- return AAudioInternal_openStream(streamBuilder, streamPtr);
+ aaudio_result_t result = streamBuilder->build(&audioStream);
+ ALOGD("AAudioStreamBuilder_openStream() returns %d -----------------------------------",
+ result);
+ if (result == AAUDIO_OK) {
+ *streamPtr = (AAudioStream*) audioStream;
+ } else {
+ *streamPtr = nullptr;
+ }
+ return result;
}
AAUDIO_API aaudio_result_t AAudioStreamBuilder_delete(AAudioStreamBuilder* builder)
diff --git a/media/libaaudio/src/core/AudioStream.cpp b/media/libaaudio/src/core/AudioStream.cpp
index 9690848..598fbaa 100644
--- a/media/libaaudio/src/core/AudioStream.cpp
+++ b/media/libaaudio/src/core/AudioStream.cpp
@@ -52,6 +52,7 @@
mDataCallbackProc = builder.getDataCallbackProc();
mErrorCallbackProc = builder.getErrorCallbackProc();
mDataCallbackUserData = builder.getDataCallbackUserData();
+ mErrorCallbackUserData = builder.getErrorCallbackUserData();
// This is very helpful for debugging in the future.
ALOGI("AudioStream.open(): rate = %d, channels = %d, format = %d, sharing = %d",
diff --git a/media/libaaudio/src/core/AudioStream.h b/media/libaaudio/src/core/AudioStream.h
index 916870b..74a1f77 100644
--- a/media/libaaudio/src/core/AudioStream.h
+++ b/media/libaaudio/src/core/AudioStream.h
@@ -223,11 +223,11 @@
protected:
virtual int64_t incrementFramesWritten(int32_t frames) {
- return static_cast<int64_t>(mFramesWritten.increment(frames));
+ return mFramesWritten.increment(frames);
}
virtual int64_t incrementFramesRead(int32_t frames) {
- return static_cast<int64_t>(mFramesRead.increment(frames));
+ return mFramesRead.increment(frames);
}
/**
diff --git a/media/libaaudio/src/core/AudioStreamBuilder.cpp b/media/libaaudio/src/core/AudioStreamBuilder.cpp
index 4e0b8c6..d51eeb3 100644
--- a/media/libaaudio/src/core/AudioStreamBuilder.cpp
+++ b/media/libaaudio/src/core/AudioStreamBuilder.cpp
@@ -108,5 +108,6 @@
} else {
*streamPtr = audioStream;
}
+ ALOGD("AudioStreamBuilder(): return %d", result);
return result;
}
diff --git a/media/libaaudio/src/legacy/AudioStreamLegacy.cpp b/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
index baa24c9..59d754a 100644
--- a/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamLegacy.cpp
@@ -83,6 +83,7 @@
}
if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) {
audioBuffer->size = audioBuffer->frameCount * getBytesPerFrame();
+ incrementClientFrameCounter(audioBuffer->frameCount);
} else {
audioBuffer->size = 0;
}
@@ -107,4 +108,3 @@
break;
}
}
-
diff --git a/media/libaaudio/src/legacy/AudioStreamLegacy.h b/media/libaaudio/src/legacy/AudioStreamLegacy.h
index c109ee7..d5a3ede 100644
--- a/media/libaaudio/src/legacy/AudioStreamLegacy.h
+++ b/media/libaaudio/src/legacy/AudioStreamLegacy.h
@@ -70,6 +70,8 @@
// Implement FixedBlockProcessor
int32_t onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) override;
+ virtual int64_t incrementClientFrameCounter(int32_t frames) = 0;
+
protected:
FixedBlockAdapter *mBlockAdapter = nullptr;
aaudio_wrapping_frames_t mPositionWhenStarting = 0;
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.h b/media/libaaudio/src/legacy/AudioStreamRecord.h
index 897a5b3..f4a78e1 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.h
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.h
@@ -68,6 +68,10 @@
// This is public so it can be called from the C callback function.
void processCallback(int event, void *info) override;
+ int64_t incrementClientFrameCounter(int32_t frames) override {
+ return incrementFramesRead(frames);
+ }
+
private:
android::sp<android::AudioRecord> mAudioRecord;
// adapts between variable sized blocks and fixed size blocks
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index 96fd427..b71b74a 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -357,6 +357,8 @@
case AAUDIO_STREAM_STATE_STARTING:
case AAUDIO_STREAM_STATE_STARTED:
case AAUDIO_STREAM_STATE_STOPPING:
+ case AAUDIO_STREAM_STATE_PAUSING:
+ case AAUDIO_STREAM_STATE_PAUSED:
result = mAudioTrack->getPosition(&position);
if (result == OK) {
mFramesRead.update32(position);
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.h b/media/libaaudio/src/legacy/AudioStreamTrack.h
index 29f5d15..186a08e 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.h
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.h
@@ -68,6 +68,10 @@
// This is public so it can be called from the C callback function.
void processCallback(int event, void *info) override;
+ int64_t incrementClientFrameCounter(int32_t frames) override {
+ return incrementFramesWritten(frames);
+ }
+
private:
android::sp<android::AudioTrack> mAudioTrack;