• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
18 #define ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
19 
20 #include <map>
21 #include <mutex>
22 #include <set>
23 
24 #include <utils/Singleton.h>
25 
26 #include <aaudio/AAudio.h>
27 #include "binding/IAAudioClient.h"
28 #include "AAudioService.h"
29 
30 namespace aaudio {
31 
32 class AAudioClientTracker : public android::Singleton<AAudioClientTracker>{
33 public:
34     AAudioClientTracker();
35     ~AAudioClientTracker() = 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     aaudio_result_t registerClient(pid_t pid, const android::sp<android::IAAudioClient>& client);
50 
51     void unregisterClient(pid_t pid);
52 
53     int32_t getStreamCount(pid_t pid);
54 
55     aaudio_result_t registerClientStream(pid_t pid,
56                                          android::sp<AAudioServiceStreamBase> serviceStream);
57 
58     aaudio_result_t unregisterClientStream(pid_t pid,
59                                            android::sp<AAudioServiceStreamBase> serviceStream);
60 
getAAudioService()61     android::AAudioService *getAAudioService() const {
62         return mAAudioService;
63     }
64 
setAAudioService(android::AAudioService * aaudioService)65     void setAAudioService(android::AAudioService *aaudioService) {
66         mAAudioService = aaudioService;
67     }
68 
69 private:
70 
71     /**
72      * One per process.
73      */
74     class NotificationClient : public IBinder::DeathRecipient {
75     public:
76         NotificationClient(pid_t pid);
77         virtual ~NotificationClient();
78 
79         int32_t getStreamCount();
80 
81         std::string dump() const;
82 
83         aaudio_result_t registerClientStream(android::sp<AAudioServiceStreamBase> serviceStream);
84 
85         aaudio_result_t unregisterClientStream(android::sp<AAudioServiceStreamBase> serviceStream);
86 
87         // IBinder::DeathRecipient
88         virtual     void    binderDied(const android::wp<IBinder>& who);
89 
90     protected:
91         mutable std::mutex                              mLock;
92         const pid_t                                     mProcessId;
93         std::set<android::sp<AAudioServiceStreamBase>>  mStreams;
94     };
95 
96     mutable std::mutex                               mLock;
97     std::map<pid_t, android::sp<NotificationClient>> mNotificationClients;
98     android::AAudioService                          *mAAudioService = nullptr;
99 };
100 
101 } /* namespace aaudio */
102 
103 #endif //ANDROID_AAUDIO_AAUDIO_CLIENT_TRACKER_H
104