libaudiohal: Properly notify standby state to HAL
Fix the standby state enforcement for output streams.
Also, bypass reading from FMQ on input when no data
is available.
Bug: 206738075
Test: atest audiorecord_tests
Test: atest trackplayerbase_tests
Change-Id: I53d5b1e81a64547c4179950e804058a3ed9f5871
Signed-off-by: Jasmine Cha <chajasmine@google.com>
diff --git a/media/libaudiohal/impl/StreamHalAidl.cpp b/media/libaudiohal/impl/StreamHalAidl.cpp
index 17b3c2e..feef885 100644
--- a/media/libaudiohal/impl/StreamHalAidl.cpp
+++ b/media/libaudiohal/impl/StreamHalAidl.cpp
@@ -172,10 +172,17 @@
FALLTHROUGH_INTENDED;
case StreamDescriptor::State::PAUSED:
case StreamDescriptor::State::DRAIN_PAUSED:
- return flush();
+ if (mIsInput) return flush();
+ if (status_t status = flush(&reply); status != OK) return status;
+ if (reply.state != StreamDescriptor::State::IDLE) {
+ ALOGE("%s: unexpected stream state: %s (expected IDLE)",
+ __func__, toString(reply.state).c_str());
+ return INVALID_OPERATION;
+ }
+ FALLTHROUGH_INTENDED;
case StreamDescriptor::State::IDLE:
if (status_t status = sendCommand(makeHalCommand<HalCommand::Tag::standby>(),
- &reply); status != OK) {
+ &reply, true /*safeFromNonWorkerThread*/); status != OK) {
return status;
}
if (reply.state != StreamDescriptor::State::STANDBY) {
@@ -291,9 +298,9 @@
LOG_ALWAYS_FATAL_IF(*transferred > bytes,
"%s: HAL module read %zu bytes, which exceeds requested count %zu",
__func__, *transferred, bytes);
- if (!mContext.getDataMQ()->read(static_cast<int8_t*>(buffer),
- mContext.getDataMQ()->availableToRead())) {
- ALOGE("%s: failed to read %zu bytes to data MQ", __func__, *transferred);
+ if (auto toRead = mContext.getDataMQ()->availableToRead();
+ toRead != 0 && !mContext.getDataMQ()->read(static_cast<int8_t*>(buffer), toRead)) {
+ ALOGE("%s: failed to read %zu bytes to data MQ", __func__, toRead);
return NOT_ENOUGH_DATA;
}
}