summaryrefslogtreecommitdiff
path: root/audio/2.0/default/StreamIn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'audio/2.0/default/StreamIn.cpp')
-rw-r--r--audio/2.0/default/StreamIn.cpp217
1 files changed, 115 insertions, 102 deletions
diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp
index e5a1a55524..2262697cde 100644
--- a/audio/2.0/default/StreamIn.cpp
+++ b/audio/2.0/default/StreamIn.cpp
@@ -20,8 +20,8 @@
#include <android/log.h>
#include <hardware/audio.h>
-#include <memory>
#include <utils/Trace.h>
+#include <memory>
#include "StreamIn.h"
@@ -38,30 +38,26 @@ using ::android::hardware::audio::common::V2_0::ThreadInfo;
namespace {
class ReadThread : public Thread {
- public:
+ public:
// ReadThread's lifespan never exceeds StreamIn's lifespan.
- ReadThread(std::atomic<bool>* stop,
- audio_stream_in_t* stream,
- StreamIn::CommandMQ* commandMQ,
- StreamIn::DataMQ* dataMQ,
- StreamIn::StatusMQ* statusMQ,
- EventFlag* efGroup)
- : Thread(false /*canCallJava*/),
- mStop(stop),
- mStream(stream),
- mCommandMQ(commandMQ),
- mDataMQ(dataMQ),
- mStatusMQ(statusMQ),
- mEfGroup(efGroup),
- mBuffer(nullptr) {
- }
+ ReadThread(std::atomic<bool>* stop, audio_stream_in_t* stream,
+ StreamIn::CommandMQ* commandMQ, StreamIn::DataMQ* dataMQ,
+ StreamIn::StatusMQ* statusMQ, EventFlag* efGroup)
+ : Thread(false /*canCallJava*/),
+ mStop(stop),
+ mStream(stream),
+ mCommandMQ(commandMQ),
+ mDataMQ(dataMQ),
+ mStatusMQ(statusMQ),
+ mEfGroup(efGroup),
+ mBuffer(nullptr) {}
bool init() {
- mBuffer.reset(new(std::nothrow) uint8_t[mDataMQ->getQuantumCount()]);
+ mBuffer.reset(new (std::nothrow) uint8_t[mDataMQ->getQuantumCount()]);
return mBuffer != nullptr;
}
virtual ~ReadThread() {}
- private:
+ private:
std::atomic<bool>* mStop;
audio_stream_in_t* mStream;
StreamIn::CommandMQ* mCommandMQ;
@@ -82,8 +78,10 @@ void ReadThread::doRead() {
size_t availableToWrite = mDataMQ->availableToWrite();
size_t requestedToRead = mParameters.params.read;
if (requestedToRead > availableToWrite) {
- ALOGW("truncating read data from %d to %d due to insufficient data queue space",
- (int32_t)requestedToRead, (int32_t)availableToWrite);
+ ALOGW(
+ "truncating read data from %d to %d due to insufficient data queue "
+ "space",
+ (int32_t)requestedToRead, (int32_t)availableToWrite);
requestedToRead = availableToWrite;
}
ssize_t readResult = mStream->read(mStream, &mBuffer[0], requestedToRead);
@@ -101,16 +99,20 @@ void ReadThread::doRead() {
void ReadThread::doGetCapturePosition() {
mStatus.retval = StreamIn::getCapturePositionImpl(
- mStream, &mStatus.reply.capturePosition.frames, &mStatus.reply.capturePosition.time);
+ mStream, &mStatus.reply.capturePosition.frames,
+ &mStatus.reply.capturePosition.time);
}
bool ReadThread::threadLoop() {
- // This implementation doesn't return control back to the Thread until it decides to stop,
+ // This implementation doesn't return control back to the Thread until it
+ // decides to stop,
// as the Thread uses mutexes, and this can lead to priority inversion.
- while(!std::atomic_load_explicit(mStop, std::memory_order_acquire)) {
+ while (!std::atomic_load_explicit(mStop, std::memory_order_acquire)) {
uint32_t efState = 0;
- mEfGroup->wait(static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL), &efState);
- if (!(efState & static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL))) {
+ mEfGroup->wait(static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL),
+ &efState);
+ if (!(efState &
+ static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL))) {
continue; // Nothing to do.
}
if (!mCommandMQ->read(&mParameters)) {
@@ -125,7 +127,8 @@ bool ReadThread::threadLoop() {
doGetCapturePosition();
break;
default:
- ALOGE("Unknown read thread command code %d", mParameters.command);
+ ALOGE("Unknown read thread command code %d",
+ mParameters.command);
mStatus.retval = Result::NOT_SUPPORTED;
break;
}
@@ -141,11 +144,13 @@ bool ReadThread::threadLoop() {
} // namespace
StreamIn::StreamIn(const sp<Device>& device, audio_stream_in_t* stream)
- : mIsClosed(false), mDevice(device), mStream(stream),
- mStreamCommon(new Stream(&stream->common)),
- mStreamMmap(new StreamMmap<audio_stream_in_t>(stream)),
- mEfGroup(nullptr), mStopReadThread(false) {
-}
+ : mIsClosed(false),
+ mDevice(device),
+ mStream(stream),
+ mStreamCommon(new Stream(&stream->common)),
+ mStreamMmap(new StreamMmap<audio_stream_in_t>(stream)),
+ mEfGroup(nullptr),
+ mStopReadThread(false) {}
StreamIn::~StreamIn() {
ATRACE_CALL();
@@ -157,102 +162,108 @@ StreamIn::~StreamIn() {
}
if (mEfGroup) {
status_t status = EventFlag::deleteEventFlag(&mEfGroup);
- ALOGE_IF(status, "read MQ event flag deletion error: %s", strerror(-status));
+ ALOGE_IF(status, "read MQ event flag deletion error: %s",
+ strerror(-status));
}
mDevice->closeInputStream(mStream);
mStream = nullptr;
}
// Methods from ::android::hardware::audio::V2_0::IStream follow.
-Return<uint64_t> StreamIn::getFrameSize() {
+Return<uint64_t> StreamIn::getFrameSize() {
return audio_stream_in_frame_size(mStream);
}
-Return<uint64_t> StreamIn::getFrameCount() {
+Return<uint64_t> StreamIn::getFrameCount() {
return mStreamCommon->getFrameCount();
}
-Return<uint64_t> StreamIn::getBufferSize() {
+Return<uint64_t> StreamIn::getBufferSize() {
return mStreamCommon->getBufferSize();
}
-Return<uint32_t> StreamIn::getSampleRate() {
+Return<uint32_t> StreamIn::getSampleRate() {
return mStreamCommon->getSampleRate();
}
-Return<void> StreamIn::getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) {
+Return<void> StreamIn::getSupportedSampleRates(
+ getSupportedSampleRates_cb _hidl_cb) {
return mStreamCommon->getSupportedSampleRates(_hidl_cb);
}
-Return<Result> StreamIn::setSampleRate(uint32_t sampleRateHz) {
+Return<Result> StreamIn::setSampleRate(uint32_t sampleRateHz) {
return mStreamCommon->setSampleRate(sampleRateHz);
}
-Return<AudioChannelMask> StreamIn::getChannelMask() {
+Return<AudioChannelMask> StreamIn::getChannelMask() {
return mStreamCommon->getChannelMask();
}
-Return<void> StreamIn::getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) {
+Return<void> StreamIn::getSupportedChannelMasks(
+ getSupportedChannelMasks_cb _hidl_cb) {
return mStreamCommon->getSupportedChannelMasks(_hidl_cb);
}
-Return<Result> StreamIn::setChannelMask(AudioChannelMask mask) {
+Return<Result> StreamIn::setChannelMask(AudioChannelMask mask) {
return mStreamCommon->setChannelMask(mask);
}
-Return<AudioFormat> StreamIn::getFormat() {
+Return<AudioFormat> StreamIn::getFormat() {
return mStreamCommon->getFormat();
}
-Return<void> StreamIn::getSupportedFormats(getSupportedFormats_cb _hidl_cb) {
+Return<void> StreamIn::getSupportedFormats(getSupportedFormats_cb _hidl_cb) {
return mStreamCommon->getSupportedFormats(_hidl_cb);
}
-Return<Result> StreamIn::setFormat(AudioFormat format) {
+Return<Result> StreamIn::setFormat(AudioFormat format) {
return mStreamCommon->setFormat(format);
}
-Return<void> StreamIn::getAudioProperties(getAudioProperties_cb _hidl_cb) {
+Return<void> StreamIn::getAudioProperties(getAudioProperties_cb _hidl_cb) {
return mStreamCommon->getAudioProperties(_hidl_cb);
}
-Return<Result> StreamIn::addEffect(uint64_t effectId) {
+Return<Result> StreamIn::addEffect(uint64_t effectId) {
return mStreamCommon->addEffect(effectId);
}
-Return<Result> StreamIn::removeEffect(uint64_t effectId) {
+Return<Result> StreamIn::removeEffect(uint64_t effectId) {
return mStreamCommon->removeEffect(effectId);
}
-Return<Result> StreamIn::standby() {
+Return<Result> StreamIn::standby() {
return mStreamCommon->standby();
}
-Return<AudioDevice> StreamIn::getDevice() {
+Return<AudioDevice> StreamIn::getDevice() {
return mStreamCommon->getDevice();
}
-Return<Result> StreamIn::setDevice(const DeviceAddress& address) {
+Return<Result> StreamIn::setDevice(const DeviceAddress& address) {
return mStreamCommon->setDevice(address);
}
-Return<Result> StreamIn::setConnectedState(const DeviceAddress& address, bool connected) {
+Return<Result> StreamIn::setConnectedState(const DeviceAddress& address,
+ bool connected) {
return mStreamCommon->setConnectedState(address, connected);
}
-Return<Result> StreamIn::setHwAvSync(uint32_t hwAvSync) {
+Return<Result> StreamIn::setHwAvSync(uint32_t hwAvSync) {
return mStreamCommon->setHwAvSync(hwAvSync);
}
-Return<void> StreamIn::getParameters(const hidl_vec<hidl_string>& keys, getParameters_cb _hidl_cb) {
+Return<void> StreamIn::getParameters(const hidl_vec<hidl_string>& keys,
+ getParameters_cb _hidl_cb) {
return mStreamCommon->getParameters(keys, _hidl_cb);
}
-Return<Result> StreamIn::setParameters(const hidl_vec<ParameterValue>& parameters) {
+Return<Result> StreamIn::setParameters(
+ const hidl_vec<ParameterValue>& parameters) {
return mStreamCommon->setParameters(parameters);
}
-Return<void> StreamIn::debugDump(const hidl_handle& fd) {
+Return<void> StreamIn::debugDump(const hidl_handle& fd) {
return mStreamCommon->debugDump(fd);
}
@@ -264,16 +275,17 @@ Return<Result> StreamIn::stop() {
return mStreamMmap->stop();
}
-Return<void> StreamIn::createMmapBuffer(int32_t minSizeFrames, createMmapBuffer_cb _hidl_cb) {
+Return<void> StreamIn::createMmapBuffer(int32_t minSizeFrames,
+ createMmapBuffer_cb _hidl_cb) {
return mStreamMmap->createMmapBuffer(
- minSizeFrames, audio_stream_in_frame_size(mStream), _hidl_cb);
+ minSizeFrames, audio_stream_in_frame_size(mStream), _hidl_cb);
}
Return<void> StreamIn::getMmapPosition(getMmapPosition_cb _hidl_cb) {
return mStreamMmap->getMmapPosition(_hidl_cb);
}
-Return<Result> StreamIn::close() {
+Return<Result> StreamIn::close() {
if (mIsClosed) return Result::INVALID_STATE;
mIsClosed = true;
if (mReadThread.get()) {
@@ -286,9 +298,10 @@ Return<Result> StreamIn::close() {
}
// Methods from ::android::hardware::audio::V2_0::IStreamIn follow.
-Return<void> StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) {
+Return<void> StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) {
int halSource;
- Result retval = mStreamCommon->getParam(AudioParameter::keyInputSource, &halSource);
+ Result retval =
+ mStreamCommon->getParam(AudioParameter::keyInputSource, &halSource);
AudioSource source(AudioSource::DEFAULT);
if (retval == Result::OK) {
source = AudioSource(halSource);
@@ -297,68 +310,69 @@ Return<void> StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) {
return Void();
}
-Return<Result> StreamIn::setGain(float gain) {
+Return<Result> StreamIn::setGain(float gain) {
return Stream::analyzeStatus("set_gain", mStream->set_gain(mStream, gain));
}
-Return<void> StreamIn::prepareForReading(
- uint32_t frameSize, uint32_t framesCount, prepareForReading_cb _hidl_cb) {
+Return<void> StreamIn::prepareForReading(uint32_t frameSize,
+ uint32_t framesCount,
+ prepareForReading_cb _hidl_cb) {
status_t status;
- ThreadInfo threadInfo = { 0, 0 };
+ ThreadInfo threadInfo = {0, 0};
// Create message queues.
if (mDataMQ) {
ALOGE("the client attempts to call prepareForReading twice");
- _hidl_cb(Result::INVALID_STATE,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ _hidl_cb(Result::INVALID_STATE, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
std::unique_ptr<CommandMQ> tempCommandMQ(new CommandMQ(1));
if (frameSize > std::numeric_limits<size_t>::max() / framesCount) {
- ALOGE("Requested buffer is too big, %d*%d can not fit in size_t", frameSize, framesCount);
- _hidl_cb(Result::INVALID_ARGUMENTS,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ ALOGE("Requested buffer is too big, %d*%d can not fit in size_t",
+ frameSize, framesCount);
+ _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
- std::unique_ptr<DataMQ> tempDataMQ(new DataMQ(frameSize * framesCount, true /* EventFlag */));
+ std::unique_ptr<DataMQ> tempDataMQ(
+ new DataMQ(frameSize * framesCount, true /* EventFlag */));
std::unique_ptr<StatusMQ> tempStatusMQ(new StatusMQ(1));
- if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() || !tempStatusMQ->isValid()) {
+ if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() ||
+ !tempStatusMQ->isValid()) {
ALOGE_IF(!tempCommandMQ->isValid(), "command MQ is invalid");
ALOGE_IF(!tempDataMQ->isValid(), "data MQ is invalid");
ALOGE_IF(!tempStatusMQ->isValid(), "status MQ is invalid");
- _hidl_cb(Result::INVALID_ARGUMENTS,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
EventFlag* tempRawEfGroup{};
- status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &tempRawEfGroup);
- std::unique_ptr<EventFlag, void(*)(EventFlag*)> tempElfGroup(tempRawEfGroup, [](auto *ef) {
- EventFlag::deleteEventFlag(&ef); });
+ status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(),
+ &tempRawEfGroup);
+ std::unique_ptr<EventFlag, void (*)(EventFlag*)> tempElfGroup(
+ tempRawEfGroup, [](auto* ef) { EventFlag::deleteEventFlag(&ef); });
if (status != OK || !tempElfGroup) {
ALOGE("failed creating event flag for data MQ: %s", strerror(-status));
- _hidl_cb(Result::INVALID_ARGUMENTS,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
// Create and launch the thread.
auto tempReadThread = std::make_unique<ReadThread>(
- &mStopReadThread,
- mStream,
- tempCommandMQ.get(),
- tempDataMQ.get(),
- tempStatusMQ.get(),
- tempElfGroup.get());
+ &mStopReadThread, mStream, tempCommandMQ.get(), tempDataMQ.get(),
+ tempStatusMQ.get(), tempElfGroup.get());
if (!tempReadThread->init()) {
- _hidl_cb(Result::INVALID_ARGUMENTS,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
status = tempReadThread->run("reader", PRIORITY_URGENT_AUDIO);
if (status != OK) {
ALOGW("failed to start reader thread: %s", strerror(-status));
- _hidl_cb(Result::INVALID_ARGUMENTS,
- CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
+ _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(),
+ DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo);
return Void();
}
@@ -369,28 +383,27 @@ Return<void> StreamIn::prepareForReading(
mEfGroup = tempElfGroup.release();
threadInfo.pid = getpid();
threadInfo.tid = mReadThread->getTid();
- _hidl_cb(Result::OK,
- *mCommandMQ->getDesc(), *mDataMQ->getDesc(), *mStatusMQ->getDesc(),
- threadInfo);
+ _hidl_cb(Result::OK, *mCommandMQ->getDesc(), *mDataMQ->getDesc(),
+ *mStatusMQ->getDesc(), threadInfo);
return Void();
}
-Return<uint32_t> StreamIn::getInputFramesLost() {
+Return<uint32_t> StreamIn::getInputFramesLost() {
return mStream->get_input_frames_lost(mStream);
}
// static
-Result StreamIn::getCapturePositionImpl(
- audio_stream_in_t *stream, uint64_t *frames, uint64_t *time) {
+Result StreamIn::getCapturePositionImpl(audio_stream_in_t* stream,
+ uint64_t* frames, uint64_t* time) {
Result retval(Result::NOT_SUPPORTED);
if (stream->get_capture_position != NULL) return retval;
int64_t halFrames, halTime;
retval = Stream::analyzeStatus(
- "get_capture_position",
- stream->get_capture_position(stream, &halFrames, &halTime),
- // HAL may have a stub function, always returning ENOSYS, don't
- // spam the log in this case.
- ENOSYS);
+ "get_capture_position",
+ stream->get_capture_position(stream, &halFrames, &halTime),
+ // HAL may have a stub function, always returning ENOSYS, don't
+ // spam the log in this case.
+ ENOSYS);
if (retval == Result::OK) {
*frames = halFrames;
*time = halTime;
@@ -398,14 +411,14 @@ Result StreamIn::getCapturePositionImpl(
return retval;
};
-Return<void> StreamIn::getCapturePosition(getCapturePosition_cb _hidl_cb) {
+Return<void> StreamIn::getCapturePosition(getCapturePosition_cb _hidl_cb) {
uint64_t frames = 0, time = 0;
Result retval = getCapturePositionImpl(mStream, &frames, &time);
_hidl_cb(retval, frames, time);
return Void();
}
-} // namespace implementation
+} // namespace implementation
} // namespace V2_0
} // namespace audio
} // namespace hardware