• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "APM::SessionRoute"
18 //#define LOG_NDEBUG 0
19 
20 #include "SessionRoute.h"
21 #include "HwModule.h"
22 #include "AudioGain.h"
23 #include "DeviceDescriptor.h"
24 #include <utils/Log.h>
25 
26 namespace android {
27 
28 // --- SessionRoute class implementation
log(const char * prefix)29 void SessionRoute::log(const char* prefix)
30 {
31     ALOGI("%s[SessionRoute strm:0x%X, src:%d, sess:0x%X, dev:0x%X refs:%d act:%d",
32           prefix, mStreamType, mSource, mSession,
33           mDeviceDescriptor != 0 ? mDeviceDescriptor->type() : AUDIO_DEVICE_NONE,
34           mRefCount, mActivityCount);
35 }
36 
37 // --- SessionRouteMap class implementation
hasRoute(audio_session_t session)38 bool SessionRouteMap::hasRoute(audio_session_t session)
39 {
40     return indexOfKey(session) >= 0 && valueFor(session)->mDeviceDescriptor != 0;
41 }
42 
hasRouteChanged(audio_session_t session)43 bool SessionRouteMap::hasRouteChanged(audio_session_t session)
44 {
45     if (indexOfKey(session) >= 0) {
46         if (valueFor(session)->mChanged) {
47             valueFor(session)->mChanged = false;
48             return true;
49         }
50     }
51     return false;
52 }
53 
removeRoute(audio_session_t session)54 void SessionRouteMap::removeRoute(audio_session_t session)
55 {
56     sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0;
57     if (route != 0) {
58         ALOG_ASSERT(route->mRefCount > 0);
59         --route->mRefCount;
60         if (route->mRefCount <= 0) {
61             removeItem(session);
62         }
63     }
64 }
65 
incRouteActivity(audio_session_t session)66 int SessionRouteMap::incRouteActivity(audio_session_t session)
67 {
68     sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0;
69     return route != 0 ? ++(route->mActivityCount) : -1;
70 }
71 
decRouteActivity(audio_session_t session)72 int SessionRouteMap::decRouteActivity(audio_session_t session)
73 {
74     sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0;
75     if (route != 0 && route->mActivityCount > 0) {
76         return --(route->mActivityCount);
77     } else {
78         return -1;
79     }
80 }
81 
log(const char * caption)82 void SessionRouteMap::log(const char* caption)
83 {
84     ALOGI("%s ----", caption);
85     for(size_t index = 0; index < size(); index++) {
86         valueAt(index)->log("  ");
87     }
88 }
89 
addRoute(audio_session_t session,audio_stream_type_t streamType,audio_source_t source,sp<DeviceDescriptor> descriptor,uid_t uid)90 void SessionRouteMap::addRoute(audio_session_t session,
91                                audio_stream_type_t streamType,
92                                audio_source_t source,
93                                sp<DeviceDescriptor> descriptor,
94                                uid_t uid)
95 {
96     if (mMapType == MAPTYPE_INPUT && streamType != SessionRoute::STREAM_TYPE_NA) {
97         ALOGE("Adding Output Route to InputRouteMap");
98         return;
99     } else if (mMapType == MAPTYPE_OUTPUT && source != SessionRoute::SOURCE_TYPE_NA) {
100         ALOGE("Adding Input Route to OutputRouteMap");
101         return;
102     }
103 
104     sp<SessionRoute> route = indexOfKey(session) >= 0 ? valueFor(session) : 0;
105 
106     if (route != 0) {
107         if (((route->mDeviceDescriptor == 0) && (descriptor != 0)) ||
108                 ((route->mDeviceDescriptor != 0) &&
109                  ((descriptor == 0) || (!route->mDeviceDescriptor->equals(descriptor))))) {
110             route->mChanged = true;
111         }
112         route->mRefCount++;
113         route->mDeviceDescriptor = descriptor;
114     } else {
115         route = new SessionRoute(session, streamType, source, descriptor, uid);
116         route->mRefCount++;
117         add(session, route);
118         if (descriptor != 0) {
119             route->mChanged = true;
120         }
121     }
122 }
123 
124 } // namespace android
125