xref: /aosp_15_r20/frameworks/av/services/oboeservice/AAudioClientTracker.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2017 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 ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <map>
21*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
22*ec779b8eSAndroid Build Coastguard Worker #include <set>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <utils/Singleton.h>
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker #include <aaudio/AAudio.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <aaudio/IAAudioClient.h>
29*ec779b8eSAndroid Build Coastguard Worker #include "AAudioService.h"
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace aaudio {
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker class AAudioClientTracker : public android::Singleton<AAudioClientTracker>{
34*ec779b8eSAndroid Build Coastguard Worker public:
35*ec779b8eSAndroid Build Coastguard Worker     AAudioClientTracker();
36*ec779b8eSAndroid Build Coastguard Worker     ~AAudioClientTracker() = default;
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker     /**
39*ec779b8eSAndroid Build Coastguard Worker      * Returns information about the state of the this class.
40*ec779b8eSAndroid Build Coastguard Worker      *
41*ec779b8eSAndroid Build Coastguard Worker      * Will attempt to get the object lock, but will proceed
42*ec779b8eSAndroid Build Coastguard Worker      * even if it cannot.
43*ec779b8eSAndroid Build Coastguard Worker      *
44*ec779b8eSAndroid Build Coastguard Worker      * Each line of information ends with a newline.
45*ec779b8eSAndroid Build Coastguard Worker      *
46*ec779b8eSAndroid Build Coastguard Worker      * @return a string with useful information
47*ec779b8eSAndroid Build Coastguard Worker      */
48*ec779b8eSAndroid Build Coastguard Worker     std::string dump() const;
49*ec779b8eSAndroid Build Coastguard Worker 
50*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t registerClient(pid_t pid, const android::sp<IAAudioClient>& client);
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker     void unregisterClient(pid_t pid);
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker     int32_t getStreamCount(pid_t pid);
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t registerClientStream(pid_t pid,
57*ec779b8eSAndroid Build Coastguard Worker                                          const android::sp<AAudioServiceStreamBase>& serviceStream);
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t unregisterClientStream(
60*ec779b8eSAndroid Build Coastguard Worker             pid_t pid, const android::sp<AAudioServiceStreamBase>& serviceStream);
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker     /**
63*ec779b8eSAndroid Build Coastguard Worker      * Specify whether a process is allowed to create an EXCLUSIVE MMAP stream.
64*ec779b8eSAndroid Build Coastguard Worker      * @param pid
65*ec779b8eSAndroid Build Coastguard Worker      * @param enabled
66*ec779b8eSAndroid Build Coastguard Worker      */
67*ec779b8eSAndroid Build Coastguard Worker     void setExclusiveEnabled(pid_t pid, bool enabled);
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker     bool isExclusiveEnabled(pid_t pid);
70*ec779b8eSAndroid Build Coastguard Worker 
getAAudioService()71*ec779b8eSAndroid Build Coastguard Worker     android::AAudioService *getAAudioService() const {
72*ec779b8eSAndroid Build Coastguard Worker         return mAAudioService;
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker 
setAAudioService(android::AAudioService * aaudioService)75*ec779b8eSAndroid Build Coastguard Worker     void setAAudioService(android::AAudioService *aaudioService) {
76*ec779b8eSAndroid Build Coastguard Worker         mAAudioService = aaudioService;
77*ec779b8eSAndroid Build Coastguard Worker     }
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker private:
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker     /**
82*ec779b8eSAndroid Build Coastguard Worker      * One per process.
83*ec779b8eSAndroid Build Coastguard Worker      */
84*ec779b8eSAndroid Build Coastguard Worker     class NotificationClient : public IBinder::DeathRecipient {
85*ec779b8eSAndroid Build Coastguard Worker     public:
86*ec779b8eSAndroid Build Coastguard Worker         NotificationClient(pid_t pid, const android::sp<IBinder>& binder);
87*ec779b8eSAndroid Build Coastguard Worker         ~NotificationClient() override = default;
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker         int32_t getStreamCount();
90*ec779b8eSAndroid Build Coastguard Worker 
91*ec779b8eSAndroid Build Coastguard Worker         std::string dump() const;
92*ec779b8eSAndroid Build Coastguard Worker 
93*ec779b8eSAndroid Build Coastguard Worker         aaudio_result_t registerClientStream(
94*ec779b8eSAndroid Build Coastguard Worker                 const android::sp<AAudioServiceStreamBase>& serviceStream);
95*ec779b8eSAndroid Build Coastguard Worker 
96*ec779b8eSAndroid Build Coastguard Worker         aaudio_result_t unregisterClientStream(
97*ec779b8eSAndroid Build Coastguard Worker                 const android::sp<AAudioServiceStreamBase>& serviceStream);
98*ec779b8eSAndroid Build Coastguard Worker 
setExclusiveEnabled(bool enabled)99*ec779b8eSAndroid Build Coastguard Worker         void setExclusiveEnabled(bool enabled) {
100*ec779b8eSAndroid Build Coastguard Worker             mExclusiveEnabled = enabled;
101*ec779b8eSAndroid Build Coastguard Worker         }
102*ec779b8eSAndroid Build Coastguard Worker 
isExclusiveEnabled()103*ec779b8eSAndroid Build Coastguard Worker         bool isExclusiveEnabled() {
104*ec779b8eSAndroid Build Coastguard Worker             return mExclusiveEnabled;
105*ec779b8eSAndroid Build Coastguard Worker         }
106*ec779b8eSAndroid Build Coastguard Worker 
107*ec779b8eSAndroid Build Coastguard Worker         // IBinder::DeathRecipient
108*ec779b8eSAndroid Build Coastguard Worker         void binderDied(const android::wp<IBinder>& who) override;
109*ec779b8eSAndroid Build Coastguard Worker 
110*ec779b8eSAndroid Build Coastguard Worker     private:
111*ec779b8eSAndroid Build Coastguard Worker         mutable std::mutex                              mLock;
112*ec779b8eSAndroid Build Coastguard Worker         const pid_t                                     mProcessId;
113*ec779b8eSAndroid Build Coastguard Worker         std::set<android::sp<AAudioServiceStreamBase>>  mStreams GUARDED_BY(mLock);
114*ec779b8eSAndroid Build Coastguard Worker         // hold onto binder to receive death notifications
115*ec779b8eSAndroid Build Coastguard Worker         android::sp<IBinder>                            mBinder;
116*ec779b8eSAndroid Build Coastguard Worker         bool                                            mExclusiveEnabled = true;
117*ec779b8eSAndroid Build Coastguard Worker     };
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker     // This must be called under mLock
120*ec779b8eSAndroid Build Coastguard Worker     android::sp<NotificationClient> getNotificationClient_l(pid_t pid)
121*ec779b8eSAndroid Build Coastguard Worker             REQUIRES(mLock);
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     mutable std::mutex                               mLock;
124*ec779b8eSAndroid Build Coastguard Worker     std::map<pid_t, android::sp<NotificationClient>> mNotificationClients
125*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mLock);
126*ec779b8eSAndroid Build Coastguard Worker     android::AAudioService                          *mAAudioService = nullptr;
127*ec779b8eSAndroid Build Coastguard Worker };
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker } /* namespace aaudio */
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker #endif //ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
132