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 <sys/types.h> 23 #include <utils/Singleton.h> 24 25 #include "binding/AAudioServiceMessage.h" 26 #include "AAudioServiceEndpoint.h" 27 #include "AAudioServiceEndpointCapture.h" 28 #include "AAudioServiceEndpointMMAP.h" 29 #include "AAudioServiceEndpointPlay.h" 30 31 namespace aaudio { 32 33 class AAudioEndpointManager : public android::Singleton<AAudioEndpointManager> { 34 public: 35 AAudioEndpointManager(); 36 ~AAudioEndpointManager() = default; 37 38 /** 39 * Returns information about the state of the this class. 40 * 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 * 46 * @return a string with useful information 47 */ 48 std::string dump() const; 49 50 /** 51 * Find a service endpoint for the given deviceId, sessionId and direction. 52 * If an endpoint does not already exist then try to create one. 53 * 54 * @param audioService 55 * @param request 56 * @param sharingMode 57 * @return endpoint or null 58 */ 59 android::sp<AAudioServiceEndpoint> openEndpoint(android::AAudioService &audioService, 60 const aaudio::AAudioStreamRequest &request); 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 sp<AAudioServiceEndpoint> &endpointToSteal); 68 69 android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService, 70 const aaudio::AAudioStreamRequest &request); 71 72 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; 90 91 // 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 96 int32_t mExclusiveStolenCount = 0; // number of times we STOLE an exclusive endpoint 97 98 // 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; 103 104 // For easily disabling the stealing of exclusive streams. 105 static constexpr bool kStealingEnabled = true; 106 }; 107 } /* namespace aaudio */ 108 109 #endif //AAUDIO_AAUDIO_ENDPOINT_MANAGER_H 110