Loading audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ interface IModule { void setVendorParameters(in android.hardware.audio.core.VendorParameter[] parameters, boolean async); void addDeviceEffect(int portConfigId, in android.hardware.audio.effect.IEffect effect); void removeDeviceEffect(int portConfigId, in android.hardware.audio.effect.IEffect effect); android.media.audio.common.AudioMMapPolicyInfo[] getMmapPolicyInfos(android.media.audio.common.AudioMMapPolicyType mmapPolicyType); @VintfStability parcelable OpenInputStreamArguments { int portConfigId; Loading audio/aidl/android/hardware/audio/core/IModule.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import android.hardware.audio.core.StreamDescriptor; import android.hardware.audio.core.VendorParameter; import android.hardware.audio.core.sounddose.ISoundDose; import android.hardware.audio.effect.IEffect; import android.media.audio.common.AudioMMapPolicyInfo; import android.media.audio.common.AudioMMapPolicyType; import android.media.audio.common.AudioMode; import android.media.audio.common.AudioOffloadInfo; import android.media.audio.common.AudioPort; Loading Loading @@ -807,4 +809,17 @@ interface IModule { * @throws EX_UNSUPPORTED_OPERATION If the module does not support device port effects. */ void removeDeviceEffect(int portConfigId, in IEffect effect); /** * Provide information describing how aaudio MMAP is supported per queried aaudio * MMAP policy type. * * If there are no devices that support aaudio MMAP for the queried aaudio MMAP policy * type in the HAL module, it must return an empty vector. Otherwise, return a vector * describing how the devices support aaudio MMAP. * * @param mmapPolicyType the aaudio mmap policy type to query. * @return The vector with mmap policy information. */ AudioMMapPolicyInfo[] getMmapPolicyInfos(AudioMMapPolicyType mmapPolicyType); } audio/aidl/default/Module.cpp +65 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,9 @@ using aidl::android::media::audio::common::AudioFormatDescription; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioMMapPolicy; using aidl::android::media::audio::common::AudioMMapPolicyInfo; using aidl::android::media::audio::common::AudioMMapPolicyType; using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::AudioOffloadInfo; using aidl::android::media::audio::common::AudioOutputFlags; Loading Loading @@ -1080,4 +1083,66 @@ ndk::ScopedAStatus Module::removeDeviceEffect( return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); } ndk::ScopedAStatus Module::getMmapPolicyInfos(AudioMMapPolicyType mmapPolicyType, std::vector<AudioMMapPolicyInfo>* _aidl_return) { LOG(DEBUG) << __func__ << ": mmap policy type " << toString(mmapPolicyType); std::set<int32_t> mmapSinks; std::set<int32_t> mmapSources; auto& ports = getConfig().ports; for (const auto& port : ports) { if (port.flags.getTag() == AudioIoFlags::Tag::input && isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::input>(), AudioInputFlags::MMAP_NOIRQ)) { mmapSinks.insert(port.id); } else if (port.flags.getTag() == AudioIoFlags::Tag::output && isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(), AudioOutputFlags::MMAP_NOIRQ)) { mmapSources.insert(port.id); } } for (const auto& route : getConfig().routes) { if (mmapSinks.count(route.sinkPortId) != 0) { // The sink is a mix port, add the sources if they are device ports. for (int sourcePortId : route.sourcePortIds) { auto sourcePortIt = findById<AudioPort>(ports, sourcePortId); if (sourcePortIt == ports.end()) { // This must not happen LOG(ERROR) << __func__ << ": port id " << sourcePortId << " cannot be found"; continue; } if (sourcePortIt->ext.getTag() != AudioPortExt::Tag::device) { // The source is not a device port, skip continue; } AudioMMapPolicyInfo policyInfo; policyInfo.device = sourcePortIt->ext.get<AudioPortExt::Tag::device>().device; // Always return AudioMMapPolicy.AUTO if the device supports mmap for // default implementation. policyInfo.mmapPolicy = AudioMMapPolicy::AUTO; _aidl_return->push_back(policyInfo); } } else { auto sinkPortIt = findById<AudioPort>(ports, route.sinkPortId); if (sinkPortIt == ports.end()) { // This must not happen LOG(ERROR) << __func__ << ": port id " << route.sinkPortId << " cannot be found"; continue; } if (sinkPortIt->ext.getTag() != AudioPortExt::Tag::device) { // The sink is not a device port, skip continue; } if (count_any(mmapSources, route.sourcePortIds)) { AudioMMapPolicyInfo policyInfo; policyInfo.device = sinkPortIt->ext.get<AudioPortExt::Tag::device>().device; // Always return AudioMMapPolicy.AUTO if the device supports mmap for // default implementation. policyInfo.mmapPolicy = AudioMMapPolicy::AUTO; _aidl_return->push_back(policyInfo); } } } return ndk::ScopedAStatus::ok(); } } // namespace aidl::android::hardware::audio::core audio/aidl/default/include/core-impl/Module.h +4 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,10 @@ class Module : public BnModule { int32_t in_portConfigId, const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& in_effect) override; ndk::ScopedAStatus getMmapPolicyInfos( ::aidl::android::media::audio::common::AudioMMapPolicyType mmapPolicyType, std::vector<::aidl::android::media::audio::common::AudioMMapPolicyInfo>* _aidl_return) override; void cleanUpPatch(int32_t patchId); ndk::ScopedAStatus createStreamContext( Loading audio/aidl/vts/ModuleConfig.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <chrono> #include <Utils.h> #include <aidl/android/media/audio/common/AudioInputFlags.h> #include <aidl/android/media/audio/common/AudioIoFlags.h> #include <aidl/android/media/audio/common/AudioOutputFlags.h> Loading @@ -32,6 +33,7 @@ using aidl::android::media::audio::common::AudioDeviceType; using aidl::android::media::audio::common::AudioEncapsulationMode; using aidl::android::media::audio::common::AudioFormatDescription; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioOffloadInfo; using aidl::android::media::audio::common::AudioOutputFlags; Loading Loading @@ -162,6 +164,20 @@ std::vector<AudioPort> ModuleConfig::getPrimaryMixPorts(bool attachedOnly, bool }); } std::vector<AudioPort> ModuleConfig::getMmapOutMixPorts(bool attachedOnly, bool singlePort) const { return findMixPorts(false /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) { return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(), AudioOutputFlags::MMAP_NOIRQ); }); } std::vector<AudioPort> ModuleConfig::getMmapInMixPorts(bool attachedOnly, bool singlePort) const { return findMixPorts(true /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) { return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::input>(), AudioInputFlags::MMAP_NOIRQ); }); } std::vector<AudioPort> ModuleConfig::getAttachedDevicesPortsForMixPort( bool isInput, const AudioPortConfig& mixPortConfig) const { const auto mixPortIt = findById<AudioPort>(mPorts, mixPortConfig.portId); Loading Loading
audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ interface IModule { void setVendorParameters(in android.hardware.audio.core.VendorParameter[] parameters, boolean async); void addDeviceEffect(int portConfigId, in android.hardware.audio.effect.IEffect effect); void removeDeviceEffect(int portConfigId, in android.hardware.audio.effect.IEffect effect); android.media.audio.common.AudioMMapPolicyInfo[] getMmapPolicyInfos(android.media.audio.common.AudioMMapPolicyType mmapPolicyType); @VintfStability parcelable OpenInputStreamArguments { int portConfigId; Loading
audio/aidl/android/hardware/audio/core/IModule.aidl +15 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ import android.hardware.audio.core.StreamDescriptor; import android.hardware.audio.core.VendorParameter; import android.hardware.audio.core.sounddose.ISoundDose; import android.hardware.audio.effect.IEffect; import android.media.audio.common.AudioMMapPolicyInfo; import android.media.audio.common.AudioMMapPolicyType; import android.media.audio.common.AudioMode; import android.media.audio.common.AudioOffloadInfo; import android.media.audio.common.AudioPort; Loading Loading @@ -807,4 +809,17 @@ interface IModule { * @throws EX_UNSUPPORTED_OPERATION If the module does not support device port effects. */ void removeDeviceEffect(int portConfigId, in IEffect effect); /** * Provide information describing how aaudio MMAP is supported per queried aaudio * MMAP policy type. * * If there are no devices that support aaudio MMAP for the queried aaudio MMAP policy * type in the HAL module, it must return an empty vector. Otherwise, return a vector * describing how the devices support aaudio MMAP. * * @param mmapPolicyType the aaudio mmap policy type to query. * @return The vector with mmap policy information. */ AudioMMapPolicyInfo[] getMmapPolicyInfos(AudioMMapPolicyType mmapPolicyType); }
audio/aidl/default/Module.cpp +65 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,9 @@ using aidl::android::media::audio::common::AudioFormatDescription; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioMMapPolicy; using aidl::android::media::audio::common::AudioMMapPolicyInfo; using aidl::android::media::audio::common::AudioMMapPolicyType; using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::AudioOffloadInfo; using aidl::android::media::audio::common::AudioOutputFlags; Loading Loading @@ -1080,4 +1083,66 @@ ndk::ScopedAStatus Module::removeDeviceEffect( return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); } ndk::ScopedAStatus Module::getMmapPolicyInfos(AudioMMapPolicyType mmapPolicyType, std::vector<AudioMMapPolicyInfo>* _aidl_return) { LOG(DEBUG) << __func__ << ": mmap policy type " << toString(mmapPolicyType); std::set<int32_t> mmapSinks; std::set<int32_t> mmapSources; auto& ports = getConfig().ports; for (const auto& port : ports) { if (port.flags.getTag() == AudioIoFlags::Tag::input && isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::input>(), AudioInputFlags::MMAP_NOIRQ)) { mmapSinks.insert(port.id); } else if (port.flags.getTag() == AudioIoFlags::Tag::output && isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(), AudioOutputFlags::MMAP_NOIRQ)) { mmapSources.insert(port.id); } } for (const auto& route : getConfig().routes) { if (mmapSinks.count(route.sinkPortId) != 0) { // The sink is a mix port, add the sources if they are device ports. for (int sourcePortId : route.sourcePortIds) { auto sourcePortIt = findById<AudioPort>(ports, sourcePortId); if (sourcePortIt == ports.end()) { // This must not happen LOG(ERROR) << __func__ << ": port id " << sourcePortId << " cannot be found"; continue; } if (sourcePortIt->ext.getTag() != AudioPortExt::Tag::device) { // The source is not a device port, skip continue; } AudioMMapPolicyInfo policyInfo; policyInfo.device = sourcePortIt->ext.get<AudioPortExt::Tag::device>().device; // Always return AudioMMapPolicy.AUTO if the device supports mmap for // default implementation. policyInfo.mmapPolicy = AudioMMapPolicy::AUTO; _aidl_return->push_back(policyInfo); } } else { auto sinkPortIt = findById<AudioPort>(ports, route.sinkPortId); if (sinkPortIt == ports.end()) { // This must not happen LOG(ERROR) << __func__ << ": port id " << route.sinkPortId << " cannot be found"; continue; } if (sinkPortIt->ext.getTag() != AudioPortExt::Tag::device) { // The sink is not a device port, skip continue; } if (count_any(mmapSources, route.sourcePortIds)) { AudioMMapPolicyInfo policyInfo; policyInfo.device = sinkPortIt->ext.get<AudioPortExt::Tag::device>().device; // Always return AudioMMapPolicy.AUTO if the device supports mmap for // default implementation. policyInfo.mmapPolicy = AudioMMapPolicy::AUTO; _aidl_return->push_back(policyInfo); } } } return ndk::ScopedAStatus::ok(); } } // namespace aidl::android::hardware::audio::core
audio/aidl/default/include/core-impl/Module.h +4 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,10 @@ class Module : public BnModule { int32_t in_portConfigId, const std::shared_ptr<::aidl::android::hardware::audio::effect::IEffect>& in_effect) override; ndk::ScopedAStatus getMmapPolicyInfos( ::aidl::android::media::audio::common::AudioMMapPolicyType mmapPolicyType, std::vector<::aidl::android::media::audio::common::AudioMMapPolicyInfo>* _aidl_return) override; void cleanUpPatch(int32_t patchId); ndk::ScopedAStatus createStreamContext( Loading
audio/aidl/vts/ModuleConfig.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <chrono> #include <Utils.h> #include <aidl/android/media/audio/common/AudioInputFlags.h> #include <aidl/android/media/audio/common/AudioIoFlags.h> #include <aidl/android/media/audio/common/AudioOutputFlags.h> Loading @@ -32,6 +33,7 @@ using aidl::android::media::audio::common::AudioDeviceType; using aidl::android::media::audio::common::AudioEncapsulationMode; using aidl::android::media::audio::common::AudioFormatDescription; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioOffloadInfo; using aidl::android::media::audio::common::AudioOutputFlags; Loading Loading @@ -162,6 +164,20 @@ std::vector<AudioPort> ModuleConfig::getPrimaryMixPorts(bool attachedOnly, bool }); } std::vector<AudioPort> ModuleConfig::getMmapOutMixPorts(bool attachedOnly, bool singlePort) const { return findMixPorts(false /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) { return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(), AudioOutputFlags::MMAP_NOIRQ); }); } std::vector<AudioPort> ModuleConfig::getMmapInMixPorts(bool attachedOnly, bool singlePort) const { return findMixPorts(true /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) { return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::input>(), AudioInputFlags::MMAP_NOIRQ); }); } std::vector<AudioPort> ModuleConfig::getAttachedDevicesPortsForMixPort( bool isInput, const AudioPortConfig& mixPortConfig) const { const auto mixPortIt = findById<AudioPort>(mPorts, mixPortConfig.portId); Loading