Loading media/libaudiohal/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,8 @@ LOCAL_SHARED_LIBRARIES += \ android.hardware.audio.common@2.0-util \ android.hardware.audio.effect@2.0 \ android.hidl.memory@1.0 \ libmedia_helper libmedia_helper \ libmediautils endif # USE_LEGACY_LOCAL_AUDIO_HAL Loading media/libaudiohal/StreamHalHidl.cpp +33 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ //#define LOG_NDEBUG 0 #include <android/hardware/audio/2.0/IStreamOutCallback.h> #include <mediautils/SchedulingPolicyService.h> #include <utils/Log.h> #include "DeviceHalHidl.h" Loading @@ -26,6 +27,7 @@ using ::android::hardware::audio::common::V2_0::AudioChannelMask; using ::android::hardware::audio::common::V2_0::AudioFormat; using ::android::hardware::audio::common::V2_0::ThreadInfo; using ::android::hardware::audio::V2_0::AudioDrain; using ::android::hardware::audio::V2_0::IStreamOutCallback; using ::android::hardware::audio::V2_0::MessageQueueFlagBits; Loading @@ -33,7 +35,6 @@ using ::android::hardware::audio::V2_0::MmapBufferInfo; using ::android::hardware::audio::V2_0::MmapPosition; using ::android::hardware::audio::V2_0::ParameterValue; using ::android::hardware::audio::V2_0::Result; using ::android::hardware::audio::V2_0::ThreadPriority; using ::android::hardware::audio::V2_0::TimeSpec; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; Loading @@ -44,8 +45,8 @@ namespace android { StreamHalHidl::StreamHalHidl(IStream *stream) : ConversionHelperHidl("Stream"), mHalThreadPriority(static_cast<int>(ThreadPriority::NORMAL)), mStream(stream) { mStream(stream), mHalThreadPriority(HAL_THREAD_PRIORITY_DEFAULT) { } StreamHalHidl::~StreamHalHidl() { Loading Loading @@ -187,6 +188,19 @@ status_t StreamHalHidl::setHalThreadPriority(int priority) { return OK; } bool StreamHalHidl::requestHalThreadPriority(pid_t threadPid, pid_t threadId) { if (mHalThreadPriority == HAL_THREAD_PRIORITY_DEFAULT) { return true; } int err = requestPriority( threadPid, threadId, mHalThreadPriority, false /*isForApp*/, true /*asynchronous*/); ALOGE_IF(err, "failed to set priority %d for pid %d tid %d; error %d", mHalThreadPriority, threadPid, threadId, err); // Audio will still work, but latency will be higher and sometimes unacceptable. return err == 0; } namespace { /* Notes on callback ownership. Loading Loading @@ -352,12 +366,14 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { std::unique_ptr<DataMQ> tempDataMQ; std::unique_ptr<StatusMQ> tempStatusMQ; Result retval; pid_t halThreadPid, halThreadTid; Return<void> ret = mStream->prepareForWriting( 1, bufferSize, ThreadPriority(mHalThreadPriority), 1, bufferSize, [&](Result r, const CommandMQ::Descriptor& commandMQ, const DataMQ::Descriptor& dataMQ, const StatusMQ::Descriptor& statusMQ) { const StatusMQ::Descriptor& statusMQ, const ThreadInfo& halThreadInfo) { retval = r; if (retval == Result::OK) { tempCommandMQ.reset(new CommandMQ(commandMQ)); Loading @@ -366,6 +382,8 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { if (tempDataMQ->isValid() && tempDataMQ->getEventFlagWord()) { EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &mEfGroup); } halThreadPid = halThreadInfo.pid; halThreadTid = halThreadInfo.tid; } }); if (!ret.isOk() || retval != Result::OK) { Loading @@ -386,6 +404,8 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { ALOGE_IF(!mEfGroup, "Event flag creation for writing failed"); return NO_INIT; } requestHalThreadPriority(halThreadPid, halThreadTid); mCommandMQ = std::move(tempCommandMQ); mDataMQ = std::move(tempDataMQ); mStatusMQ = std::move(tempStatusMQ); Loading Loading @@ -605,12 +625,14 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { std::unique_ptr<DataMQ> tempDataMQ; std::unique_ptr<StatusMQ> tempStatusMQ; Result retval; pid_t halThreadPid, halThreadTid; Return<void> ret = mStream->prepareForReading( 1, bufferSize, ThreadPriority(mHalThreadPriority), 1, bufferSize, [&](Result r, const CommandMQ::Descriptor& commandMQ, const DataMQ::Descriptor& dataMQ, const StatusMQ::Descriptor& statusMQ) { const StatusMQ::Descriptor& statusMQ, const ThreadInfo& halThreadInfo) { retval = r; if (retval == Result::OK) { tempCommandMQ.reset(new CommandMQ(commandMQ)); Loading @@ -619,6 +641,8 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { if (tempDataMQ->isValid() && tempDataMQ->getEventFlagWord()) { EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &mEfGroup); } halThreadPid = halThreadInfo.pid; halThreadTid = halThreadInfo.tid; } }); if (!ret.isOk() || retval != Result::OK) { Loading @@ -639,6 +663,8 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { ALOGE_IF(!mEfGroup, "Event flag creation for reading failed"); return NO_INIT; } requestHalThreadPriority(halThreadPid, halThreadTid); mCommandMQ = std::move(tempCommandMQ); mDataMQ = std::move(tempDataMQ); mStatusMQ = std::move(tempStatusMQ); Loading media/libaudiohal/StreamHalHidl.h +3 −1 Original line number Diff line number Diff line Loading @@ -101,10 +101,12 @@ class StreamHalHidl : public virtual StreamHalInterface, public ConversionHelper // The destructor automatically closes the stream. virtual ~StreamHalHidl(); int mHalThreadPriority; bool requestHalThreadPriority(pid_t threadPid, pid_t threadId); private: const int HAL_THREAD_PRIORITY_DEFAULT = -1; IStream *mStream; int mHalThreadPriority; }; class StreamOutHalHidl : public StreamOutHalInterface, public StreamHalHidl { Loading media/utils/ISchedulingPolicyService.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -37,13 +37,15 @@ public: { } virtual int requestPriority(int32_t pid, int32_t tid, int32_t prio, bool asynchronous) virtual int requestPriority(int32_t pid, int32_t tid, int32_t prio, bool isForApp, bool asynchronous) { Parcel data, reply; data.writeInterfaceToken(ISchedulingPolicyService::getInterfaceDescriptor()); data.writeInt32(pid); data.writeInt32(tid); data.writeInt32(prio); data.writeBool(isForApp); uint32_t flags = asynchronous ? IBinder::FLAG_ONEWAY : 0; status_t status = remote()->transact(REQUEST_PRIORITY_TRANSACTION, data, &reply, flags); if (status != NO_ERROR) { Loading media/utils/ISchedulingPolicyService.h +1 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ public: DECLARE_META_INTERFACE(SchedulingPolicyService); virtual int requestPriority(/*pid_t*/int32_t pid, /*pid_t*/int32_t tid, int32_t prio, bool asynchronous) = 0; int32_t prio, bool isForApp, bool asynchronous) = 0; }; Loading Loading
media/libaudiohal/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,8 @@ LOCAL_SHARED_LIBRARIES += \ android.hardware.audio.common@2.0-util \ android.hardware.audio.effect@2.0 \ android.hidl.memory@1.0 \ libmedia_helper libmedia_helper \ libmediautils endif # USE_LEGACY_LOCAL_AUDIO_HAL Loading
media/libaudiohal/StreamHalHidl.cpp +33 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ //#define LOG_NDEBUG 0 #include <android/hardware/audio/2.0/IStreamOutCallback.h> #include <mediautils/SchedulingPolicyService.h> #include <utils/Log.h> #include "DeviceHalHidl.h" Loading @@ -26,6 +27,7 @@ using ::android::hardware::audio::common::V2_0::AudioChannelMask; using ::android::hardware::audio::common::V2_0::AudioFormat; using ::android::hardware::audio::common::V2_0::ThreadInfo; using ::android::hardware::audio::V2_0::AudioDrain; using ::android::hardware::audio::V2_0::IStreamOutCallback; using ::android::hardware::audio::V2_0::MessageQueueFlagBits; Loading @@ -33,7 +35,6 @@ using ::android::hardware::audio::V2_0::MmapBufferInfo; using ::android::hardware::audio::V2_0::MmapPosition; using ::android::hardware::audio::V2_0::ParameterValue; using ::android::hardware::audio::V2_0::Result; using ::android::hardware::audio::V2_0::ThreadPriority; using ::android::hardware::audio::V2_0::TimeSpec; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; Loading @@ -44,8 +45,8 @@ namespace android { StreamHalHidl::StreamHalHidl(IStream *stream) : ConversionHelperHidl("Stream"), mHalThreadPriority(static_cast<int>(ThreadPriority::NORMAL)), mStream(stream) { mStream(stream), mHalThreadPriority(HAL_THREAD_PRIORITY_DEFAULT) { } StreamHalHidl::~StreamHalHidl() { Loading Loading @@ -187,6 +188,19 @@ status_t StreamHalHidl::setHalThreadPriority(int priority) { return OK; } bool StreamHalHidl::requestHalThreadPriority(pid_t threadPid, pid_t threadId) { if (mHalThreadPriority == HAL_THREAD_PRIORITY_DEFAULT) { return true; } int err = requestPriority( threadPid, threadId, mHalThreadPriority, false /*isForApp*/, true /*asynchronous*/); ALOGE_IF(err, "failed to set priority %d for pid %d tid %d; error %d", mHalThreadPriority, threadPid, threadId, err); // Audio will still work, but latency will be higher and sometimes unacceptable. return err == 0; } namespace { /* Notes on callback ownership. Loading Loading @@ -352,12 +366,14 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { std::unique_ptr<DataMQ> tempDataMQ; std::unique_ptr<StatusMQ> tempStatusMQ; Result retval; pid_t halThreadPid, halThreadTid; Return<void> ret = mStream->prepareForWriting( 1, bufferSize, ThreadPriority(mHalThreadPriority), 1, bufferSize, [&](Result r, const CommandMQ::Descriptor& commandMQ, const DataMQ::Descriptor& dataMQ, const StatusMQ::Descriptor& statusMQ) { const StatusMQ::Descriptor& statusMQ, const ThreadInfo& halThreadInfo) { retval = r; if (retval == Result::OK) { tempCommandMQ.reset(new CommandMQ(commandMQ)); Loading @@ -366,6 +382,8 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { if (tempDataMQ->isValid() && tempDataMQ->getEventFlagWord()) { EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &mEfGroup); } halThreadPid = halThreadInfo.pid; halThreadTid = halThreadInfo.tid; } }); if (!ret.isOk() || retval != Result::OK) { Loading @@ -386,6 +404,8 @@ status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) { ALOGE_IF(!mEfGroup, "Event flag creation for writing failed"); return NO_INIT; } requestHalThreadPriority(halThreadPid, halThreadTid); mCommandMQ = std::move(tempCommandMQ); mDataMQ = std::move(tempDataMQ); mStatusMQ = std::move(tempStatusMQ); Loading Loading @@ -605,12 +625,14 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { std::unique_ptr<DataMQ> tempDataMQ; std::unique_ptr<StatusMQ> tempStatusMQ; Result retval; pid_t halThreadPid, halThreadTid; Return<void> ret = mStream->prepareForReading( 1, bufferSize, ThreadPriority(mHalThreadPriority), 1, bufferSize, [&](Result r, const CommandMQ::Descriptor& commandMQ, const DataMQ::Descriptor& dataMQ, const StatusMQ::Descriptor& statusMQ) { const StatusMQ::Descriptor& statusMQ, const ThreadInfo& halThreadInfo) { retval = r; if (retval == Result::OK) { tempCommandMQ.reset(new CommandMQ(commandMQ)); Loading @@ -619,6 +641,8 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { if (tempDataMQ->isValid() && tempDataMQ->getEventFlagWord()) { EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &mEfGroup); } halThreadPid = halThreadInfo.pid; halThreadTid = halThreadInfo.tid; } }); if (!ret.isOk() || retval != Result::OK) { Loading @@ -639,6 +663,8 @@ status_t StreamInHalHidl::prepareForReading(size_t bufferSize) { ALOGE_IF(!mEfGroup, "Event flag creation for reading failed"); return NO_INIT; } requestHalThreadPriority(halThreadPid, halThreadTid); mCommandMQ = std::move(tempCommandMQ); mDataMQ = std::move(tempDataMQ); mStatusMQ = std::move(tempStatusMQ); Loading
media/libaudiohal/StreamHalHidl.h +3 −1 Original line number Diff line number Diff line Loading @@ -101,10 +101,12 @@ class StreamHalHidl : public virtual StreamHalInterface, public ConversionHelper // The destructor automatically closes the stream. virtual ~StreamHalHidl(); int mHalThreadPriority; bool requestHalThreadPriority(pid_t threadPid, pid_t threadId); private: const int HAL_THREAD_PRIORITY_DEFAULT = -1; IStream *mStream; int mHalThreadPriority; }; class StreamOutHalHidl : public StreamOutHalInterface, public StreamHalHidl { Loading
media/utils/ISchedulingPolicyService.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -37,13 +37,15 @@ public: { } virtual int requestPriority(int32_t pid, int32_t tid, int32_t prio, bool asynchronous) virtual int requestPriority(int32_t pid, int32_t tid, int32_t prio, bool isForApp, bool asynchronous) { Parcel data, reply; data.writeInterfaceToken(ISchedulingPolicyService::getInterfaceDescriptor()); data.writeInt32(pid); data.writeInt32(tid); data.writeInt32(prio); data.writeBool(isForApp); uint32_t flags = asynchronous ? IBinder::FLAG_ONEWAY : 0; status_t status = remote()->transact(REQUEST_PRIORITY_TRANSACTION, data, &reply, flags); if (status != NO_ERROR) { Loading
media/utils/ISchedulingPolicyService.h +1 −1 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ public: DECLARE_META_INTERFACE(SchedulingPolicyService); virtual int requestPriority(/*pid_t*/int32_t pid, /*pid_t*/int32_t tid, int32_t prio, bool asynchronous) = 0; int32_t prio, bool isForApp, bool asynchronous) = 0; }; Loading