audio: fix getFrame overflow after long-term playback
The aidl implementation of getFrameCount() encounters an overflow,
causing the audio position to become abnormal. Since the return
type of getFrameCount is long which size is 4 byptes, it will
encounter an overflow after 12.43 hours of continuous playback.
Bug: 387877971
Change-Id: I3bce2730e28ebfe3f2237cff94342aac2a2eb9ef
diff --git a/audio/aidl/default/include/core-impl/Stream.h b/audio/aidl/default/include/core-impl/Stream.h
index 304f9b7..d8bac82 100644
--- a/audio/aidl/default/include/core-impl/Stream.h
+++ b/audio/aidl/default/include/core-impl/Stream.h
@@ -146,8 +146,8 @@
// locking because it only cleans MQ pointers which were also set on the Binder thread.
void reset();
// 'advanceFrameCount' and 'getFrameCount' are only called on the worker thread.
- long advanceFrameCount(size_t increase) { return mFrameCount += increase; }
- long getFrameCount() const { return mFrameCount; }
+ int64_t advanceFrameCount(size_t increase) { return mFrameCount += increase; }
+ int64_t getFrameCount() const { return mFrameCount; }
private:
// Fields are non const to allow move assignment.
@@ -165,7 +165,7 @@
std::shared_ptr<IStreamOutEventCallback> mOutEventCallback; // Only used by output streams
std::weak_ptr<sounddose::StreamDataProcessorInterface> mStreamDataProcessor;
DebugParameters mDebugParameters;
- long mFrameCount = 0;
+ int64_t mFrameCount = 0;
};
// This interface provides operations of the stream which are executed on the worker thread.