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, sessionId 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 61 void closeEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 62 63 private: 64 android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(android::AAudioService &aaudioService, 65 const aaudio::AAudioStreamRequest &request); 66 67 android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService, 68 const aaudio::AAudioStreamRequest &request); 69 70 android::sp<AAudioServiceEndpoint> findExclusiveEndpoint_l( 71 const AAudioStreamConfiguration& configuration); 72 73 android::sp<AAudioServiceEndpointShared> findSharedEndpoint_l( 74 const AAudioStreamConfiguration& configuration); 75 76 void closeExclusiveEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 77 void closeSharedEndpoint(android::sp<AAudioServiceEndpoint> serviceEndpoint); 78 79 // Use separate locks because opening a Shared endpoint requires opening an Exclusive one. 80 // That could cause a recursive lock. 81 // Lock mSharedLock before mExclusiveLock. 82 // it is OK to only lock mExclusiveLock. 83 mutable std::mutex mSharedLock; 84 std::vector<android::sp<AAudioServiceEndpointShared>> mSharedStreams; 85 86 mutable std::mutex mExclusiveLock; 87 std::vector<android::sp<AAudioServiceEndpointMMAP>> mExclusiveStreams; 88 89 // Modified under a lock. 90 int32_t mExclusiveSearchCount = 0; // number of times we SEARCHED for an exclusive endpoint 91 int32_t mExclusiveFoundCount = 0; // number of times we FOUND an exclusive endpoint 92 int32_t mExclusiveOpenCount = 0; // number of times we OPENED an exclusive endpoint 93 int32_t mExclusiveCloseCount = 0; // number of times we CLOSED an exclusive endpoint 94 // Same as above but for SHARED endpoints. 95 int32_t mSharedSearchCount = 0; 96 int32_t mSharedFoundCount = 0; 97 int32_t mSharedOpenCount = 0; 98 int32_t mSharedCloseCount = 0; 99 }; 100 } /* namespace aaudio */ 101 102 #endif //AAUDIO_AAUDIO_ENDPOINT_MANAGER_H 103