blob: 7ecfa448ce35926323d458eaab4e0496c0a98980 [file] [log] [blame]
/*
* 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