libaudiohal@aidl: Fix callbacks handling
- Ensure that 'StreamOutHalInterface' slice pointer is used
by all parties.
- Handle state changes in StreamHalAidl.
- Pace stream state queries by the buffer duration (for sync
modes) or by a fixed amount (for async) and allow it in
any state and from any thread.
Bug: 300416194
Bug: 331300943
Test: mp3 and ogg offloaded playback (bug repro steps)
Change-Id: I953cfc8862aa466d17f7992df052b7b68fb97e0a
diff --git a/media/libaudiohal/impl/StreamHalAidl.h b/media/libaudiohal/impl/StreamHalAidl.h
index 4acc6ac..53d46e5 100644
--- a/media/libaudiohal/impl/StreamHalAidl.h
+++ b/media/libaudiohal/impl/StreamHalAidl.h
@@ -32,6 +32,7 @@
#include <media/audiohal/StreamHalInterface.h>
#include <media/AidlConversionUtil.h>
#include <media/AudioParameter.h>
+#include <mediautils/Synchronization.h>
#include "ConversionHelperAidl.h"
#include "StreamPowerLog.h"
@@ -93,6 +94,9 @@
}
size_t getBufferSizeBytes() const { return mFrameSizeBytes * mBufferSizeFrames; }
size_t getBufferSizeFrames() const { return mBufferSizeFrames; }
+ size_t getBufferDurationMs(int32_t sampleRate) const {
+ return sampleRate != 0 ? mBufferSizeFrames * MILLIS_PER_SECOND / sampleRate : 0;
+ }
CommandMQ* getCommandMQ() const { return mCommandMQ.get(); }
DataMQ* getDataMQ() const { return mDataMQ.get(); }
size_t getFrameSizeBytes() const { return mFrameSizeBytes; }
@@ -232,6 +236,10 @@
status_t exit();
+ void onAsyncTransferReady();
+ void onAsyncDrainReady();
+ void onAsyncError();
+
const bool mIsInput;
const audio_config_base_t mConfig;
const StreamContextAidl mContext;
@@ -257,8 +265,10 @@
const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamCommon> mStream;
const std::shared_ptr<::aidl::android::media::audio::IHalAdapterVendorExtension> mVendorExt;
+ const int64_t mLastReplyLifeTimeNs;
std::mutex mLock;
::aidl::android::hardware::audio::core::StreamDescriptor::Reply mLastReply GUARDED_BY(mLock);
+ int64_t mLastReplyExpirationNs GUARDED_BY(mLock) = 0;
// mStreamPowerLog is used for audio signal power logging.
StreamPowerLog mStreamPowerLog;
std::atomic<pid_t> mWorkerTid = -1;
@@ -266,7 +276,9 @@
class CallbackBroker;
-class StreamOutHalAidl : public StreamOutHalInterface, public StreamHalAidl {
+class StreamOutHalAidl : public virtual StreamOutHalInterface,
+ public virtual StreamOutHalInterfaceCallback,
+ public StreamHalAidl {
public:
// Extract the output stream parameters and set by AIDL APIs.
status_t setParameters(const String8& kvPairs) override;
@@ -344,6 +356,11 @@
status_t exit() override;
+ // StreamOutHalInterfaceCallback
+ void onWriteReady() override;
+ void onDrainReady() override;
+ void onError() override;
+
private:
friend class sp<StreamOutHalAidl>;
@@ -352,6 +369,7 @@
const std::shared_ptr<::aidl::android::hardware::audio::core::IStreamOut> mStream;
const wp<CallbackBroker> mCallbackBroker;
+ mediautils::atomic_wp<StreamOutHalInterfaceCallback> mClientCallback;
AudioOffloadMetadata mOffloadMetadata;