diff options
Diffstat (limited to 'services/audiopolicy/common/managerdefinitions/include/SessionRoute.h')
-rw-r--r-- | services/audiopolicy/common/managerdefinitions/include/SessionRoute.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h b/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h new file mode 100644 index 0000000..b4feaf0 --- /dev/null +++ b/services/audiopolicy/common/managerdefinitions/include/SessionRoute.h @@ -0,0 +1,118 @@ +/* + * 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 |