BufferProvider: Clear out mBuffer when changing upstream BufferProvider
Test: QCOM internal stress test
Bug: 111313529
Change-Id: Ieb7a61eddeb85528fabf7ad8f74b5104d50c2339
diff --git a/media/libaudioprocessing/BufferProviders.cpp b/media/libaudioprocessing/BufferProviders.cpp
index 2d9e1cb..e06a1aa 100644
--- a/media/libaudioprocessing/BufferProviders.cpp
+++ b/media/libaudioprocessing/BufferProviders.cpp
@@ -63,7 +63,8 @@
CopyBufferProvider::~CopyBufferProvider()
{
- ALOGV("~CopyBufferProvider(%p)", this);
+ ALOGV("%s(%p) %zu %p %p",
+ __func__, this, mBuffer.frameCount, mTrackBufferProvider, mLocalBufferData);
if (mBuffer.frameCount != 0) {
mTrackBufferProvider->releaseBuffer(&mBuffer);
}
@@ -133,6 +134,16 @@
mConsumed = 0;
}
+void CopyBufferProvider::setBufferProvider(AudioBufferProvider *p) {
+ ALOGV("%s(%p): mTrackBufferProvider:%p mBuffer.frameCount:%zu",
+ __func__, p, mTrackBufferProvider, mBuffer.frameCount);
+ if (mTrackBufferProvider == p) {
+ return;
+ }
+ mBuffer.frameCount = 0;
+ PassthruBufferProvider::setBufferProvider(p);
+}
+
DownmixerBufferProvider::DownmixerBufferProvider(
audio_channel_mask_t inputChannelMask,
audio_channel_mask_t outputChannelMask, audio_format_t format,
@@ -528,6 +539,16 @@
mRemaining = 0;
}
+void TimestretchBufferProvider::setBufferProvider(AudioBufferProvider *p) {
+ ALOGV("%s(%p): mTrackBufferProvider:%p mBuffer.frameCount:%zu",
+ __func__, p, mTrackBufferProvider, mBuffer.frameCount);
+ if (mTrackBufferProvider == p) {
+ return;
+ }
+ mBuffer.frameCount = 0;
+ PassthruBufferProvider::setBufferProvider(p);
+}
+
status_t TimestretchBufferProvider::setPlaybackRate(const AudioPlaybackRate &playbackRate)
{
mPlaybackRate = playbackRate;
diff --git a/media/libmedia/include/media/BufferProviders.h b/media/libmedia/include/media/BufferProviders.h
index d6a9cfb..2f1a91c 100644
--- a/media/libmedia/include/media/BufferProviders.h
+++ b/media/libmedia/include/media/BufferProviders.h
@@ -78,6 +78,7 @@
// Overrides PassthruBufferProvider
virtual void reset();
+ void setBufferProvider(AudioBufferProvider *p) override;
// this function should be supplied by the derived class. It converts
// #frames in the *src pointer to the *dst pointer. It is public because
@@ -186,6 +187,7 @@
// Overrides PassthruBufferProvider
virtual void reset();
+ void setBufferProvider(AudioBufferProvider *p) override;
virtual status_t setPlaybackRate(const AudioPlaybackRate &playbackRate);