|
|
@ -27,6 +27,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
namespace android {
|
|
|
|
namespace android {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AudioPolicyMix::AudioPolicyMix(const AudioMix &mix) : AudioMix(mix)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AudioPolicyMix::setOutput(sp<SwAudioOutputDescriptor> &output)
|
|
|
|
void AudioPolicyMix::setOutput(sp<SwAudioOutputDescriptor> &output)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
mOutput = output;
|
|
|
|
mOutput = output;
|
|
|
@ -42,16 +46,6 @@ void AudioPolicyMix::clearOutput()
|
|
|
|
mOutput.clear();
|
|
|
|
mOutput.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void AudioPolicyMix::setMix(AudioMix &mix)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
mMix = mix;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
android::AudioMix *AudioPolicyMix::getMix()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return &mMix;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
status_t AudioPolicyMix::dump(int fd, int spaces, int index) const
|
|
|
|
status_t AudioPolicyMix::dump(int fd, int spaces, int index) const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const size_t SIZE = 256;
|
|
|
|
const size_t SIZE = 256;
|
|
|
@ -61,25 +55,25 @@ status_t AudioPolicyMix::dump(int fd, int spaces, int index) const
|
|
|
|
snprintf(buffer, SIZE, "%*sAudio Policy Mix %d:\n", spaces, "", index+1);
|
|
|
|
snprintf(buffer, SIZE, "%*sAudio Policy Mix %d:\n", spaces, "", index+1);
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
std::string mixTypeLiteral;
|
|
|
|
std::string mixTypeLiteral;
|
|
|
|
if (!MixTypeConverter::toString(mMix.mMixType, mixTypeLiteral)) {
|
|
|
|
if (!MixTypeConverter::toString(mMixType, mixTypeLiteral)) {
|
|
|
|
ALOGE("%s: failed to convert mix type %d", __FUNCTION__, mMix.mMixType);
|
|
|
|
ALOGE("%s: failed to convert mix type %d", __FUNCTION__, mMixType);
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
snprintf(buffer, SIZE, "%*s- mix type: %s\n", spaces, "", mixTypeLiteral.c_str());
|
|
|
|
snprintf(buffer, SIZE, "%*s- mix type: %s\n", spaces, "", mixTypeLiteral.c_str());
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
std::string routeFlagLiteral;
|
|
|
|
std::string routeFlagLiteral;
|
|
|
|
RouteFlagTypeConverter::maskToString(mMix.mRouteFlags, routeFlagLiteral);
|
|
|
|
RouteFlagTypeConverter::maskToString(mRouteFlags, routeFlagLiteral);
|
|
|
|
snprintf(buffer, SIZE, "%*s- Route Flags: %s\n", spaces, "", routeFlagLiteral.c_str());
|
|
|
|
snprintf(buffer, SIZE, "%*s- Route Flags: %s\n", spaces, "", routeFlagLiteral.c_str());
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
std::string deviceLiteral;
|
|
|
|
std::string deviceLiteral;
|
|
|
|
deviceToString(mMix.mDeviceType, deviceLiteral);
|
|
|
|
deviceToString(mDeviceType, deviceLiteral);
|
|
|
|
snprintf(buffer, SIZE, "%*s- device type: %s\n", spaces, "", deviceLiteral.c_str());
|
|
|
|
snprintf(buffer, SIZE, "%*s- device type: %s\n", spaces, "", deviceLiteral.c_str());
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
snprintf(buffer, SIZE, "%*s- device address: %s\n", spaces, "", mMix.mDeviceAddress.string());
|
|
|
|
snprintf(buffer, SIZE, "%*s- device address: %s\n", spaces, "", mDeviceAddress.string());
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
|
|
|
|
|
|
|
|
int indexCriterion = 0;
|
|
|
|
int indexCriterion = 0;
|
|
|
|
for (const auto &criterion : mMix.mCriteria) {
|
|
|
|
for (const auto &criterion : mCriteria) {
|
|
|
|
snprintf(buffer, SIZE, "%*s- Criterion %d:\n", spaces + 2, "", indexCriterion++);
|
|
|
|
snprintf(buffer, SIZE, "%*s- Criterion %d:\n", spaces + 2, "", indexCriterion++);
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
std::string usageLiteral;
|
|
|
|
std::string usageLiteral;
|
|
|
@ -89,7 +83,7 @@ status_t AudioPolicyMix::dump(int fd, int spaces, int index) const
|
|
|
|
}
|
|
|
|
}
|
|
|
|
snprintf(buffer, SIZE, "%*s- Usage:%s\n", spaces + 4, "", usageLiteral.c_str());
|
|
|
|
snprintf(buffer, SIZE, "%*s- Usage:%s\n", spaces + 4, "", usageLiteral.c_str());
|
|
|
|
result.append(buffer);
|
|
|
|
result.append(buffer);
|
|
|
|
if (mMix.mMixType == MIX_TYPE_RECORDERS) {
|
|
|
|
if (mMixType == MIX_TYPE_RECORDERS) {
|
|
|
|
std::string sourceLiteral;
|
|
|
|
std::string sourceLiteral;
|
|
|
|
if (!SourceTypeConverter::toString(criterion.mValue.mSource, sourceLiteral)) {
|
|
|
|
if (!SourceTypeConverter::toString(criterion.mValue.mSource, sourceLiteral)) {
|
|
|
|
ALOGE("%s: failed to convert source %d", __FUNCTION__, criterion.mValue.mSource);
|
|
|
|
ALOGE("%s: failed to convert source %d", __FUNCTION__, criterion.mValue.mSource);
|
|
|
@ -120,12 +114,11 @@ status_t AudioPolicyMixCollection::registerMix(const String8& address, AudioMix
|
|
|
|
ALOGE("registerPolicyMixes(): mix for address %s already registered", address.string());
|
|
|
|
ALOGE("registerPolicyMixes(): mix for address %s already registered", address.string());
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sp<AudioPolicyMix> policyMix = new AudioPolicyMix();
|
|
|
|
sp<AudioPolicyMix> policyMix = new AudioPolicyMix(mix);
|
|
|
|
policyMix->setMix(mix);
|
|
|
|
|
|
|
|
add(address, policyMix);
|
|
|
|
add(address, policyMix);
|
|
|
|
|
|
|
|
|
|
|
|
if (desc != 0) {
|
|
|
|
if (desc != 0) {
|
|
|
|
desc->mPolicyMix = policyMix->getMix();
|
|
|
|
desc->mPolicyMix = policyMix;
|
|
|
|
policyMix->setOutput(desc);
|
|
|
|
policyMix->setOutput(desc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NO_ERROR;
|
|
|
|
return NO_ERROR;
|
|
|
@ -171,8 +164,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
|
|
|
|
ALOGV("getOutputForAttr() querying %zu mixes:", size());
|
|
|
|
ALOGV("getOutputForAttr() querying %zu mixes:", size());
|
|
|
|
desc = 0;
|
|
|
|
desc = 0;
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
sp<AudioPolicyMix> policyMix = valueAt(i);
|
|
|
|
sp<AudioPolicyMix> mix = valueAt(i);
|
|
|
|
AudioMix *mix = policyMix->getMix();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mix->mMixType == MIX_TYPE_PLAYERS) {
|
|
|
|
if (mix->mMixType == MIX_TYPE_PLAYERS) {
|
|
|
|
// TODO if adding more player rules (currently only 2), make rule handling "generic"
|
|
|
|
// TODO if adding more player rules (currently only 2), make rule handling "generic"
|
|
|
@ -269,7 +261,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
|
|
|
|
(hasUidExcludeRules && uidExclusionFound) ||
|
|
|
|
(hasUidExcludeRules && uidExclusionFound) ||
|
|
|
|
(hasUidMatchRules && !uidMatchFound))) {
|
|
|
|
(hasUidMatchRules && !uidMatchFound))) {
|
|
|
|
ALOGV("\tgetOutputForAttr will use mix %zu", i);
|
|
|
|
ALOGV("\tgetOutputForAttr will use mix %zu", i);
|
|
|
|
desc = policyMix->getOutput();
|
|
|
|
desc = mix->getOutput();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} else if (mix->mMixType == MIX_TYPE_RECORDERS) {
|
|
|
|
} else if (mix->mMixType == MIX_TYPE_RECORDERS) {
|
|
|
@ -278,7 +270,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
|
|
|
|
strncmp(attributes.tags + strlen("addr="),
|
|
|
|
strncmp(attributes.tags + strlen("addr="),
|
|
|
|
mix->mDeviceAddress.string(),
|
|
|
|
mix->mDeviceAddress.string(),
|
|
|
|
AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - strlen("addr=") - 1) == 0) {
|
|
|
|
AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - strlen("addr=") - 1) == 0) {
|
|
|
|
desc = policyMix->getOutput();
|
|
|
|
desc = mix->getOutput();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (desc != 0) {
|
|
|
|
if (desc != 0) {
|
|
|
@ -289,12 +281,13 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio_devices_t AudioPolicyMixCollection::getDeviceAndMixForInputSource(audio_source_t inputSource,
|
|
|
|
audio_devices_t AudioPolicyMixCollection::getDeviceAndMixForInputSource(
|
|
|
|
audio_devices_t availDevices,
|
|
|
|
audio_source_t inputSource,
|
|
|
|
AudioMix **policyMix)
|
|
|
|
audio_devices_t availDevices,
|
|
|
|
|
|
|
|
sp<AudioPolicyMix> *policyMix)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
AudioMix *mix = valueAt(i)->getMix();
|
|
|
|
AudioPolicyMix *mix = valueAt(i).get();
|
|
|
|
|
|
|
|
|
|
|
|
if (mix->mMixType != MIX_TYPE_RECORDERS) {
|
|
|
|
if (mix->mMixType != MIX_TYPE_RECORDERS) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
@ -317,7 +310,8 @@ audio_devices_t AudioPolicyMixCollection::getDeviceAndMixForInputSource(audio_so
|
|
|
|
return AUDIO_DEVICE_NONE;
|
|
|
|
return AUDIO_DEVICE_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
status_t AudioPolicyMixCollection::getInputMixForAttr(audio_attributes_t attr, AudioMix **policyMix)
|
|
|
|
status_t AudioPolicyMixCollection::getInputMixForAttr(
|
|
|
|
|
|
|
|
audio_attributes_t attr, sp<AudioPolicyMix> *policyMix)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (strncmp(attr.tags, "addr=", strlen("addr=")) != 0) {
|
|
|
|
if (strncmp(attr.tags, "addr=", strlen("addr=")) != 0) {
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
@ -327,8 +321,7 @@ status_t AudioPolicyMixCollection::getInputMixForAttr(audio_attributes_t attr, A
|
|
|
|
#ifdef LOG_NDEBUG
|
|
|
|
#ifdef LOG_NDEBUG
|
|
|
|
ALOGV("getInputMixForAttr looking for address %s\n mixes available:", address.string());
|
|
|
|
ALOGV("getInputMixForAttr looking for address %s\n mixes available:", address.string());
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
for (size_t i = 0; i < size(); i++) {
|
|
|
|
sp<AudioPolicyMix> policyMix = valueAt(i);
|
|
|
|
sp<AudioPolicyMix> mix = valueAt(i);
|
|
|
|
AudioMix *mix = policyMix->getMix();
|
|
|
|
|
|
|
|
ALOGV("\tmix %zu address=%s", i, mix->mDeviceAddress.string());
|
|
|
|
ALOGV("\tmix %zu address=%s", i, mix->mDeviceAddress.string());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
@ -339,13 +332,14 @@ status_t AudioPolicyMixCollection::getInputMixForAttr(audio_attributes_t attr, A
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sp<AudioPolicyMix> audioPolicyMix = valueAt(index);
|
|
|
|
sp<AudioPolicyMix> audioPolicyMix = valueAt(index);
|
|
|
|
AudioMix *mix = audioPolicyMix->getMix();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mix->mMixType != MIX_TYPE_PLAYERS) {
|
|
|
|
if (audioPolicyMix->mMixType != MIX_TYPE_PLAYERS) {
|
|
|
|
ALOGW("getInputMixForAttr() bad policy mix type for address %s", address.string());
|
|
|
|
ALOGW("getInputMixForAttr() bad policy mix type for address %s", address.string());
|
|
|
|
return BAD_VALUE;
|
|
|
|
return BAD_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*policyMix = mix;
|
|
|
|
if (policyMix != nullptr) {
|
|
|
|
|
|
|
|
*policyMix = audioPolicyMix;
|
|
|
|
|
|
|
|
}
|
|
|
|
return NO_ERROR;
|
|
|
|
return NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|