Loading media/libeffects/dynamicsproc/dsp/DPFrequency.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -62,11 +62,6 @@ void ChannelBuffer::initBuffers(unsigned int blockSize, unsigned int overlapSize cBInput.resize(mBlockSize * CIRCULAR_BUFFER_UPSAMPLE); cBOutput.resize(mBlockSize * CIRCULAR_BUFFER_UPSAMPLE); //fill input with half block size... for (unsigned int k = 0; k < mBlockSize/2; k++) { cBInput.write(0); } //temp vectors input.resize(mBlockSize); output.resize(mBlockSize); Loading Loading @@ -170,6 +165,11 @@ void DPFrequency::configure(size_t blockSize, size_t overlapSize, fill_window(mVWindow, RDSP_WINDOW_HANNING_FLAT_TOP, mBlockSize, mOverlapSize); //split window into analysis and synthesis. Both are the sqrt() of original //window Eigen::Map<Eigen::VectorXf> eWindow(&mVWindow[0], mVWindow.size()); eWindow = eWindow.array().sqrt(); //compute window rms for energy compensation mWindowRms = 0; for (size_t i = 0; i < mVWindow.size(); i++) { Loading Loading @@ -666,6 +666,11 @@ size_t DPFrequency::processLastStages(ChannelBuffer &cb) { //##ifft directly to output. Eigen::Map<Eigen::VectorXf> eOutput(&cb.output[0], cb.output.size()); mFftServer.inv(eOutput, cb.complexTemp); //apply rest of window for resynthesis Eigen::Map<Eigen::VectorXf> eWindow(&mVWindow[0], mVWindow.size()); eOutput = eOutput.cwiseProduct(eWindow); return mBlockSize; } Loading media/libstagefright/xmlparser/api/current.txt +23 −1 Original line number Diff line number Diff line Loading @@ -68,16 +68,26 @@ package media.codecs { public class MediaCodec { ctor public MediaCodec(); method public java.util.List<media.codecs.Alias> getAlias_optional(); method public java.util.List<media.codecs.Quirk> getAttribute_optional(); method public String getDomain(); method public String getEnabled(); method public java.util.List<media.codecs.Feature> getFeature_optional(); method public java.util.List<media.codecs.Limit> getLimit_optional(); method public String getName(); method public java.util.List<media.codecs.Quirk> getQuirk_optional(); method public String getRank(); method public String getType(); method public java.util.List<media.codecs.Type> getType_optional(); method public String getUpdate(); method public String getVariant(); method public java.util.List<media.codecs.Variant> getVariant_optional(); method public void setDomain(String); method public void setEnabled(String); method public void setName(String); method public void setRank(String); method public void setType(String); method public void setUpdate(String); method public void setVariant(String); } public class MediaCodecs { Loading @@ -91,14 +101,18 @@ package media.codecs { public class Quirk { ctor public Quirk(); method public String getName(); method public String getValue(); method public void setName(String); method public void setValue(String); } public class Setting { ctor public Setting(); method public String getEnabled(); method public String getName(); method public String getUpdate(); method public String getValue(); method public void setEnabled(String); method public void setName(String); method public void setUpdate(String); method public void setValue(String); Loading @@ -106,7 +120,9 @@ package media.codecs { public class Settings { ctor public Settings(); method public java.util.List<media.codecs.Setting> getSetting(); method public java.util.List<media.codecs.Setting> getDomain_optional(); method public java.util.List<media.codecs.Setting> getSetting_optional(); method public java.util.List<media.codecs.Setting> getVariant_optional(); } public class Type { Loading @@ -120,6 +136,12 @@ package media.codecs { method public void setUpdate(String); } public class Variant { ctor public Variant(); method public String getName(); method public void setName(String); } public class XmlParser { ctor public XmlParser(); method public static media.codecs.Included readIncluded(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; Loading media/libstagefright/xmlparser/media_codecs.xsd +16 −3 Original line number Diff line number Diff line Loading @@ -49,24 +49,33 @@ </xs:sequence> </xs:complexType> <xs:complexType name="Settings"> <xs:sequence> <xs:element name="Setting" type="Setting" maxOccurs="unbounded"/> </xs:sequence> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Setting" type="Setting"/> <xs:element name="Variant" type="Setting"/> <xs:element name="Domain" type="Setting"/> </xs:choice> </xs:complexType> <xs:complexType name="MediaCodec"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Quirk" type="Quirk" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Attribute" type="Quirk" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Type" type="Type" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Alias" type="Alias" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Limit" type="Limit" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Feature" type="Feature" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Variant" type="Variant" minOccurs="0" maxOccurs="unbounded"/> </xs:choice> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="type" type="xs:string"/> <xs:attribute name="update" type="xs:string"/> <xs:attribute name="rank" type="xs:string"/> <xs:attribute name="domain" type="xs:string"/> <xs:attribute name="variant" type="xs:string"/> <xs:attribute name="enabled" type="xs:string"/> </xs:complexType> <xs:complexType name="Quirk"> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> </xs:complexType> <xs:complexType name="Type"> <xs:sequence> Loading Loading @@ -97,9 +106,13 @@ <xs:attribute name="required" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> </xs:complexType> <xs:complexType name="Variant"> <xs:attribute name="name" type="xs:string"/> </xs:complexType> <xs:complexType name="Setting"> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> <xs:attribute name="enabled" type="xs:string"/> <xs:attribute name="update" type="xs:string"/> </xs:complexType> <xs:complexType name="Include"> Loading services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +6 −5 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #include "DeviceDescriptor.h" #include <utils/RefBase.h> #include <media/AudioPolicy.h> #include <utils/KeyedVector.h> #include <utils/Vector.h> #include <system/audio.h> #include <utils/String8.h> Loading Loading @@ -48,14 +48,15 @@ private: }; class AudioPolicyMixCollection : public DefaultKeyedVector<String8, sp<AudioPolicyMix> > class AudioPolicyMixCollection : public Vector<sp<AudioPolicyMix>> { public: status_t getAudioPolicyMix(const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t registerMix(const String8& address, AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t unregisterMix(const String8& address); status_t unregisterMix(const AudioMix& mix); void closeOutput(sp<SwAudioOutputDescriptor> &desc); Loading services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +67 −39 Original line number Diff line number Diff line Loading @@ -73,16 +73,21 @@ void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const } } status_t AudioPolicyMixCollection::registerMix(const String8& address, AudioMix mix, sp<SwAudioOutputDescriptor> desc) status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc) { ssize_t index = indexOfKey(address); if (index >= 0) { ALOGE("registerPolicyMixes(): mix for address %s already registered", address.string()); for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); if (mix.mDeviceType == registeredMix->mDeviceType && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0) { ALOGE("registerMix(): mix already registered for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); return BAD_VALUE; } } sp<AudioPolicyMix> policyMix = new AudioPolicyMix(mix); add(address, policyMix); add(policyMix); ALOGD("registerMix(): adding mix for dev=0x%x addr=%s", policyMix->mDeviceType, policyMix->mDeviceAddress.string()); if (desc != 0) { desc->mPolicyMix = policyMix; Loading @@ -91,34 +96,48 @@ status_t AudioPolicyMixCollection::registerMix(const String8& address, AudioMix return NO_ERROR; } status_t AudioPolicyMixCollection::unregisterMix(const String8& address) status_t AudioPolicyMixCollection::unregisterMix(const AudioMix& mix) { ssize_t index = indexOfKey(address); if (index < 0) { ALOGE("unregisterPolicyMixes(): mix for address %s not registered", address.string()); for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); if (mix.mDeviceType == registeredMix->mDeviceType && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0) { ALOGD("unregisterMix(): removing mix for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); removeAt(i); return NO_ERROR; } } ALOGE("unregisterMix(): mix not registered for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); return BAD_VALUE; } removeItemsAt(index); status_t AudioPolicyMixCollection::getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const { ALOGV("getAudioPolicyMix() for dev=0x%x addr=%s", deviceType, address.string()); for (ssize_t i = 0; i < size(); i++) { if (itemAt(i)->mDeviceType == deviceType && itemAt(i)->mDeviceAddress.compare(address) == 0) { policyMix = itemAt(i); ALOGV("getAudioPolicyMix: found mix %zu match (devType=0x%x addr=%s)", i, deviceType, address.string()); return NO_ERROR; } } status_t AudioPolicyMixCollection::getAudioPolicyMix(const String8& address, sp<AudioPolicyMix> &policyMix) const { ssize_t index = indexOfKey(address); if (index < 0) { ALOGE("unregisterPolicyMixes(): mix for address %s not registered", address.string()); ALOGE("getAudioPolicyMix(): mix not registered for dev=0x%x addr=%s", deviceType, address.string()); return BAD_VALUE; } policyMix = valueAt(index); return NO_ERROR; } void AudioPolicyMixCollection::closeOutput(sp<SwAudioOutputDescriptor> &desc) { for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> policyMix = valueAt(i); sp<AudioPolicyMix> policyMix = itemAt(i); if (policyMix->getOutput() == desc) { policyMix->clearOutput(); } Loading @@ -134,7 +153,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr( ALOGV("getOutputForAttr() querying %zu mixes:", size()); primaryDesc = 0; for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> policyMix = valueAt(i); sp<AudioPolicyMix> policyMix = itemAt(i); const bool primaryOutputMix = !is_mix_loopback_render(policyMix->mRouteFlags); if (!primaryOutputMix && (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ)) { // AAudio does not support MMAP_NO_IRQ loopback render, and there is no way with Loading Loading @@ -320,10 +339,10 @@ sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForOutput( const DeviceVector &availableOutputDevices) { for (size_t i = 0; i < size(); i++) { if (valueAt(i)->getOutput() == output) { if (itemAt(i)->getOutput() == output) { // This Desc is involved in a Mix, which has the highest prio audio_devices_t deviceType = valueAt(i)->mDeviceType; String8 address = valueAt(i)->mDeviceAddress; audio_devices_t deviceType = itemAt(i)->mDeviceType; String8 address = itemAt(i)->mDeviceAddress; ALOGV("%s: device (0x%x, addr=%s) forced by mix", __FUNCTION__, deviceType, address.c_str()); return availableOutputDevices.getDevice(deviceType, address, AUDIO_FORMAT_DEFAULT); Loading @@ -338,7 +357,7 @@ sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForInputSource( sp<AudioPolicyMix> *policyMix) const { for (size_t i = 0; i < size(); i++) { AudioPolicyMix *mix = valueAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (mix->mMixType != MIX_TYPE_RECORDERS) { continue; } Loading Loading @@ -374,19 +393,28 @@ status_t AudioPolicyMixCollection::getInputMixForAttr( String8 address(attr.tags + strlen("addr=")); #ifdef LOG_NDEBUG ALOGV("getInputMixForAttr looking for address %s\n mixes available:", address.string()); ALOGV("getInputMixForAttr looking for address %s for source %d\n mixes available:", address.string(), attr.source); for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> audioPolicyMix = valueAt(i); const sp<AudioPolicyMix> audioPolicyMix = itemAt(i); ALOGV("\tmix %zu address=%s", i, audioPolicyMix->mDeviceAddress.string()); } #endif ssize_t index = indexOfKey(address); if (index < 0) { size_t index; for (index = 0; index < size(); index++) { const sp<AudioPolicyMix>& registeredMix = itemAt(index); if (registeredMix->mDeviceAddress.compare(address) == 0) { ALOGD("getInputMixForAttr found addr=%s dev=0x%x", registeredMix->mDeviceAddress.string(), registeredMix->mDeviceType); break; } } if (index == size()) { ALOGW("getInputMixForAttr() no policy for address %s", address.string()); return BAD_VALUE; } sp<AudioPolicyMix> audioPolicyMix = valueAt(index); const sp<AudioPolicyMix> audioPolicyMix = itemAt(index); if (audioPolicyMix->mMixType != MIX_TYPE_PLAYERS) { ALOGW("getInputMixForAttr() bad policy mix type for address %s", address.string()); Loading @@ -404,7 +432,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // "match uid" rule for this uid, return an error // (adding a uid-device affinity would result in contradictory rules) for (size_t i = 0; i < size(); i++) { const AudioPolicyMix* mix = valueAt(i).get(); const AudioPolicyMix* mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading @@ -421,7 +449,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // AND it doesn't have a "match uid" rule // THEN add a rule to exclude the uid for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -452,7 +480,7 @@ status_t AudioPolicyMixCollection::removeUidDeviceAffinities(uid_t uid) { // for each player mix: remove existing rules that match or exclude this uid for (size_t i = 0; i < size(); i++) { bool foundUidRule = false; const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -481,7 +509,7 @@ status_t AudioPolicyMixCollection::getDevicesForUid(uid_t uid, // for each player mix: find rules that don't exclude this uid, and add the device to the list for (size_t i = 0; i < size(); i++) { bool ruleAllowsUid = true; const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (mix->mMixType != MIX_TYPE_PLAYERS) { continue; } Loading @@ -504,7 +532,7 @@ void AudioPolicyMixCollection::dump(String8 *dst) const { dst->append("\nAudio Policy Mix:\n"); for (size_t i = 0; i < size(); i++) { valueAt(i)->dump(dst, 2, i); itemAt(i)->dump(dst, 2, i); } } Loading Loading
media/libeffects/dynamicsproc/dsp/DPFrequency.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -62,11 +62,6 @@ void ChannelBuffer::initBuffers(unsigned int blockSize, unsigned int overlapSize cBInput.resize(mBlockSize * CIRCULAR_BUFFER_UPSAMPLE); cBOutput.resize(mBlockSize * CIRCULAR_BUFFER_UPSAMPLE); //fill input with half block size... for (unsigned int k = 0; k < mBlockSize/2; k++) { cBInput.write(0); } //temp vectors input.resize(mBlockSize); output.resize(mBlockSize); Loading Loading @@ -170,6 +165,11 @@ void DPFrequency::configure(size_t blockSize, size_t overlapSize, fill_window(mVWindow, RDSP_WINDOW_HANNING_FLAT_TOP, mBlockSize, mOverlapSize); //split window into analysis and synthesis. Both are the sqrt() of original //window Eigen::Map<Eigen::VectorXf> eWindow(&mVWindow[0], mVWindow.size()); eWindow = eWindow.array().sqrt(); //compute window rms for energy compensation mWindowRms = 0; for (size_t i = 0; i < mVWindow.size(); i++) { Loading Loading @@ -666,6 +666,11 @@ size_t DPFrequency::processLastStages(ChannelBuffer &cb) { //##ifft directly to output. Eigen::Map<Eigen::VectorXf> eOutput(&cb.output[0], cb.output.size()); mFftServer.inv(eOutput, cb.complexTemp); //apply rest of window for resynthesis Eigen::Map<Eigen::VectorXf> eWindow(&mVWindow[0], mVWindow.size()); eOutput = eOutput.cwiseProduct(eWindow); return mBlockSize; } Loading
media/libstagefright/xmlparser/api/current.txt +23 −1 Original line number Diff line number Diff line Loading @@ -68,16 +68,26 @@ package media.codecs { public class MediaCodec { ctor public MediaCodec(); method public java.util.List<media.codecs.Alias> getAlias_optional(); method public java.util.List<media.codecs.Quirk> getAttribute_optional(); method public String getDomain(); method public String getEnabled(); method public java.util.List<media.codecs.Feature> getFeature_optional(); method public java.util.List<media.codecs.Limit> getLimit_optional(); method public String getName(); method public java.util.List<media.codecs.Quirk> getQuirk_optional(); method public String getRank(); method public String getType(); method public java.util.List<media.codecs.Type> getType_optional(); method public String getUpdate(); method public String getVariant(); method public java.util.List<media.codecs.Variant> getVariant_optional(); method public void setDomain(String); method public void setEnabled(String); method public void setName(String); method public void setRank(String); method public void setType(String); method public void setUpdate(String); method public void setVariant(String); } public class MediaCodecs { Loading @@ -91,14 +101,18 @@ package media.codecs { public class Quirk { ctor public Quirk(); method public String getName(); method public String getValue(); method public void setName(String); method public void setValue(String); } public class Setting { ctor public Setting(); method public String getEnabled(); method public String getName(); method public String getUpdate(); method public String getValue(); method public void setEnabled(String); method public void setName(String); method public void setUpdate(String); method public void setValue(String); Loading @@ -106,7 +120,9 @@ package media.codecs { public class Settings { ctor public Settings(); method public java.util.List<media.codecs.Setting> getSetting(); method public java.util.List<media.codecs.Setting> getDomain_optional(); method public java.util.List<media.codecs.Setting> getSetting_optional(); method public java.util.List<media.codecs.Setting> getVariant_optional(); } public class Type { Loading @@ -120,6 +136,12 @@ package media.codecs { method public void setUpdate(String); } public class Variant { ctor public Variant(); method public String getName(); method public void setName(String); } public class XmlParser { ctor public XmlParser(); method public static media.codecs.Included readIncluded(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; Loading
media/libstagefright/xmlparser/media_codecs.xsd +16 −3 Original line number Diff line number Diff line Loading @@ -49,24 +49,33 @@ </xs:sequence> </xs:complexType> <xs:complexType name="Settings"> <xs:sequence> <xs:element name="Setting" type="Setting" maxOccurs="unbounded"/> </xs:sequence> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Setting" type="Setting"/> <xs:element name="Variant" type="Setting"/> <xs:element name="Domain" type="Setting"/> </xs:choice> </xs:complexType> <xs:complexType name="MediaCodec"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Quirk" type="Quirk" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Attribute" type="Quirk" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Type" type="Type" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Alias" type="Alias" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Limit" type="Limit" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Feature" type="Feature" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Variant" type="Variant" minOccurs="0" maxOccurs="unbounded"/> </xs:choice> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="type" type="xs:string"/> <xs:attribute name="update" type="xs:string"/> <xs:attribute name="rank" type="xs:string"/> <xs:attribute name="domain" type="xs:string"/> <xs:attribute name="variant" type="xs:string"/> <xs:attribute name="enabled" type="xs:string"/> </xs:complexType> <xs:complexType name="Quirk"> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> </xs:complexType> <xs:complexType name="Type"> <xs:sequence> Loading Loading @@ -97,9 +106,13 @@ <xs:attribute name="required" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> </xs:complexType> <xs:complexType name="Variant"> <xs:attribute name="name" type="xs:string"/> </xs:complexType> <xs:complexType name="Setting"> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="value" type="xs:string"/> <xs:attribute name="enabled" type="xs:string"/> <xs:attribute name="update" type="xs:string"/> </xs:complexType> <xs:complexType name="Include"> Loading
services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +6 −5 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #include "DeviceDescriptor.h" #include <utils/RefBase.h> #include <media/AudioPolicy.h> #include <utils/KeyedVector.h> #include <utils/Vector.h> #include <system/audio.h> #include <utils/String8.h> Loading Loading @@ -48,14 +48,15 @@ private: }; class AudioPolicyMixCollection : public DefaultKeyedVector<String8, sp<AudioPolicyMix> > class AudioPolicyMixCollection : public Vector<sp<AudioPolicyMix>> { public: status_t getAudioPolicyMix(const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t registerMix(const String8& address, AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t unregisterMix(const String8& address); status_t unregisterMix(const AudioMix& mix); void closeOutput(sp<SwAudioOutputDescriptor> &desc); Loading
services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +67 −39 Original line number Diff line number Diff line Loading @@ -73,16 +73,21 @@ void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const } } status_t AudioPolicyMixCollection::registerMix(const String8& address, AudioMix mix, sp<SwAudioOutputDescriptor> desc) status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc) { ssize_t index = indexOfKey(address); if (index >= 0) { ALOGE("registerPolicyMixes(): mix for address %s already registered", address.string()); for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); if (mix.mDeviceType == registeredMix->mDeviceType && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0) { ALOGE("registerMix(): mix already registered for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); return BAD_VALUE; } } sp<AudioPolicyMix> policyMix = new AudioPolicyMix(mix); add(address, policyMix); add(policyMix); ALOGD("registerMix(): adding mix for dev=0x%x addr=%s", policyMix->mDeviceType, policyMix->mDeviceAddress.string()); if (desc != 0) { desc->mPolicyMix = policyMix; Loading @@ -91,34 +96,48 @@ status_t AudioPolicyMixCollection::registerMix(const String8& address, AudioMix return NO_ERROR; } status_t AudioPolicyMixCollection::unregisterMix(const String8& address) status_t AudioPolicyMixCollection::unregisterMix(const AudioMix& mix) { ssize_t index = indexOfKey(address); if (index < 0) { ALOGE("unregisterPolicyMixes(): mix for address %s not registered", address.string()); for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); if (mix.mDeviceType == registeredMix->mDeviceType && mix.mDeviceAddress.compare(registeredMix->mDeviceAddress) == 0) { ALOGD("unregisterMix(): removing mix for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); removeAt(i); return NO_ERROR; } } ALOGE("unregisterMix(): mix not registered for dev=0x%x addr=%s", mix.mDeviceType, mix.mDeviceAddress.string()); return BAD_VALUE; } removeItemsAt(index); status_t AudioPolicyMixCollection::getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const { ALOGV("getAudioPolicyMix() for dev=0x%x addr=%s", deviceType, address.string()); for (ssize_t i = 0; i < size(); i++) { if (itemAt(i)->mDeviceType == deviceType && itemAt(i)->mDeviceAddress.compare(address) == 0) { policyMix = itemAt(i); ALOGV("getAudioPolicyMix: found mix %zu match (devType=0x%x addr=%s)", i, deviceType, address.string()); return NO_ERROR; } } status_t AudioPolicyMixCollection::getAudioPolicyMix(const String8& address, sp<AudioPolicyMix> &policyMix) const { ssize_t index = indexOfKey(address); if (index < 0) { ALOGE("unregisterPolicyMixes(): mix for address %s not registered", address.string()); ALOGE("getAudioPolicyMix(): mix not registered for dev=0x%x addr=%s", deviceType, address.string()); return BAD_VALUE; } policyMix = valueAt(index); return NO_ERROR; } void AudioPolicyMixCollection::closeOutput(sp<SwAudioOutputDescriptor> &desc) { for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> policyMix = valueAt(i); sp<AudioPolicyMix> policyMix = itemAt(i); if (policyMix->getOutput() == desc) { policyMix->clearOutput(); } Loading @@ -134,7 +153,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr( ALOGV("getOutputForAttr() querying %zu mixes:", size()); primaryDesc = 0; for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> policyMix = valueAt(i); sp<AudioPolicyMix> policyMix = itemAt(i); const bool primaryOutputMix = !is_mix_loopback_render(policyMix->mRouteFlags); if (!primaryOutputMix && (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ)) { // AAudio does not support MMAP_NO_IRQ loopback render, and there is no way with Loading Loading @@ -320,10 +339,10 @@ sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForOutput( const DeviceVector &availableOutputDevices) { for (size_t i = 0; i < size(); i++) { if (valueAt(i)->getOutput() == output) { if (itemAt(i)->getOutput() == output) { // This Desc is involved in a Mix, which has the highest prio audio_devices_t deviceType = valueAt(i)->mDeviceType; String8 address = valueAt(i)->mDeviceAddress; audio_devices_t deviceType = itemAt(i)->mDeviceType; String8 address = itemAt(i)->mDeviceAddress; ALOGV("%s: device (0x%x, addr=%s) forced by mix", __FUNCTION__, deviceType, address.c_str()); return availableOutputDevices.getDevice(deviceType, address, AUDIO_FORMAT_DEFAULT); Loading @@ -338,7 +357,7 @@ sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForInputSource( sp<AudioPolicyMix> *policyMix) const { for (size_t i = 0; i < size(); i++) { AudioPolicyMix *mix = valueAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (mix->mMixType != MIX_TYPE_RECORDERS) { continue; } Loading Loading @@ -374,19 +393,28 @@ status_t AudioPolicyMixCollection::getInputMixForAttr( String8 address(attr.tags + strlen("addr=")); #ifdef LOG_NDEBUG ALOGV("getInputMixForAttr looking for address %s\n mixes available:", address.string()); ALOGV("getInputMixForAttr looking for address %s for source %d\n mixes available:", address.string(), attr.source); for (size_t i = 0; i < size(); i++) { sp<AudioPolicyMix> audioPolicyMix = valueAt(i); const sp<AudioPolicyMix> audioPolicyMix = itemAt(i); ALOGV("\tmix %zu address=%s", i, audioPolicyMix->mDeviceAddress.string()); } #endif ssize_t index = indexOfKey(address); if (index < 0) { size_t index; for (index = 0; index < size(); index++) { const sp<AudioPolicyMix>& registeredMix = itemAt(index); if (registeredMix->mDeviceAddress.compare(address) == 0) { ALOGD("getInputMixForAttr found addr=%s dev=0x%x", registeredMix->mDeviceAddress.string(), registeredMix->mDeviceType); break; } } if (index == size()) { ALOGW("getInputMixForAttr() no policy for address %s", address.string()); return BAD_VALUE; } sp<AudioPolicyMix> audioPolicyMix = valueAt(index); const sp<AudioPolicyMix> audioPolicyMix = itemAt(index); if (audioPolicyMix->mMixType != MIX_TYPE_PLAYERS) { ALOGW("getInputMixForAttr() bad policy mix type for address %s", address.string()); Loading @@ -404,7 +432,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // "match uid" rule for this uid, return an error // (adding a uid-device affinity would result in contradictory rules) for (size_t i = 0; i < size(); i++) { const AudioPolicyMix* mix = valueAt(i).get(); const AudioPolicyMix* mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading @@ -421,7 +449,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // AND it doesn't have a "match uid" rule // THEN add a rule to exclude the uid for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -452,7 +480,7 @@ status_t AudioPolicyMixCollection::removeUidDeviceAffinities(uid_t uid) { // for each player mix: remove existing rules that match or exclude this uid for (size_t i = 0; i < size(); i++) { bool foundUidRule = false; const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -481,7 +509,7 @@ status_t AudioPolicyMixCollection::getDevicesForUid(uid_t uid, // for each player mix: find rules that don't exclude this uid, and add the device to the list for (size_t i = 0; i < size(); i++) { bool ruleAllowsUid = true; const AudioPolicyMix *mix = valueAt(i).get(); const AudioPolicyMix *mix = itemAt(i).get(); if (mix->mMixType != MIX_TYPE_PLAYERS) { continue; } Loading @@ -504,7 +532,7 @@ void AudioPolicyMixCollection::dump(String8 *dst) const { dst->append("\nAudio Policy Mix:\n"); for (size_t i = 0; i < size(); i++) { valueAt(i)->dump(dst, 2, i); itemAt(i)->dump(dst, 2, i); } } Loading