blob: ae776b105b8495ebcd88ccfd0cae7f84340615df [file] [log] [blame]
Phil Burkc0c70e32017-02-09 13:18:38 -08001/*
2 * Copyright (C) 2017 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#ifndef AAUDIO_AAUDIO_ENDPOINT_MANAGER_H
18#define AAUDIO_AAUDIO_ENDPOINT_MANAGER_H
19
20#include <map>
21#include <mutex>
Phil Burk6e463ce2020-04-13 10:20:20 -070022#include <sys/types.h>
Phil Burkc0c70e32017-02-09 13:18:38 -080023#include <utils/Singleton.h>
24
25#include "binding/AAudioServiceMessage.h"
26#include "AAudioServiceEndpoint.h"
Phil Burk87c9f642017-05-17 07:22:39 -070027#include "AAudioServiceEndpointCapture.h"
Phil Burk15f7cab2017-08-04 09:13:31 -070028#include "AAudioServiceEndpointMMAP.h"
Phil Burk87c9f642017-05-17 07:22:39 -070029#include "AAudioServiceEndpointPlay.h"
Phil Burkc0c70e32017-02-09 13:18:38 -080030
31namespace aaudio {
32
Phil Burk15f7cab2017-08-04 09:13:31 -070033class AAudioEndpointManager : public android::Singleton<AAudioEndpointManager> {
Phil Burkc0c70e32017-02-09 13:18:38 -080034public:
35 AAudioEndpointManager();
36 ~AAudioEndpointManager() = default;
37
38 /**
Phil Burk4501b352017-06-29 18:12:36 -070039 * Returns information about the state of the this class.
Andy Hung47c5e532017-06-26 18:28:00 -070040 *
41 * Will attempt to get the object lock, but will proceed
42 * even if it cannot.
43 *
44 * Each line of information ends with a newline.
45 *
Phil Burk4501b352017-06-29 18:12:36 -070046 * @return a string with useful information
Andy Hung47c5e532017-06-26 18:28:00 -070047 */
48 std::string dump() const;
49
50 /**
Phil Burk4e1af9f2018-01-03 15:54:35 -080051 * Find a service endpoint for the given deviceId, sessionId and direction.
Phil Burkec89b2e2017-06-20 15:05:06 -070052 * If an endpoint does not already exist then try to create one.
Phil Burkc0c70e32017-02-09 13:18:38 -080053 *
Phil Burk15f7cab2017-08-04 09:13:31 -070054 * @param audioService
55 * @param request
56 * @param sharingMode
57 * @return endpoint or null
Phil Burkc0c70e32017-02-09 13:18:38 -080058 */
Phil Burk15f7cab2017-08-04 09:13:31 -070059 android::sp<AAudioServiceEndpoint> openEndpoint(android::AAudioService &audioService,
Phil Burk15f97c92018-09-04 14:06:27 -070060 const aaudio::AAudioStreamRequest &request);
Phil Burkc0c70e32017-02-09 13:18:38 -080061
Phil Burk15f7cab2017-08-04 09:13:31 -070062 void closeEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
Phil Burkc0c70e32017-02-09 13:18:38 -080063
64private:
Phil Burk15f7cab2017-08-04 09:13:31 -070065 android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(android::AAudioService &aaudioService,
Phil Burk6e463ce2020-04-13 10:20:20 -070066 const aaudio::AAudioStreamRequest &request,
67 sp<AAudioServiceEndpoint> &endpointToSteal);
Phil Burkc0c70e32017-02-09 13:18:38 -080068
Phil Burk15f7cab2017-08-04 09:13:31 -070069 android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService,
70 const aaudio::AAudioStreamRequest &request);
Phil Burkc0c70e32017-02-09 13:18:38 -080071
Phil Burk15f7cab2017-08-04 09:13:31 -070072 android::sp<AAudioServiceEndpoint> findExclusiveEndpoint_l(
73 const AAudioStreamConfiguration& configuration);
74
75 android::sp<AAudioServiceEndpointShared> findSharedEndpoint_l(
76 const AAudioStreamConfiguration& configuration);
77
78 void closeExclusiveEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
79 void closeSharedEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
80
81 // Use separate locks because opening a Shared endpoint requires opening an Exclusive one.
82 // That could cause a recursive lock.
83 // Lock mSharedLock before mExclusiveLock.
84 // it is OK to only lock mExclusiveLock.
85 mutable std::mutex mSharedLock;
86 std::vector<android::sp<AAudioServiceEndpointShared>> mSharedStreams;
87
88 mutable std::mutex mExclusiveLock;
89 std::vector<android::sp<AAudioServiceEndpointMMAP>> mExclusiveStreams;
Phil Burkc0c70e32017-02-09 13:18:38 -080090
Phil Burk55e5eab2018-04-10 15:16:38 -070091 // Modified under a lock.
92 int32_t mExclusiveSearchCount = 0; // number of times we SEARCHED for an exclusive endpoint
93 int32_t mExclusiveFoundCount = 0; // number of times we FOUND an exclusive endpoint
94 int32_t mExclusiveOpenCount = 0; // number of times we OPENED an exclusive endpoint
95 int32_t mExclusiveCloseCount = 0; // number of times we CLOSED an exclusive endpoint
Phil Burk6e463ce2020-04-13 10:20:20 -070096 int32_t mExclusiveStolenCount = 0; // number of times we STOLE an exclusive endpoint
97
Phil Burk55e5eab2018-04-10 15:16:38 -070098 // Same as above but for SHARED endpoints.
99 int32_t mSharedSearchCount = 0;
100 int32_t mSharedFoundCount = 0;
101 int32_t mSharedOpenCount = 0;
102 int32_t mSharedCloseCount = 0;
Phil Burk6e463ce2020-04-13 10:20:20 -0700103
104 // For easily disabling the stealing of exclusive streams.
105 static constexpr bool kStealingEnabled = true;
Phil Burkc0c70e32017-02-09 13:18:38 -0800106};
Phil Burkc0c70e32017-02-09 13:18:38 -0800107} /* namespace aaudio */
108
109#endif //AAUDIO_AAUDIO_ENDPOINT_MANAGER_H