1 /* 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> 22 #include <utils/Singleton.h> 23 24 #include "binding/AAudioServiceMessage.h" 25 #include "AAudioServiceEndpoint.h" 26 #include "AAudioServiceEndpointCapture.h" 27 #include "AAudioServiceEndpointMMAP.h" 28 #include "AAudioServiceEndpointPlay.h" 29 30 namespace aaudio { 31 32 class AAudioEndpointManager : public android::Singleton<AAudioEndpointManager> { 33 public: 34 AAudioEndpointManager(); 35 ~AAudioEndpointManager() = default; 36 37 /** 38 * Returns information about the state of the this class. 39 * 40 * Will attempt to get the object lock, but will proceed 41 * even if it cannot. 42 * 43 * Each line of information ends with a newline. 44 * 45 * @return a string with useful information 46 */ 47 std::string dump() const; 48 49 /** 50 * Find a service endpoint for the given deviceId and direction. 51 * If an endpoint does not already exist then try to create one. 52 * 53 * @param audioService 54 * @param request 55 * @param sharingMode 56 * @return endpoint or null 57 */ 58 android::sp<AAudioServiceEndpoint> openEndpoint(android::AAudioService &audioService, 59 const aaudio::AAudioStreamRequest &request, 60 aaudio_sharing_mode_t sharingMode); 61 62 void closeEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 63 64 private: 65 android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(android::AAudioService &aaudioService, 66 const aaudio::AAudioStreamRequest &request); 67 68 android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService, 69 const aaudio::AAudioStreamRequest &request); 70 71 android::sp<AAudioServiceEndpoint> findExclusiveEndpoint_l( 72 const AAudioStreamConfiguration& configuration); 73 74 android::sp<AAudioServiceEndpointShared> findSharedEndpoint_l( 75 const AAudioStreamConfiguration& configuration); 76 77 void closeExclusiveEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 78 void closeSharedEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 79 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; 86 87 mutable std::mutex mExclusiveLock; 88 std::vector<android::sp<AAudioServiceEndpointMMAP>> mExclusiveStreams; 89 90 }; 91 92 } /* namespace aaudio */ 93 94 #endif //AAUDIO_AAUDIO_ENDPOINT_MANAGER_H 95