Loading services/audiopolicy/common/managerdefinitions/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ LOCAL_SRC_FILES:= \ src/EffectDescriptor.cpp \ src/ConfigParsingUtils.cpp \ src/SoundTriggerSession.cpp \ src/SessionRoute.cpp \ LOCAL_SHARED_LIBRARIES := \ libcutils \ Loading services/audiopolicy/common/managerdefinitions/include/SessionRoute.h 0 → 100644 +118 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <system/audio.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> #include <utils/Errors.h> namespace android { class DeviceDescriptor; class SessionRoute : public RefBase { public: // For Input (Source) routes, use STREAM_TYPE_NA ("NA" = "not applicable)for the // streamType argument static const audio_stream_type_t STREAM_TYPE_NA = AUDIO_STREAM_DEFAULT; // For Output (Sink) routes, use SOURCE_TYPE_NA ("NA" = "not applicable") for the // source argument static const audio_source_t SOURCE_TYPE_NA = AUDIO_SOURCE_DEFAULT; SessionRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid) : mUid(uid), mSession(session), mDeviceDescriptor(deviceDescriptor), mRefCount(0), mActivityCount(0), mChanged(false), mStreamType(streamType), mSource(source) {} void log(const char* prefix); bool isActive() { return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0)); } uid_t mUid; audio_session_t mSession; sp<DeviceDescriptor> mDeviceDescriptor; // "reference" counting int mRefCount; // +/- on references int mActivityCount; // +/- on start/stop bool mChanged; // for outputs const audio_stream_type_t mStreamType; // for inputs const audio_source_t mSource; }; class SessionRouteMap: public KeyedVector<audio_session_t, sp<SessionRoute> > { public: // These constants identify the SessionRoutMap as holding EITHER input routes, // or output routes. An error will occur if an attempt is made to add a SessionRoute // object with mStreamType == STREAM_TYPE_NA (i.e. an input SessionRoute) to a // SessionRoutMap that is marked for output (i.e. mMapType == SESSION_ROUTE_MAP_OUTPUT) // and similarly for output SessionRoutes and Input SessionRouteMaps. typedef enum { MAPTYPE_INPUT = 0, MAPTYPE_OUTPUT = 1 } session_route_map_type_t; SessionRouteMap(session_route_map_type_t mapType) : mMapType(mapType) {} bool hasRoute(audio_session_t session); void removeRoute(audio_session_t session); int incRouteActivity(audio_session_t session); int decRouteActivity(audio_session_t session); bool hasRouteChanged(audio_session_t session); // also clears the changed flag void log(const char* caption); // Specify an Output(Sink) route by passing SessionRoute::SOURCE_TYPE_NA in the // source argument. // Specify an Input(Source) rout by passing SessionRoute::AUDIO_STREAM_DEFAULT // in the streamType argument. void addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid); private: // Used to mark a SessionRoute as for either inputs (mMapType == kSessionRouteMap_Input) // or outputs (mMapType == kSessionRouteMap_Output) const session_route_map_type_t mMapType; }; }; // namespace android services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp 0 → 100644 +124 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "APM::SessionRoute" //#define LOG_NDEBUG 0 #include "SessionRoute.h" #include "HwModule.h" #include "AudioGain.h" #include "DeviceDescriptor.h" #include <utils/Log.h> namespace android { // --- SessionRoute class implementation void SessionRoute::log(const char* prefix) { ALOGI("%s[SessionRoute strm:0x%X, src:%d, sess:0x%X, dev:0x%X refs:%d act:%d", prefix, mStreamType, mSource, mSession, mDeviceDescriptor != 0 ? mDeviceDescriptor->type() : AUDIO_DEVICE_NONE, mRefCount, mActivityCount); } // --- SessionRouteMap class implementation bool SessionRouteMap::hasRoute(audio_session_t session) { return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0; } bool SessionRouteMap::hasRouteChanged(audio_session_t session) { if (indexOfKey(session) >= 0) { if (valueFor(session)->mChanged) { valueFor(session)->mChanged = false; return true; } } return false; } void SessionRouteMap::removeRoute(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { ALOG_ASSERT(route->mRefCount > 0); --route->mRefCount; if (route->mRefCount <= 0) { removeItem(session); } } } int SessionRouteMap::incRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; return route != 0 ? ++(route->mActivityCount) : -1; } int SessionRouteMap::decRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0 && route->mActivityCount > 0) { return --(route->mActivityCount); } else { return -1; } } void SessionRouteMap::log(const char* caption) { ALOGI("%s ----", caption); for(size_t index = 0; index < size(); index++) { valueAt(index)->log(" "); } } void SessionRouteMap::addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> descriptor, uid_t uid) { if (mMapType == MAPTYPE_INPUT && streamType != SessionRoute::STREAM_TYPE_NA) { ALOGE("Adding Output Route to InputRouteMap"); return; } else if (mMapType == MAPTYPE_OUTPUT && source != SessionRoute::SOURCE_TYPE_NA) { ALOGE("Adding Input Route to OutputRouteMap"); return; } sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) || ((route->mDeviceDescriptor != 0) && ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) { route->mChanged = true; } route->mRefCount++; route->mDeviceDescriptor = descriptor; } else { route = new SessionRoute(session, streamType, source, descriptor, uid); route->mRefCount++; add(session, route); if (descriptor != 0) { route->mChanged = true; } } } } // namespace android services/audiopolicy/managerdefault/AudioPolicyManager.cpp +0 −92 Original line number Diff line number Diff line Loading @@ -4721,99 +4721,7 @@ void AudioPolicyManager::handleIncallSonification(audio_stream_type_t stream, } } // --- SessionRoute class implementation void AudioPolicyManager::SessionRoute::log(const char* prefix) { ALOGI("%s[SessionRoute strm:0x%X, src:%d, sess:0x%X, dev:0x%X refs:%d act:%d", prefix, mStreamType, mSource, mSession, mDeviceDescriptor != 0 ? mDeviceDescriptor->type() : AUDIO_DEVICE_NONE, mRefCount, mActivityCount); } // --- SessionRouteMap class implementation bool AudioPolicyManager::SessionRouteMap::hasRoute(audio_session_t session) { return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0; } bool AudioPolicyManager::SessionRouteMap::hasRouteChanged(audio_session_t session) { if (indexOfKey(session) >= 0) { if (valueFor(session)->mChanged) { valueFor(session)->mChanged = false; return true; } } return false; } void AudioPolicyManager::SessionRouteMap::removeRoute(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { ALOG_ASSERT(route->mRefCount > 0); --route->mRefCount; if (route->mRefCount <= 0) { removeItem(session); } } } int AudioPolicyManager::SessionRouteMap::incRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; return route != 0 ? ++(route->mActivityCount) : -1; } int AudioPolicyManager::SessionRouteMap::decRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0 && route->mActivityCount > 0) { return --(route->mActivityCount); } else { return -1; } } void AudioPolicyManager::SessionRouteMap::log(const char* caption) { ALOGI("%s ----", caption); for(size_t index = 0; index < size(); index++) { valueAt(index)->log(" "); } } void AudioPolicyManager::SessionRouteMap::addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> descriptor, uid_t uid) { if (mMapType == MAPTYPE_INPUT && streamType != SessionRoute::STREAM_TYPE_NA) { ALOGE("Adding Output Route to InputRouteMap"); return; } else if (mMapType == MAPTYPE_OUTPUT && source != SessionRoute::SOURCE_TYPE_NA) { ALOGE("Adding Input Route to OutputRouteMap"); return; } sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) || ((route->mDeviceDescriptor != 0) && ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) { route->mChanged = true; } route->mRefCount++; route->mDeviceDescriptor = descriptor; } else { route = new AudioPolicyManager::SessionRoute(session, streamType, source, descriptor, uid); route->mRefCount++; add(session, route); if (descriptor != 0) { route->mChanged = true; } } } void AudioPolicyManager::defaultAudioPolicyConfig(void) { Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +1 −87 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include <EffectDescriptor.h> #include <SoundTriggerSession.h> #include <StreamDescriptor.h> #include <SessionRoute.h> namespace android { Loading Loading @@ -237,93 +238,6 @@ public: routing_strategy getStrategy(audio_stream_type_t stream) const; protected: class SessionRoute : public RefBase { public: // For Input (Source) routes, use STREAM_TYPE_NA ("NA" = "not applicable)for the // streamType argument static const audio_stream_type_t STREAM_TYPE_NA = AUDIO_STREAM_DEFAULT; // For Output (Sink) routes, use SOURCE_TYPE_NA ("NA" = "not applicable") for the // source argument static const audio_source_t SOURCE_TYPE_NA = AUDIO_SOURCE_DEFAULT; SessionRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid) : mUid(uid), mSession(session), mDeviceDescriptor(deviceDescriptor), mRefCount(0), mActivityCount(0), mChanged(false), mStreamType(streamType), mSource(source) {} void log(const char* prefix); bool isActive() { return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0)); } uid_t mUid; audio_session_t mSession; sp<DeviceDescriptor> mDeviceDescriptor; // "reference" counting int mRefCount; // +/- on references int mActivityCount; // +/- on start/stop bool mChanged; // for outputs const audio_stream_type_t mStreamType; // for inputs const audio_source_t mSource; }; class SessionRouteMap: public KeyedVector<audio_session_t, sp<SessionRoute>> { public: // These constants identify the SessionRoutMap as holding EITHER input routes, // or output routes. An error will occur if an attempt is made to add a SessionRoute // object with mStreamType == STREAM_TYPE_NA (i.e. an input SessionRoute) to a // SessionRoutMap that is marked for output (i.e. mMapType == SESSION_ROUTE_MAP_OUTPUT) // and similarly for output SessionRoutes and Input SessionRouteMaps. typedef enum { MAPTYPE_INPUT = 0, MAPTYPE_OUTPUT = 1 } session_route_map_type_t; SessionRouteMap(session_route_map_type_t mapType) : mMapType(mapType) { } bool hasRoute(audio_session_t session); void removeRoute(audio_session_t session); int incRouteActivity(audio_session_t session); int decRouteActivity(audio_session_t session); bool hasRouteChanged(audio_session_t session); // also clears the changed flag void log(const char* caption); // Specify an Output(Sink) route by passing SessionRoute::SOURCE_TYPE_NA in the // source argument. // Specify an Input(Source) rout by passing SessionRoute::AUDIO_STREAM_DEFAULT // in the streamType argument. void addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid); private: // Used to mark a SessionRoute as for either inputs (mMapType == kSessionRouteMap_Input) // or outputs (mMapType == kSessionRouteMap_Output) const session_route_map_type_t mMapType; }; // From AudioPolicyManagerObserver virtual const AudioPatchCollection &getAudioPatches() const { Loading Loading
services/audiopolicy/common/managerdefinitions/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ LOCAL_SRC_FILES:= \ src/EffectDescriptor.cpp \ src/ConfigParsingUtils.cpp \ src/SoundTriggerSession.cpp \ src/SessionRoute.cpp \ LOCAL_SHARED_LIBRARIES := \ libcutils \ Loading
services/audiopolicy/common/managerdefinitions/include/SessionRoute.h 0 → 100644 +118 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <system/audio.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> #include <utils/Errors.h> namespace android { class DeviceDescriptor; class SessionRoute : public RefBase { public: // For Input (Source) routes, use STREAM_TYPE_NA ("NA" = "not applicable)for the // streamType argument static const audio_stream_type_t STREAM_TYPE_NA = AUDIO_STREAM_DEFAULT; // For Output (Sink) routes, use SOURCE_TYPE_NA ("NA" = "not applicable") for the // source argument static const audio_source_t SOURCE_TYPE_NA = AUDIO_SOURCE_DEFAULT; SessionRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid) : mUid(uid), mSession(session), mDeviceDescriptor(deviceDescriptor), mRefCount(0), mActivityCount(0), mChanged(false), mStreamType(streamType), mSource(source) {} void log(const char* prefix); bool isActive() { return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0)); } uid_t mUid; audio_session_t mSession; sp<DeviceDescriptor> mDeviceDescriptor; // "reference" counting int mRefCount; // +/- on references int mActivityCount; // +/- on start/stop bool mChanged; // for outputs const audio_stream_type_t mStreamType; // for inputs const audio_source_t mSource; }; class SessionRouteMap: public KeyedVector<audio_session_t, sp<SessionRoute> > { public: // These constants identify the SessionRoutMap as holding EITHER input routes, // or output routes. An error will occur if an attempt is made to add a SessionRoute // object with mStreamType == STREAM_TYPE_NA (i.e. an input SessionRoute) to a // SessionRoutMap that is marked for output (i.e. mMapType == SESSION_ROUTE_MAP_OUTPUT) // and similarly for output SessionRoutes and Input SessionRouteMaps. typedef enum { MAPTYPE_INPUT = 0, MAPTYPE_OUTPUT = 1 } session_route_map_type_t; SessionRouteMap(session_route_map_type_t mapType) : mMapType(mapType) {} bool hasRoute(audio_session_t session); void removeRoute(audio_session_t session); int incRouteActivity(audio_session_t session); int decRouteActivity(audio_session_t session); bool hasRouteChanged(audio_session_t session); // also clears the changed flag void log(const char* caption); // Specify an Output(Sink) route by passing SessionRoute::SOURCE_TYPE_NA in the // source argument. // Specify an Input(Source) rout by passing SessionRoute::AUDIO_STREAM_DEFAULT // in the streamType argument. void addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid); private: // Used to mark a SessionRoute as for either inputs (mMapType == kSessionRouteMap_Input) // or outputs (mMapType == kSessionRouteMap_Output) const session_route_map_type_t mMapType; }; }; // namespace android
services/audiopolicy/common/managerdefinitions/src/SessionRoute.cpp 0 → 100644 +124 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "APM::SessionRoute" //#define LOG_NDEBUG 0 #include "SessionRoute.h" #include "HwModule.h" #include "AudioGain.h" #include "DeviceDescriptor.h" #include <utils/Log.h> namespace android { // --- SessionRoute class implementation void SessionRoute::log(const char* prefix) { ALOGI("%s[SessionRoute strm:0x%X, src:%d, sess:0x%X, dev:0x%X refs:%d act:%d", prefix, mStreamType, mSource, mSession, mDeviceDescriptor != 0 ? mDeviceDescriptor->type() : AUDIO_DEVICE_NONE, mRefCount, mActivityCount); } // --- SessionRouteMap class implementation bool SessionRouteMap::hasRoute(audio_session_t session) { return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0; } bool SessionRouteMap::hasRouteChanged(audio_session_t session) { if (indexOfKey(session) >= 0) { if (valueFor(session)->mChanged) { valueFor(session)->mChanged = false; return true; } } return false; } void SessionRouteMap::removeRoute(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { ALOG_ASSERT(route->mRefCount > 0); --route->mRefCount; if (route->mRefCount <= 0) { removeItem(session); } } } int SessionRouteMap::incRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; return route != 0 ? ++(route->mActivityCount) : -1; } int SessionRouteMap::decRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0 && route->mActivityCount > 0) { return --(route->mActivityCount); } else { return -1; } } void SessionRouteMap::log(const char* caption) { ALOGI("%s ----", caption); for(size_t index = 0; index < size(); index++) { valueAt(index)->log(" "); } } void SessionRouteMap::addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> descriptor, uid_t uid) { if (mMapType == MAPTYPE_INPUT && streamType != SessionRoute::STREAM_TYPE_NA) { ALOGE("Adding Output Route to InputRouteMap"); return; } else if (mMapType == MAPTYPE_OUTPUT && source != SessionRoute::SOURCE_TYPE_NA) { ALOGE("Adding Input Route to OutputRouteMap"); return; } sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) || ((route->mDeviceDescriptor != 0) && ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) { route->mChanged = true; } route->mRefCount++; route->mDeviceDescriptor = descriptor; } else { route = new SessionRoute(session, streamType, source, descriptor, uid); route->mRefCount++; add(session, route); if (descriptor != 0) { route->mChanged = true; } } } } // namespace android
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +0 −92 Original line number Diff line number Diff line Loading @@ -4721,99 +4721,7 @@ void AudioPolicyManager::handleIncallSonification(audio_stream_type_t stream, } } // --- SessionRoute class implementation void AudioPolicyManager::SessionRoute::log(const char* prefix) { ALOGI("%s[SessionRoute strm:0x%X, src:%d, sess:0x%X, dev:0x%X refs:%d act:%d", prefix, mStreamType, mSource, mSession, mDeviceDescriptor != 0 ? mDeviceDescriptor->type() : AUDIO_DEVICE_NONE, mRefCount, mActivityCount); } // --- SessionRouteMap class implementation bool AudioPolicyManager::SessionRouteMap::hasRoute(audio_session_t session) { return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0; } bool AudioPolicyManager::SessionRouteMap::hasRouteChanged(audio_session_t session) { if (indexOfKey(session) >= 0) { if (valueFor(session)->mChanged) { valueFor(session)->mChanged = false; return true; } } return false; } void AudioPolicyManager::SessionRouteMap::removeRoute(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { ALOG_ASSERT(route->mRefCount > 0); --route->mRefCount; if (route->mRefCount <= 0) { removeItem(session); } } } int AudioPolicyManager::SessionRouteMap::incRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; return route != 0 ? ++(route->mActivityCount) : -1; } int AudioPolicyManager::SessionRouteMap::decRouteActivity(audio_session_t session) { sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0 && route->mActivityCount > 0) { return --(route->mActivityCount); } else { return -1; } } void AudioPolicyManager::SessionRouteMap::log(const char* caption) { ALOGI("%s ----", caption); for(size_t index = 0; index < size(); index++) { valueAt(index)->log(" "); } } void AudioPolicyManager::SessionRouteMap::addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> descriptor, uid_t uid) { if (mMapType == MAPTYPE_INPUT && streamType != SessionRoute::STREAM_TYPE_NA) { ALOGE("Adding Output Route to InputRouteMap"); return; } else if (mMapType == MAPTYPE_OUTPUT && source != SessionRoute::SOURCE_TYPE_NA) { ALOGE("Adding Input Route to OutputRouteMap"); return; } sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0; if (route != 0) { if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) || ((route->mDeviceDescriptor != 0) && ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) { route->mChanged = true; } route->mRefCount++; route->mDeviceDescriptor = descriptor; } else { route = new AudioPolicyManager::SessionRoute(session, streamType, source, descriptor, uid); route->mRefCount++; add(session, route); if (descriptor != 0) { route->mChanged = true; } } } void AudioPolicyManager::defaultAudioPolicyConfig(void) { Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +1 −87 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include <EffectDescriptor.h> #include <SoundTriggerSession.h> #include <StreamDescriptor.h> #include <SessionRoute.h> namespace android { Loading Loading @@ -237,93 +238,6 @@ public: routing_strategy getStrategy(audio_stream_type_t stream) const; protected: class SessionRoute : public RefBase { public: // For Input (Source) routes, use STREAM_TYPE_NA ("NA" = "not applicable)for the // streamType argument static const audio_stream_type_t STREAM_TYPE_NA = AUDIO_STREAM_DEFAULT; // For Output (Sink) routes, use SOURCE_TYPE_NA ("NA" = "not applicable") for the // source argument static const audio_source_t SOURCE_TYPE_NA = AUDIO_SOURCE_DEFAULT; SessionRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid) : mUid(uid), mSession(session), mDeviceDescriptor(deviceDescriptor), mRefCount(0), mActivityCount(0), mChanged(false), mStreamType(streamType), mSource(source) {} void log(const char* prefix); bool isActive() { return (mDeviceDescriptor != 0) && (mChanged || (mActivityCount > 0)); } uid_t mUid; audio_session_t mSession; sp<DeviceDescriptor> mDeviceDescriptor; // "reference" counting int mRefCount; // +/- on references int mActivityCount; // +/- on start/stop bool mChanged; // for outputs const audio_stream_type_t mStreamType; // for inputs const audio_source_t mSource; }; class SessionRouteMap: public KeyedVector<audio_session_t, sp<SessionRoute>> { public: // These constants identify the SessionRoutMap as holding EITHER input routes, // or output routes. An error will occur if an attempt is made to add a SessionRoute // object with mStreamType == STREAM_TYPE_NA (i.e. an input SessionRoute) to a // SessionRoutMap that is marked for output (i.e. mMapType == SESSION_ROUTE_MAP_OUTPUT) // and similarly for output SessionRoutes and Input SessionRouteMaps. typedef enum { MAPTYPE_INPUT = 0, MAPTYPE_OUTPUT = 1 } session_route_map_type_t; SessionRouteMap(session_route_map_type_t mapType) : mMapType(mapType) { } bool hasRoute(audio_session_t session); void removeRoute(audio_session_t session); int incRouteActivity(audio_session_t session); int decRouteActivity(audio_session_t session); bool hasRouteChanged(audio_session_t session); // also clears the changed flag void log(const char* caption); // Specify an Output(Sink) route by passing SessionRoute::SOURCE_TYPE_NA in the // source argument. // Specify an Input(Source) rout by passing SessionRoute::AUDIO_STREAM_DEFAULT // in the streamType argument. void addRoute(audio_session_t session, audio_stream_type_t streamType, audio_source_t source, sp<DeviceDescriptor> deviceDescriptor, uid_t uid); private: // Used to mark a SessionRoute as for either inputs (mMapType == kSessionRouteMap_Input) // or outputs (mMapType == kSessionRouteMap_Output) const session_route_map_type_t mMapType; }; // From AudioPolicyManagerObserver virtual const AudioPatchCollection &getAudioPatches() const { Loading