2 * Copyright (C) 2017 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef AAUDIO_AAUDIO_ENDPOINT_MANAGER_H
18 #define AAUDIO_AAUDIO_ENDPOINT_MANAGER_H
22 #include <utils/Singleton.h>
24 #include "binding/AAudioServiceMessage.h"
25 #include "AAudioServiceEndpoint.h"
26 #include "AAudioServiceEndpointCapture.h"
27 #include "AAudioServiceEndpointMMAP.h"
28 #include "AAudioServiceEndpointPlay.h"
32 class AAudioEndpointManager : public android::Singleton<AAudioEndpointManager> {
34 AAudioEndpointManager();
35 ~AAudioEndpointManager() = default;
38 * Returns information about the state of the this class.
40 * Will attempt to get the object lock, but will proceed
43 * Each line of information ends with a newline.
45 * @return a string with useful information
47 std::string dump() const;
50 * Find a service endpoint for the given deviceId and direction.
51 * If an endpoint does not already exist then try to create one.
56 * @return endpoint or null
58 android::sp<AAudioServiceEndpoint> openEndpoint(android::AAudioService &audioService,
59 const aaudio::AAudioStreamRequest &request,
60 aaudio_sharing_mode_t sharingMode);
62 void closeEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
65 android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(android::AAudioService &aaudioService,
66 const aaudio::AAudioStreamRequest &request);
68 android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService,
69 const aaudio::AAudioStreamRequest &request);
71 android::sp<AAudioServiceEndpoint> findExclusiveEndpoint_l(
72 const AAudioStreamConfiguration& configuration);
74 android::sp<AAudioServiceEndpointShared> findSharedEndpoint_l(
75 const AAudioStreamConfiguration& configuration);
77 void closeExclusiveEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
78 void closeSharedEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint);
80 // Use separate locks because opening a Shared endpoint requires opening an Exclusive one.
81 // That could cause a recursive lock.
82 // Lock mSharedLock before mExclusiveLock.
83 // it is OK to only lock mExclusiveLock.
84 mutable std::mutex mSharedLock;
85 std::vector<android::sp<AAudioServiceEndpointShared>> mSharedStreams;
87 mutable std::mutex mExclusiveLock;
88 std::vector<android::sp<AAudioServiceEndpointMMAP>> mExclusiveStreams;
92 } /* namespace aaudio */
94 #endif //AAUDIO_AAUDIO_ENDPOINT_MANAGER_H