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
30namespace aaudio {
31
32class AAudioClientTracker : public android::Singleton<AAudioClientTracker>{
33public:
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
61    android::AAudioService *getAAudioService() const {
62        return mAAudioService;
63    }
64
65    void setAAudioService(android::AAudioService *aaudioService) {
66        mAAudioService = aaudioService;
67    }
68
69private:
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