blob: 75bfd9da2a8c8a31c15c139c57364ff1e7961680 [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.
*/
#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;
explicit 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,
const 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