1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef AAUDIO_AAUDIO_STREAM_TRACKER_H 18*ec779b8eSAndroid Build Coastguard Worker #define AAUDIO_AAUDIO_STREAM_TRACKER_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 21*ec779b8eSAndroid Build Coastguard Worker #include <time.h> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <aaudio/AAudio.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker #include "binding/AAudioCommon.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "AAudioServiceStreamBase.h" 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker namespace aaudio { 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker class AAudioStreamTracker { 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker public: 34*ec779b8eSAndroid Build Coastguard Worker /** 35*ec779b8eSAndroid Build Coastguard Worker * Remove any streams with the matching handle. 36*ec779b8eSAndroid Build Coastguard Worker * 37*ec779b8eSAndroid Build Coastguard Worker * @param streamHandle 38*ec779b8eSAndroid Build Coastguard Worker * @return number of streams removed 39*ec779b8eSAndroid Build Coastguard Worker */ 40*ec779b8eSAndroid Build Coastguard Worker int32_t removeStreamByHandle(aaudio_handle_t streamHandle) EXCLUDES(mHandleLock); 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker /** 43*ec779b8eSAndroid Build Coastguard Worker * Look up a stream based on the handle. 44*ec779b8eSAndroid Build Coastguard Worker * 45*ec779b8eSAndroid Build Coastguard Worker * @param streamHandle 46*ec779b8eSAndroid Build Coastguard Worker * @return strong pointer to the stream if found, or nullptr 47*ec779b8eSAndroid Build Coastguard Worker */ 48*ec779b8eSAndroid Build Coastguard Worker android::sp<aaudio::AAudioServiceStreamBase> getStreamByHandle( 49*ec779b8eSAndroid Build Coastguard Worker aaudio_handle_t streamHandle) EXCLUDES(mHandleLock); 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker /** 52*ec779b8eSAndroid Build Coastguard Worker * Look up a stream based on the AudioPolicy portHandle. 53*ec779b8eSAndroid Build Coastguard Worker * Increment its service reference count if found. 54*ec779b8eSAndroid Build Coastguard Worker * 55*ec779b8eSAndroid Build Coastguard Worker * @param portHandle 56*ec779b8eSAndroid Build Coastguard Worker * @return strong pointer to the stream if found, or nullptr 57*ec779b8eSAndroid Build Coastguard Worker */ 58*ec779b8eSAndroid Build Coastguard Worker android::sp<aaudio::AAudioServiceStreamBase> findStreamByPortHandle( 59*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t portHandle) EXCLUDES(mHandleLock); 60*ec779b8eSAndroid Build Coastguard Worker 61*ec779b8eSAndroid Build Coastguard Worker /** 62*ec779b8eSAndroid Build Coastguard Worker * Store a strong pointer to the stream and return a unique handle for future reference. 63*ec779b8eSAndroid Build Coastguard Worker * The handle is guaranteed not to collide with an existing stream. 64*ec779b8eSAndroid Build Coastguard Worker * @param serviceStream 65*ec779b8eSAndroid Build Coastguard Worker * @return handle for identifying the stream 66*ec779b8eSAndroid Build Coastguard Worker */ 67*ec779b8eSAndroid Build Coastguard Worker aaudio_handle_t addStreamForHandle(const android::sp<AAudioServiceStreamBase>& serviceStream) 68*ec779b8eSAndroid Build Coastguard Worker EXCLUDES(mHandleLock); 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker /** 71*ec779b8eSAndroid Build Coastguard Worker * @return string that can be added to dumpsys 72*ec779b8eSAndroid Build Coastguard Worker */ 73*ec779b8eSAndroid Build Coastguard Worker std::string dump() const; 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker private: 76*ec779b8eSAndroid Build Coastguard Worker static aaudio_handle_t bumpHandle(aaudio_handle_t handle); 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker // Track stream using a unique handle that wraps. Only use positive half. 79*ec779b8eSAndroid Build Coastguard Worker mutable std::mutex mHandleLock; 80*ec779b8eSAndroid Build Coastguard Worker aaudio_handle_t mPreviousHandle GUARDED_BY(mHandleLock) = 0; 81*ec779b8eSAndroid Build Coastguard Worker std::map<aaudio_handle_t, android::sp<aaudio::AAudioServiceStreamBase>> 82*ec779b8eSAndroid Build Coastguard Worker mStreamsByHandle GUARDED_BY(mHandleLock); 83*ec779b8eSAndroid Build Coastguard Worker }; 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker } /* namespace aaudio */ 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker #endif /* AAUDIO_AAUDIO_STREAM_TRACKER_H */ 89