Loading include/media/AudioSystem.h +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_AUDIOSYSTEM_H_ #define ANDROID_AUDIOSYSTEM_H_ #include <sys/types.h> #include <media/AudioPolicy.h> #include <media/AudioIoDescriptor.h> #include <media/IAudioFlingerClient.h> Loading services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #pragma once #include <sys/types.h> #include "AudioPort.h" #include <RoutingStrategy.h> #include <utils/Errors.h> Loading Loading @@ -128,6 +130,7 @@ public: sp<SwAudioOutputDescriptor> mOutput1; // used by duplicated outputs: first output sp<SwAudioOutputDescriptor> mOutput2; // used by duplicated outputs: second output uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only) uid_t mDirectClientUid; // uid of the direct output client uint32_t mGlobalRefCount; // non-stream-specific ref count }; Loading services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,7 @@ SwAudioOutputDescriptor::SwAudioOutputDescriptor(const sp<IOProfile>& profile, : AudioOutputDescriptor(profile, clientInterface), mProfile(profile), mIoHandle(0), mLatency(0), mFlags((audio_output_flags_t)0), mPolicyMix(NULL), mOutput1(0), mOutput2(0), mDirectOpenCount(0), mGlobalRefCount(0) mOutput1(0), mOutput2(0), mDirectOpenCount(0), mDirectClientUid(0), mGlobalRefCount(0) { if (profile != NULL) { mFlags = (audio_output_flags_t)profile->getFlags(); Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +18 −8 Original line number Diff line number Diff line Loading @@ -752,7 +752,7 @@ audio_io_handle_t AudioPolicyManager::getOutput(audio_stream_type_t stream, ALOGV("getOutput() device %d, stream %d, samplingRate %d, format %x, channelMask %x, flags %x", device, stream, samplingRate, format, channelMask, flags); return getOutputForDevice(device, AUDIO_SESSION_ALLOCATE, return getOutputForDevice(device, AUDIO_SESSION_ALLOCATE, uid_t{0} /*Invalid uid*/, stream, samplingRate,format, channelMask, flags, offloadInfo); } Loading Loading @@ -832,7 +832,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, ALOGV("getOutputForAttr() device 0x%x, samplingRate %d, format %x, channelMask %x, flags %x", device, config->sample_rate, config->format, config->channel_mask, flags); *output = getOutputForDevice(device, session, *stream, *output = getOutputForDevice(device, session, uid, *stream, config->sample_rate, config->format, config->channel_mask, flags, &config->offload_info); if (*output == AUDIO_IO_HANDLE_NONE) { Loading @@ -846,6 +846,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, audio_io_handle_t AudioPolicyManager::getOutputForDevice( audio_devices_t device, audio_session_t session __unused, uid_t clientUid, audio_stream_type_t stream, uint32_t samplingRate, audio_format_t format, Loading Loading @@ -954,13 +955,21 @@ audio_io_handle_t AudioPolicyManager::getOutputForDevice( sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i); if (!desc->isDuplicated() && (profile == desc->mProfile)) { outputDesc = desc; // reuse direct output if currently open and configured with same parameters // reuse direct output if currently open by the same client // and configured with same parameters if ((samplingRate == outputDesc->mSamplingRate) && audio_formats_match(format, outputDesc->mFormat) && (channelMask == outputDesc->mChannelMask)) { if (clientUid == outputDesc->mDirectClientUid) { outputDesc->mDirectOpenCount++; ALOGV("getOutput() reusing direct output %d", mOutputs.keyAt(i)); return mOutputs.keyAt(i); } else { ALOGV("getOutput() do not reuse direct output because current client (%ld) " "is not the same as requesting client (%ld)", (long)outputDesc->mDirectClientUid, (long)clientUid); goto non_direct_output; } } } } Loading Loading @@ -1028,6 +1037,7 @@ audio_io_handle_t AudioPolicyManager::getOutputForDevice( outputDesc->mRefCount[stream] = 0; outputDesc->mStopTime[stream] = 0; outputDesc->mDirectOpenCount = 1; outputDesc->mDirectClientUid = clientUid; audio_io_handle_t srcOutput = getOutputForEffect(); addOutput(output, outputDesc); Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +1 −0 Original line number Diff line number Diff line Loading @@ -625,6 +625,7 @@ private: audio_io_handle_t getOutputForDevice( audio_devices_t device, audio_session_t session, uid_t client, audio_stream_type_t stream, uint32_t samplingRate, audio_format_t format, Loading Loading
include/media/AudioSystem.h +2 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #ifndef ANDROID_AUDIOSYSTEM_H_ #define ANDROID_AUDIOSYSTEM_H_ #include <sys/types.h> #include <media/AudioPolicy.h> #include <media/AudioIoDescriptor.h> #include <media/IAudioFlingerClient.h> Loading
services/audiopolicy/common/managerdefinitions/include/AudioOutputDescriptor.h +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #pragma once #include <sys/types.h> #include "AudioPort.h" #include <RoutingStrategy.h> #include <utils/Errors.h> Loading Loading @@ -128,6 +130,7 @@ public: sp<SwAudioOutputDescriptor> mOutput1; // used by duplicated outputs: first output sp<SwAudioOutputDescriptor> mOutput2; // used by duplicated outputs: second output uint32_t mDirectOpenCount; // number of clients using this output (direct outputs only) uid_t mDirectClientUid; // uid of the direct output client uint32_t mGlobalRefCount; // non-stream-specific ref count }; Loading
services/audiopolicy/common/managerdefinitions/src/AudioOutputDescriptor.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,7 @@ SwAudioOutputDescriptor::SwAudioOutputDescriptor(const sp<IOProfile>& profile, : AudioOutputDescriptor(profile, clientInterface), mProfile(profile), mIoHandle(0), mLatency(0), mFlags((audio_output_flags_t)0), mPolicyMix(NULL), mOutput1(0), mOutput2(0), mDirectOpenCount(0), mGlobalRefCount(0) mOutput1(0), mOutput2(0), mDirectOpenCount(0), mDirectClientUid(0), mGlobalRefCount(0) { if (profile != NULL) { mFlags = (audio_output_flags_t)profile->getFlags(); Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +18 −8 Original line number Diff line number Diff line Loading @@ -752,7 +752,7 @@ audio_io_handle_t AudioPolicyManager::getOutput(audio_stream_type_t stream, ALOGV("getOutput() device %d, stream %d, samplingRate %d, format %x, channelMask %x, flags %x", device, stream, samplingRate, format, channelMask, flags); return getOutputForDevice(device, AUDIO_SESSION_ALLOCATE, return getOutputForDevice(device, AUDIO_SESSION_ALLOCATE, uid_t{0} /*Invalid uid*/, stream, samplingRate,format, channelMask, flags, offloadInfo); } Loading Loading @@ -832,7 +832,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, ALOGV("getOutputForAttr() device 0x%x, samplingRate %d, format %x, channelMask %x, flags %x", device, config->sample_rate, config->format, config->channel_mask, flags); *output = getOutputForDevice(device, session, *stream, *output = getOutputForDevice(device, session, uid, *stream, config->sample_rate, config->format, config->channel_mask, flags, &config->offload_info); if (*output == AUDIO_IO_HANDLE_NONE) { Loading @@ -846,6 +846,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, audio_io_handle_t AudioPolicyManager::getOutputForDevice( audio_devices_t device, audio_session_t session __unused, uid_t clientUid, audio_stream_type_t stream, uint32_t samplingRate, audio_format_t format, Loading Loading @@ -954,13 +955,21 @@ audio_io_handle_t AudioPolicyManager::getOutputForDevice( sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i); if (!desc->isDuplicated() && (profile == desc->mProfile)) { outputDesc = desc; // reuse direct output if currently open and configured with same parameters // reuse direct output if currently open by the same client // and configured with same parameters if ((samplingRate == outputDesc->mSamplingRate) && audio_formats_match(format, outputDesc->mFormat) && (channelMask == outputDesc->mChannelMask)) { if (clientUid == outputDesc->mDirectClientUid) { outputDesc->mDirectOpenCount++; ALOGV("getOutput() reusing direct output %d", mOutputs.keyAt(i)); return mOutputs.keyAt(i); } else { ALOGV("getOutput() do not reuse direct output because current client (%ld) " "is not the same as requesting client (%ld)", (long)outputDesc->mDirectClientUid, (long)clientUid); goto non_direct_output; } } } } Loading Loading @@ -1028,6 +1037,7 @@ audio_io_handle_t AudioPolicyManager::getOutputForDevice( outputDesc->mRefCount[stream] = 0; outputDesc->mStopTime[stream] = 0; outputDesc->mDirectOpenCount = 1; outputDesc->mDirectClientUid = clientUid; audio_io_handle_t srcOutput = getOutputForEffect(); addOutput(output, outputDesc); Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +1 −0 Original line number Diff line number Diff line Loading @@ -625,6 +625,7 @@ private: audio_io_handle_t getOutputForDevice( audio_devices_t device, audio_session_t session, uid_t client, audio_stream_type_t stream, uint32_t samplingRate, audio_format_t format, Loading