Merge "audiohal: Make closing of effects and streams fast"

This commit is contained in:
Mikhail Naganov 2017-02-06 16:34:41 +00:00 committed by Android (Google) Code Review
commit 9bb90a55d6
4 changed files with 55 additions and 24 deletions

View file

@ -16,10 +16,12 @@
#define LOG_TAG "StreamInHAL"
//#define LOG_NDEBUG 0
#define ATRACE_TAG ATRACE_TAG_AUDIO
#include <android/log.h>
#include <hardware/audio.h>
#include <mediautils/SchedulingPolicyService.h>
#include <utils/Trace.h>
#include "StreamIn.h"
@ -156,7 +158,18 @@ StreamIn::StreamIn(audio_hw_device_t* device, audio_stream_in_t* stream)
}
StreamIn::~StreamIn() {
ATRACE_CALL();
close();
if (mReadThread.get()) {
ATRACE_NAME("mReadThread->join");
status_t status = mReadThread->join();
ALOGE_IF(status, "read thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "read MQ event flag deletion error: %s", strerror(-status));
}
mDevice->close_input_stream(mDevice, mStream);
mStream = nullptr;
mDevice = nullptr;
}
@ -276,14 +289,10 @@ Return<Result> StreamIn::close() {
mIsClosed = true;
if (mReadThread.get()) {
mStopReadThread.store(true, std::memory_order_release);
status_t status = mReadThread->requestExitAndWait();
ALOGE_IF(status, "read thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "read MQ event flag deletion error: %s", strerror(-status));
mEfGroup->wake(static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL));
}
mDevice->close_input_stream(mDevice, mStream);
return Result::OK;
}

View file

@ -16,10 +16,12 @@
#define LOG_TAG "StreamOutHAL"
//#define LOG_NDEBUG 0
#define ATRACE_TAG ATRACE_TAG_AUDIO
#include <android/log.h>
#include <hardware/audio.h>
#include <mediautils/SchedulingPolicyService.h>
#include <utils/Trace.h>
#include "StreamOut.h"
@ -157,7 +159,19 @@ StreamOut::StreamOut(audio_hw_device_t* device, audio_stream_out_t* stream)
}
StreamOut::~StreamOut() {
ATRACE_CALL();
close();
if (mWriteThread.get()) {
ATRACE_NAME("mWriteThread->join");
status_t status = mWriteThread->join();
ALOGE_IF(status, "write thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status));
}
mCallback.clear();
mDevice->close_output_stream(mDevice, mStream);
mStream = nullptr;
mDevice = nullptr;
}
@ -261,15 +275,10 @@ Return<Result> StreamOut::close() {
mIsClosed = true;
if (mWriteThread.get()) {
mStopWriteThread.store(true, std::memory_order_release);
status_t status = mWriteThread->requestExitAndWait();
ALOGE_IF(status, "write thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status));
mEfGroup->wake(static_cast<uint32_t>(MessageQueueFlagBits::NOT_EMPTY));
}
mCallback.clear();
mDevice->close_output_stream(mDevice, mStream);
return Result::OK;
}

View file

@ -17,8 +17,11 @@
#include <memory.h>
#define LOG_TAG "EffectHAL"
#define ATRACE_TAG ATRACE_TAG_AUDIO
#include <android/log.h>
#include <media/EffectsFactoryApi.h>
#include <utils/Trace.h>
#include "Conversions.h"
#include "Effect.h"
@ -78,8 +81,9 @@ bool ProcessThread::threadLoop() {
static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS_ALL),
&efState,
NS_PER_SEC);
if (!(efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS_ALL))) {
continue; // Nothing to do.
if (!(efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS_ALL))
|| (efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_QUIT))) {
continue; // Nothing to do or time to quit.
}
Result retval = Result::OK;
if (efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS_REVERSE)
@ -134,7 +138,23 @@ Effect::Effect(effect_handle_t handle)
}
Effect::~Effect() {
ATRACE_CALL();
close();
if (mProcessThread.get()) {
ATRACE_NAME("mProcessThread->join");
status_t status = mProcessThread->join();
ALOGE_IF(status, "processing thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "processing MQ event flag deletion error: %s", strerror(-status));
}
mInBuffer.clear();
mOutBuffer.clear();
int status = EffectRelease(mHandle);
ALOGW_IF(status, "Error releasing effect %p: %s", mHandle, strerror(-status));
EffectMap::getInstance().remove(mHandle);
mHandle = 0;
}
// static
@ -731,19 +751,10 @@ Return<Result> Effect::close() {
mIsClosed = true;
if (mProcessThread.get()) {
mStopProcessThread.store(true, std::memory_order_release);
status_t status = mProcessThread->requestExitAndWait();
ALOGE_IF(status, "processing thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
ALOGE_IF(status, "processing MQ event flag deletion error: %s", strerror(-status));
mEfGroup->wake(static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_QUIT));
}
mInBuffer.clear();
mOutBuffer.clear();
int status = EffectRelease(mHandle);
ALOGW_IF(status, "Error releasing effect %p: %s", mHandle, strerror(-status));
EffectMap::getInstance().remove(mHandle);
mHandle = 0;
return Result::OK;
}

View file

@ -293,5 +293,7 @@ enum MessageQueueFlagBits : uint32_t {
DONE_PROCESSING = 1 << 0,
REQUEST_PROCESS = 1 << 1,
REQUEST_PROCESS_REVERSE = 1 << 2,
REQUEST_PROCESS_ALL = REQUEST_PROCESS | REQUEST_PROCESS_REVERSE
REQUEST_QUIT = 1 << 3,
REQUEST_PROCESS_ALL =
REQUEST_PROCESS | REQUEST_PROCESS_REVERSE | REQUEST_QUIT
};