aaudio: cache framesPerBurst and capacity
These do not change after opening the stream so we can
simply return a stored value and avoid querying the device.
Test: atest AAudioTests
Change-Id: I7a66c12bd695fd732194ff0a14ac9c8d9cacf923
diff --git a/media/libaaudio/src/legacy/AudioStreamLegacy.h b/media/libaaudio/src/legacy/AudioStreamLegacy.h
index fefe6e0..88ef270 100644
--- a/media/libaaudio/src/legacy/AudioStreamLegacy.h
+++ b/media/libaaudio/src/legacy/AudioStreamLegacy.h
@@ -112,6 +112,18 @@
return mFramesRead.increment(frames);
}
+ /**
+ * Get the framesPerBurst from the underlying API.
+ * @return framesPerBurst
+ */
+ virtual int32_t getFramesPerBurstFromDevice() const = 0;
+
+ /**
+ * Get the bufferCapacity from the underlying API.
+ * @return bufferCapacity in frames
+ */
+ virtual int32_t getBufferCapacityFromDevice() const = 0;
+
// This is used for exact matching by MediaMetrics. So do not change it.
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_AAUDIO
static constexpr char kCallerName[] = "aaudio";
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.cpp b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
index a8ae0fb..d46ef56 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
@@ -210,9 +210,9 @@
// Get the actual values from the AudioRecord.
setSamplesPerFrame(mAudioRecord->channelCount());
-
- int32_t actualSampleRate = mAudioRecord->getSampleRate();
- setSampleRate(actualSampleRate);
+ setSampleRate(mAudioRecord->getSampleRate());
+ setBufferCapacity(getBufferCapacityFromDevice());
+ setFramesPerBurst(getFramesPerBurstFromDevice());
// We may need to pass the data through a block size adapter to guarantee constant size.
if (mCallbackBufferSize != AAUDIO_UNSPECIFIED) {
@@ -488,7 +488,7 @@
return getBufferCapacity(); // TODO implement in AudioRecord?
}
-int32_t AudioStreamRecord::getBufferCapacity() const
+int32_t AudioStreamRecord::getBufferCapacityFromDevice() const
{
return static_cast<int32_t>(mAudioRecord->frameCount());
}
@@ -498,8 +498,7 @@
return 0; // TODO implement when AudioRecord supports it
}
-int32_t AudioStreamRecord::getFramesPerBurst() const
-{
+int32_t AudioStreamRecord::getFramesPerBurstFromDevice() const {
return static_cast<int32_t>(mAudioRecord->getNotificationPeriodInFrames());
}
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.h b/media/libaaudio/src/legacy/AudioStreamRecord.h
index e4ef1c0..ad8dfe4 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.h
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.h
@@ -56,14 +56,10 @@
int32_t getBufferSize() const override;
- int32_t getBufferCapacity() const override;
-
int32_t getXRunCount() const override;
int64_t getFramesWritten() override;
- int32_t getFramesPerBurst() const override;
-
aaudio_result_t updateStateMachine() override;
aaudio_direction_t getDirection() const override {
@@ -79,6 +75,11 @@
const void * maybeConvertDeviceData(const void *audioData, int32_t numFrames) override;
+protected:
+
+ int32_t getFramesPerBurstFromDevice() const override;
+ int32_t getBufferCapacityFromDevice() const override;
+
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 4ba08fd..307904e 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -192,9 +192,9 @@
setSamplesPerFrame(mAudioTrack->channelCount());
setFormat(mAudioTrack->format());
setDeviceFormat(mAudioTrack->format());
-
- int32_t actualSampleRate = mAudioTrack->getSampleRate();
- setSampleRate(actualSampleRate);
+ setSampleRate(mAudioTrack->getSampleRate());
+ setBufferCapacity(getBufferCapacityFromDevice());
+ setFramesPerBurst(getFramesPerBurstFromDevice());
// We may need to pass the data through a block size adapter to guarantee constant size.
if (mCallbackBufferSize != AAUDIO_UNSPECIFIED) {
@@ -217,9 +217,6 @@
: (aaudio_session_id_t) mAudioTrack->getSessionId();
setSessionId(actualSessionId);
- mInitialBufferCapacity = getBufferCapacity();
- mInitialFramesPerBurst = getFramesPerBurst();
-
mAudioTrack->addAudioDeviceCallback(this);
// Update performance mode based on the actual stream flags.
@@ -284,8 +281,8 @@
|| mAudioTrack->format() != getFormat()
|| mAudioTrack->getSampleRate() != getSampleRate()
|| mAudioTrack->getRoutedDeviceId() != getDeviceId()
- || getBufferCapacity() != mInitialBufferCapacity
- || getFramesPerBurst() != mInitialFramesPerBurst) {
+ || getBufferCapacityFromDevice() != getBufferCapacity()
+ || getFramesPerBurstFromDevice() != getFramesPerBurst()) {
processCallbackCommon(AAUDIO_CALLBACK_OPERATION_DISCONNECTED, info);
}
break;
@@ -474,7 +471,7 @@
return static_cast<int32_t>(mAudioTrack->getBufferSizeInFrames());
}
-int32_t AudioStreamTrack::getBufferCapacity() const
+int32_t AudioStreamTrack::getBufferCapacityFromDevice() const
{
return static_cast<int32_t>(mAudioTrack->frameCount());
}
@@ -484,8 +481,7 @@
return static_cast<int32_t>(mAudioTrack->getUnderrunCount());
}
-int32_t AudioStreamTrack::getFramesPerBurst() const
-{
+int32_t AudioStreamTrack::getFramesPerBurstFromDevice() const {
return static_cast<int32_t>(mAudioTrack->getNotificationPeriodInFrames());
}
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.h b/media/libaaudio/src/legacy/AudioStreamTrack.h
index 6334f66..5a8fb39 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.h
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.h
@@ -69,8 +69,6 @@
aaudio_result_t setBufferSize(int32_t requestedFrames) override;
int32_t getBufferSize() const override;
- int32_t getBufferCapacity() const override;
- int32_t getFramesPerBurst()const override;
int32_t getXRunCount() const override;
int64_t getFramesRead() override;
@@ -96,6 +94,11 @@
const android::media::VolumeShaper::Operation& operation) override;
#endif
+protected:
+
+ int32_t getFramesPerBurstFromDevice() const override;
+ int32_t getBufferCapacityFromDevice() const override;
+
private:
android::sp<android::AudioTrack> mAudioTrack;
@@ -105,10 +108,6 @@
// TODO add 64-bit position reporting to AudioTrack and use it.
aaudio_wrapping_frames_t mPositionWhenPausing = 0;
-
- // initial AudioTrack frame count and notification period
- int32_t mInitialBufferCapacity = 0;
- int32_t mInitialFramesPerBurst = 0;
};
} /* namespace aaudio */