Threads.h revision 331679c8a5cd21a0e6a7a1d851e965e4721f7420
14774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall/*
2518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian**
3518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian** Copyright 2012, The Android Open Source Project
44774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall**
54774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall** Licensed under the Apache License, Version 2.0 (the "License");
64774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall** you may not use this file except in compliance with the License.
7518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian** You may obtain a copy of the License at
84774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall**
9518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
104774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall**
114774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall** Unless required by applicable law or agreed to in writing, software
124774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall** distributed under the License is distributed on an "AS IS" BASIS,
134774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian** See the License for the specific language governing permissions and
15518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian** limitations under the License.
16518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian*/
17518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
18518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#ifndef INCLUDING_FROM_AUDIOFLINGER_H
19518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    #error This header file should only be included from AudioFlinger.h
20518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif
21518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
22518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass ThreadBase : public Thread {
23518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
24518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
25518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include "TrackBase.h"
26518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
27518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    enum type_t {
28b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        MIXER,              // Thread class is MixerThread
29518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        DIRECT,             // Thread class is DirectOutputThread
30518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        DUPLICATING,        // Thread class is DuplicatingThread
314b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        RECORD,             // Thread class is RecordThread
32518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        OFFLOAD,            // Thread class is OffloadThread
331cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian        MMAP                // control thread for MMAP stream
3439c24a20bbc697630d2b92c251b70c04d6f9d00cMathias Agopian        // If you add any values here, also update ThreadBase::threadTypeToString()
35518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
36518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
37518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static const char *threadTypeToString(type_t type);
38518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
39518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
40518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                audio_devices_t outDevice, audio_devices_t inDevice, type_t type,
41fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian                bool systemReady);
42518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    virtual             ~ThreadBase();
43518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
44518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    virtual status_t    readyToRun();
45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
4698c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    void dumpBase(int fd, const Vector<String16>& args);
47518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    void dumpEffectChains(int fd, const Vector<String16>& args);
48518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
49a4b2c041828d1074dca3b999407e7dd85568c5aaMathias Agopian    void clearPowerManager();
50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
51518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    // base for record and playback
52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    enum {
53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        CFG_EVENT_IO,
54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        CFG_EVENT_PRIO,
55518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        CFG_EVENT_SET_PARAMETER,
56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        CFG_EVENT_CREATE_AUDIO_PATCH,
57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        CFG_EVENT_RELEASE_AUDIO_PATCH,
58518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
59518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    class ConfigEventData: public RefBase {
61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    public:
62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        virtual ~ConfigEventData() {}
63518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
64518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        virtual  void dump(char *buffer, size_t size) = 0;
65518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    protected:
665b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ConfigEventData() {}
675b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    };
68518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
69f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian    // Config event sequence by client if status needed (e.g binder thread calling setParameters()):
70518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    //  1. create SetParameterConfigEvent. This sets mWaitStatus in config event
71258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //  2. Lock mLock
72258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //  3. Call sendConfigEvent_l(): Append to mConfigEvents and mWaitWorkCV.signal
73258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //  4. sendConfigEvent_l() reads status from event->mStatus;
74258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //  5. sendConfigEvent_l() returns status
75258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //  6. Unlock
76258385978c517a47626161b1e644c48bcee28de1Jesse Hall    //
77258385978c517a47626161b1e644c48bcee28de1Jesse Hall    // Parameter sequence by server: threadLoop calling processConfigEvents_l():
78a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 1. Lock mLock
79a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 2. If there is an entry in mConfigEvents proceed ...
80a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 3. Read first entry in mConfigEvents
81a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 4. Remove first entry from mConfigEvents
82a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 5. Process
83a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    // 6. Set event->mStatus
84258385978c517a47626161b1e644c48bcee28de1Jesse Hall    // 7. event->mCond.signal
85518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    // 8. Unlock
86518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
87518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    class ConfigEvent: public RefBase {
88fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian    public:
89fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian        virtual ~ConfigEvent() {}
90fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian
91fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian        void dump(char *buffer, size_t size) { mData->dump(buffer, size); }
92fb87e54a9af8bc5063ca4deebe81d90126992480Mathias Agopian
93518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        const int mType; // event type e.g. CFG_EVENT_IO
94518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        Mutex mLock;     // mutex associated with mCond
95518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        Condition mCond; // condition for status return
96518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        status_t mStatus; // status communicated to sender
974b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        bool mWaitStatus; // true if sender is waiting for status
984b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        bool mRequiresSystemReady; // true if must wait for system ready to enter event queue
994b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        sp<ConfigEventData> mData;     // event specific parameter data
1004b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
1014b9511c16195a646242eff833b0af212933b6ecaMathias Agopian    protected:
102c2e41222bf02a6579763974f82d65875cfa43481Jesse Hall        explicit ConfigEvent(int type, bool requiresSystemReady = false) :
103c2e41222bf02a6579763974f82d65875cfa43481Jesse Hall            mType(type), mStatus(NO_ERROR), mWaitStatus(false),
1044725e2ca8050250813afcdcac1330244c6e0f5aeRomain Guy            mRequiresSystemReady(requiresSystemReady), mData(NULL) {}
1054725e2ca8050250813afcdcac1330244c6e0f5aeRomain Guy    };
106518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
107518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    class IoConfigEventData : public ConfigEventData {
108518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    public:
109518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        IoConfigEventData(audio_io_config_event event, pid_t pid) :
110518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            mEvent(event), mPid(pid) {}
111518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
112518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        virtual  void dump(char *buffer, size_t size) {
113518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            snprintf(buffer, size, "IO event: event %d\n", mEvent);
1147773c435bc5da8217433e1b242d3a6712a17b5f7Mathias Agopian        }
115518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
116518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        const audio_io_config_event mEvent;
117518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        const pid_t                 mPid;
118518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
119518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
120518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    class IoConfigEvent : public ConfigEvent {
121518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    public:
122518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        IoConfigEvent(audio_io_config_event event, pid_t pid) :
123518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            ConfigEvent(CFG_EVENT_IO) {
124ada798b7ca7cabc255aa159964b64975e7fdb2dfMathias Agopian            mData = new IoConfigEventData(event, pid);
12528ef8d7911dbfd1bf8256fb43acba894d87fc07aJamie Gennis        }
12628ef8d7911dbfd1bf8256fb43acba894d87fc07aJamie Gennis        virtual ~IoConfigEvent() {}
127518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
128518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
129b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    class PrioConfigEventData : public ConfigEventData {
130a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    public:
131a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        PrioConfigEventData(pid_t pid, pid_t tid, int32_t prio, bool forApp) :
132b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mPid(pid), mTid(tid), mPrio(prio), mForApp(forApp) {}
133f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian
134f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian        virtual  void dump(char *buffer, size_t size) {
135f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian            snprintf(buffer, size, "Prio event: pid %d, tid %d, prio %d, for app? %d\n",
1364b9511c16195a646242eff833b0af212933b6ecaMathias Agopian                    mPid, mTid, mPrio, mForApp);
1374b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        }
1384b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
1394b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        const pid_t mPid;
140a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        const pid_t mTid;
141a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        const int32_t mPrio;
142a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        const bool mForApp;
143a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    };
144a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall
145a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    class PrioConfigEvent : public ConfigEvent {
146a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    public:
147a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        PrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp) :
148a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            ConfigEvent(CFG_EVENT_PRIO, true) {
149a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            mData = new PrioConfigEventData(pid, tid, prio, forApp);
150a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        }
151a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        virtual ~PrioConfigEvent() {}
152a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    };
153a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall
154a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    class SetParameterConfigEventData : public ConfigEventData {
155a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    public:
156a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        explicit SetParameterConfigEventData(String8 keyValuePairs) :
157a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            mKeyValuePairs(keyValuePairs) {}
158201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall
159201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall        virtual  void dump(char *buffer, size_t size) {
160201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall            snprintf(buffer, size, "KeyValue: %s\n", mKeyValuePairs.string());
161201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall        }
162201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall
163201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall        const String8 mKeyValuePairs;
164a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    };
165a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall
166a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    class SetParameterConfigEvent : public ConfigEvent {
167a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall    public:
168a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        explicit SetParameterConfigEvent(String8 keyValuePairs) :
169a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            ConfigEvent(CFG_EVENT_SET_PARAMETER) {
170a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            mData = new SetParameterConfigEventData(keyValuePairs);
171a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            mWaitStatus = true;
172a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall        }
173201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall        virtual ~SetParameterConfigEvent() {}
174201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall    };
175201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall
176201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall    class CreateAudioPatchConfigEventData : public ConfigEventData {
177201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall    public:
178201f3b2da572eb27b9d4b3131e6d8c3c92a13de8Jesse Hall        CreateAudioPatchConfigEventData(const struct audio_patch patch,
179a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall                                        audio_patch_handle_t handle) :
180a0fef1c8bb22443402fb3aeda7ce70f7d5775b0aJesse Hall            mPatch(patch), mHandle(handle) {}
181518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
182518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        virtual  void dump(char *buffer, size_t size) {
183518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            snprintf(buffer, size, "Patch handle: %u\n", mHandle);
184518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
185258385978c517a47626161b1e644c48bcee28de1Jesse Hall
186258385978c517a47626161b1e644c48bcee28de1Jesse Hall        const struct audio_patch mPatch;
187258385978c517a47626161b1e644c48bcee28de1Jesse Hall        audio_patch_handle_t mHandle;
188258385978c517a47626161b1e644c48bcee28de1Jesse Hall    };
189b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
190b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    class CreateAudioPatchConfigEvent : public ConfigEvent {
191b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    public:
192b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        CreateAudioPatchConfigEvent(const struct audio_patch patch,
193b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                                    audio_patch_handle_t handle) :
194b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            ConfigEvent(CFG_EVENT_CREATE_AUDIO_PATCH) {
195b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mData = new CreateAudioPatchConfigEventData(patch, handle);
196b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mWaitStatus = true;
197b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        }
198b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        virtual ~CreateAudioPatchConfigEvent() {}
199b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    };
200b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
201b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    class ReleaseAudioPatchConfigEventData : public ConfigEventData {
202258385978c517a47626161b1e644c48bcee28de1Jesse Hall    public:
203b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        explicit ReleaseAudioPatchConfigEventData(const audio_patch_handle_t handle) :
204b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mHandle(handle) {}
205b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
206b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        virtual  void dump(char *buffer, size_t size) {
207b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            snprintf(buffer, size, "Patch handle: %u\n", mHandle);
208258385978c517a47626161b1e644c48bcee28de1Jesse Hall        }
209b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
210b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        audio_patch_handle_t mHandle;
211b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    };
212b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
213b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    class ReleaseAudioPatchConfigEvent : public ConfigEvent {
214b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    public:
215b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        explicit ReleaseAudioPatchConfigEvent(const audio_patch_handle_t handle) :
216b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            ConfigEvent(CFG_EVENT_RELEASE_AUDIO_PATCH) {
217b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mData = new ReleaseAudioPatchConfigEventData(handle);
218b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall            mWaitStatus = true;
219b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        }
220b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        virtual ~ReleaseAudioPatchConfigEvent() {}
221b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    };
222b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
223b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    class PMDeathRecipient : public IBinder::DeathRecipient {
224b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    public:
225b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        explicit    PMDeathRecipient(const wp<ThreadBase>& thread) : mThread(thread) {}
226b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        virtual     ~PMDeathRecipient() {}
227b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
228b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        // IBinder::DeathRecipient
229b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        virtual     void        binderDied(const wp<IBinder>& who);
230b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
231b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    private:
232b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        DISALLOW_COPY_AND_ASSIGN(PMDeathRecipient);
233b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
234b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall        wp<ThreadBase> mThread;
235b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    };
236b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
237b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    virtual     status_t    initCheck() const = 0;
238b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
239b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                // static externally-visible
240b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                type_t      type() const { return mType; }
241b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                bool isDuplicating() const { return (mType == DUPLICATING); }
242b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
243b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                audio_io_handle_t id() const { return mId;}
244b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall
245518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                // dynamic externally-visible
246518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                uint32_t    sampleRate() const { return mSampleRate; }
247518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                audio_channel_mask_t channelMask() const { return mChannelMask; }
248518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                audio_format_t format() const { return mHALFormat; }
249518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                uint32_t channelCount() const { return mChannelCount; }
250b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                // Called by AudioFlinger::frameCount(audio_io_handle_t output) and effects,
251b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall                // and returns the [normal mix] buffer's frame count.
252b29e5e8c2682ae145e8c56d9afb061f8da7f854cJesse Hall    virtual     size_t      frameCount() const = 0;
253518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
254518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                // Return's the HAL's frame count i.e. fast mixer buffer size.
255518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                size_t      frameCountHAL() const { return mFrameCount; }
256518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
257518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                size_t      frameSize() const { return mFrameSize; }
258518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
259518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    // Should be "virtual status_t requestExitAndWait()" and override same
260518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    // method in Thread, but Thread::requestExitAndWait() is not yet virtual.
261                void        exit();
262    virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
263                                                    status_t& status) = 0;
264    virtual     status_t    setParameters(const String8& keyValuePairs);
265    virtual     String8     getParameters(const String8& keys) = 0;
266    virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0) = 0;
267                // sendConfigEvent_l() must be called with ThreadBase::mLock held
268                // Can temporarily release the lock if waiting for a reply from
269                // processConfigEvents_l().
270                status_t    sendConfigEvent_l(sp<ConfigEvent>& event);
271                void        sendIoConfigEvent(audio_io_config_event event, pid_t pid = 0);
272                void        sendIoConfigEvent_l(audio_io_config_event event, pid_t pid = 0);
273                void        sendPrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp);
274                void        sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio, bool forApp);
275                status_t    sendSetParameterConfigEvent_l(const String8& keyValuePair);
276                status_t    sendCreateAudioPatchConfigEvent(const struct audio_patch *patch,
277                                                            audio_patch_handle_t *handle);
278                status_t    sendReleaseAudioPatchConfigEvent(audio_patch_handle_t handle);
279                void        processConfigEvents_l();
280    virtual     void        cacheParameters_l() = 0;
281    virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
282                                               audio_patch_handle_t *handle) = 0;
283    virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle) = 0;
284    virtual     void        getAudioPortConfig(struct audio_port_config *config) = 0;
285
286
287                // see note at declaration of mStandby, mOutDevice and mInDevice
288                bool        standby() const { return mStandby; }
289                audio_devices_t outDevice() const { return mOutDevice; }
290                audio_devices_t inDevice() const { return mInDevice; }
291                audio_devices_t getDevice() const { return isOutput() ? mOutDevice : mInDevice; }
292
293    virtual     bool        isOutput() const = 0;
294
295    virtual     sp<StreamHalInterface> stream() const = 0;
296
297                sp<EffectHandle> createEffect_l(
298                                    const sp<AudioFlinger::Client>& client,
299                                    const sp<IEffectClient>& effectClient,
300                                    int32_t priority,
301                                    audio_session_t sessionId,
302                                    effect_descriptor_t *desc,
303                                    int *enabled,
304                                    status_t *status /*non-NULL*/,
305                                    bool pinned);
306
307                // return values for hasAudioSession (bit field)
308                enum effect_state {
309                    EFFECT_SESSION = 0x1,   // the audio session corresponds to at least one
310                                            // effect
311                    TRACK_SESSION = 0x2,    // the audio session corresponds to at least one
312                                            // track
313                    FAST_SESSION = 0x4      // the audio session corresponds to at least one
314                                            // fast track
315                };
316
317                // get effect chain corresponding to session Id.
318                sp<EffectChain> getEffectChain(audio_session_t sessionId);
319                // same as getEffectChain() but must be called with ThreadBase mutex locked
320                sp<EffectChain> getEffectChain_l(audio_session_t sessionId) const;
321                // add an effect chain to the chain list (mEffectChains)
322    virtual     status_t addEffectChain_l(const sp<EffectChain>& chain) = 0;
323                // remove an effect chain from the chain list (mEffectChains)
324    virtual     size_t removeEffectChain_l(const sp<EffectChain>& chain) = 0;
325                // lock all effect chains Mutexes. Must be called before releasing the
326                // ThreadBase mutex before processing the mixer and effects. This guarantees the
327                // integrity of the chains during the process.
328                // Also sets the parameter 'effectChains' to current value of mEffectChains.
329                void lockEffectChains_l(Vector< sp<EffectChain> >& effectChains);
330                // unlock effect chains after process
331                void unlockEffectChains(const Vector< sp<EffectChain> >& effectChains);
332                // get a copy of mEffectChains vector
333                Vector< sp<EffectChain> > getEffectChains_l() const { return mEffectChains; };
334                // set audio mode to all effect chains
335                void setMode(audio_mode_t mode);
336                // get effect module with corresponding ID on specified audio session
337                sp<AudioFlinger::EffectModule> getEffect(audio_session_t sessionId, int effectId);
338                sp<AudioFlinger::EffectModule> getEffect_l(audio_session_t sessionId, int effectId);
339                // add and effect module. Also creates the effect chain is none exists for
340                // the effects audio session
341                status_t addEffect_l(const sp< EffectModule>& effect);
342                // remove and effect module. Also removes the effect chain is this was the last
343                // effect
344                void removeEffect_l(const sp< EffectModule>& effect, bool release = false);
345                // disconnect an effect handle from module and destroy module if last handle
346                void disconnectEffectHandle(EffectHandle *handle, bool unpinIfLast);
347                // detach all tracks connected to an auxiliary effect
348    virtual     void detachAuxEffect_l(int effectId __unused) {}
349                // returns a combination of:
350                // - EFFECT_SESSION if effects on this audio session exist in one chain
351                // - TRACK_SESSION if tracks on this audio session exist
352                // - FAST_SESSION if fast tracks on this audio session exist
353    virtual     uint32_t hasAudioSession_l(audio_session_t sessionId) const = 0;
354                uint32_t hasAudioSession(audio_session_t sessionId) const {
355                    Mutex::Autolock _l(mLock);
356                    return hasAudioSession_l(sessionId);
357                }
358
359                // the value returned by default implementation is not important as the
360                // strategy is only meaningful for PlaybackThread which implements this method
361                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId __unused)
362                        { return 0; }
363
364                // check if some effects must be suspended/restored when an effect is enabled
365                // or disabled
366                void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
367                                                 bool enabled,
368                                                 audio_session_t sessionId =
369                                                        AUDIO_SESSION_OUTPUT_MIX);
370                void checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
371                                                   bool enabled,
372                                                   audio_session_t sessionId =
373                                                        AUDIO_SESSION_OUTPUT_MIX);
374
375                virtual status_t    setSyncEvent(const sp<SyncEvent>& event) = 0;
376                virtual bool        isValidSyncEvent(const sp<SyncEvent>& event) const = 0;
377
378                // Return a reference to a per-thread heap which can be used to allocate IMemory
379                // objects that will be read-only to client processes, read/write to mediaserver,
380                // and shared by all client processes of the thread.
381                // The heap is per-thread rather than common across all threads, because
382                // clients can't be trusted not to modify the offset of the IMemory they receive.
383                // If a thread does not have such a heap, this method returns 0.
384                virtual sp<MemoryDealer>    readOnlyHeap() const { return 0; }
385
386                virtual sp<IMemory> pipeMemory() const { return 0; }
387
388                        void systemReady();
389
390                // checkEffectCompatibility_l() must be called with ThreadBase::mLock held
391                virtual status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
392                                                               audio_session_t sessionId) = 0;
393
394                        void        broadcast_l();
395
396    mutable     Mutex                   mLock;
397
398protected:
399
400                // entry describing an effect being suspended in mSuspendedSessions keyed vector
401                class SuspendedSessionDesc : public RefBase {
402                public:
403                    SuspendedSessionDesc() : mRefCount(0) {}
404
405                    int mRefCount;          // number of active suspend requests
406                    effect_uuid_t mType;    // effect type UUID
407                };
408
409                void        acquireWakeLock();
410                virtual void acquireWakeLock_l();
411                void        releaseWakeLock();
412                void        releaseWakeLock_l();
413                void        updateWakeLockUids_l(const SortedVector<uid_t> &uids);
414                void        getPowerManager_l();
415                // suspend or restore effects of the specified type (or all if type is NULL)
416                // on a given session. The number of suspend requests is counted and restore
417                // occurs when all suspend requests are cancelled.
418                void setEffectSuspended_l(const effect_uuid_t *type,
419                                          bool suspend,
420                                          audio_session_t sessionId);
421                // updated mSuspendedSessions when an effect is suspended or restored
422                void        updateSuspendedSessions_l(const effect_uuid_t *type,
423                                                      bool suspend,
424                                                      audio_session_t sessionId);
425                // check if some effects must be suspended when an effect chain is added
426                void checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain);
427
428                // sends the metadata of the active tracks to the HAL
429    virtual     void        updateMetadata_l() = 0;
430
431                String16 getWakeLockTag();
432
433    virtual     void        preExit() { }
434    virtual     void        setMasterMono_l(bool mono __unused) { }
435    virtual     bool        requireMonoBlend() { return false; }
436
437    friend class AudioFlinger;      // for mEffectChains
438
439                const type_t            mType;
440
441                // Used by parameters, config events, addTrack_l, exit
442                Condition               mWaitWorkCV;
443
444                const sp<AudioFlinger>  mAudioFlinger;
445
446                // updated by PlaybackThread::readOutputParameters_l() or
447                // RecordThread::readInputParameters_l()
448                uint32_t                mSampleRate;
449                size_t                  mFrameCount;       // output HAL, direct output, record
450                audio_channel_mask_t    mChannelMask;
451                uint32_t                mChannelCount;
452                size_t                  mFrameSize;
453                // not HAL frame size, this is for output sink (to pipe to fast mixer)
454                audio_format_t          mFormat;           // Source format for Recording and
455                                                           // Sink format for Playback.
456                                                           // Sink format may be different than
457                                                           // HAL format if Fastmixer is used.
458                audio_format_t          mHALFormat;
459                size_t                  mBufferSize;       // HAL buffer size for read() or write()
460
461                Vector< sp<ConfigEvent> >     mConfigEvents;
462                Vector< sp<ConfigEvent> >     mPendingConfigEvents; // events awaiting system ready
463
464                // These fields are written and read by thread itself without lock or barrier,
465                // and read by other threads without lock or barrier via standby(), outDevice()
466                // and inDevice().
467                // Because of the absence of a lock or barrier, any other thread that reads
468                // these fields must use the information in isolation, or be prepared to deal
469                // with possibility that it might be inconsistent with other information.
470                bool                    mStandby;     // Whether thread is currently in standby.
471                audio_devices_t         mOutDevice;   // output device
472                audio_devices_t         mInDevice;    // input device
473                audio_devices_t         mPrevOutDevice;   // previous output device
474                audio_devices_t         mPrevInDevice;    // previous input device
475                struct audio_patch      mPatch;
476                audio_source_t          mAudioSource;
477
478                const audio_io_handle_t mId;
479                Vector< sp<EffectChain> > mEffectChains;
480
481                static const int        kThreadNameLength = 16; // prctl(PR_SET_NAME) limit
482                char                    mThreadName[kThreadNameLength]; // guaranteed NUL-terminated
483                sp<IPowerManager>       mPowerManager;
484                sp<IBinder>             mWakeLockToken;
485                const sp<PMDeathRecipient> mDeathRecipient;
486                // list of suspended effects per session and per type. The first (outer) vector is
487                // keyed by session ID, the second (inner) by type UUID timeLow field
488                // Updated by updateSuspendedSessions_l() only.
489                KeyedVector< audio_session_t, KeyedVector< int, sp<SuspendedSessionDesc> > >
490                                        mSuspendedSessions;
491                // TODO: add comment and adjust size as needed
492                static const size_t     kLogSize = 4 * 1024;
493                sp<NBLog::Writer>       mNBLogWriter;
494                bool                    mSystemReady;
495                ExtendedTimestamp       mTimestamp;
496                // A condition that must be evaluated by the thread loop has changed and
497                // we must not wait for async write callback in the thread loop before evaluating it
498                bool                    mSignalPending;
499
500                // ActiveTracks is a sorted vector of track type T representing the
501                // active tracks of threadLoop() to be considered by the locked prepare portion.
502                // ActiveTracks should be accessed with the ThreadBase lock held.
503                //
504                // During processing and I/O, the threadLoop does not hold the lock;
505                // hence it does not directly use ActiveTracks.  Care should be taken
506                // to hold local strong references or defer removal of tracks
507                // if the threadLoop may still be accessing those tracks due to mix, etc.
508                //
509                // This class updates power information appropriately.
510                //
511
512                template <typename T>
513                class ActiveTracks {
514                public:
515                    explicit ActiveTracks(SimpleLog *localLog = nullptr)
516                        : mActiveTracksGeneration(0)
517                        , mLastActiveTracksGeneration(0)
518                        , mLocalLog(localLog)
519                    { }
520
521                    ~ActiveTracks() {
522                        ALOGW_IF(!mActiveTracks.isEmpty(),
523                                "ActiveTracks should be empty in destructor");
524                    }
525                    // returns the last track added (even though it may have been
526                    // subsequently removed from ActiveTracks).
527                    //
528                    // Used for DirectOutputThread to ensure a flush is called when transitioning
529                    // to a new track (even though it may be on the same session).
530                    // Used for OffloadThread to ensure that volume and mixer state is
531                    // taken from the latest track added.
532                    //
533                    // The latest track is saved with a weak pointer to prevent keeping an
534                    // otherwise useless track alive. Thus the function will return nullptr
535                    // if the latest track has subsequently been removed and destroyed.
536                    sp<T> getLatest() {
537                        return mLatestActiveTrack.promote();
538                    }
539
540                    // SortedVector methods
541                    ssize_t         add(const sp<T> &track);
542                    ssize_t         remove(const sp<T> &track);
543                    size_t          size() const {
544                        return mActiveTracks.size();
545                    }
546                    ssize_t         indexOf(const sp<T>& item) {
547                        return mActiveTracks.indexOf(item);
548                    }
549                    sp<T>           operator[](size_t index) const {
550                        return mActiveTracks[index];
551                    }
552                    typename SortedVector<sp<T>>::iterator begin() {
553                        return mActiveTracks.begin();
554                    }
555                    typename SortedVector<sp<T>>::iterator end() {
556                        return mActiveTracks.end();
557                    }
558
559                    // Due to Binder recursion optimization, clear() and updatePowerState()
560                    // cannot be called from a Binder thread because they may call back into
561                    // the original calling process (system server) for BatteryNotifier
562                    // (which requires a Java environment that may not be present).
563                    // Hence, call clear() and updatePowerState() only from the
564                    // ThreadBase thread.
565                    void            clear();
566                    // periodically called in the threadLoop() to update power state uids.
567                    void            updatePowerState(sp<ThreadBase> thread, bool force = false);
568
569                    /** @return true if one or move active tracks was added or removed since the
570                     *          last time this function was called or the vector was created. */
571                    bool            readAndClearHasChanged();
572
573                private:
574                    void            logTrack(const char *funcName, const sp<T> &track) const;
575
576                    SortedVector<uid_t> getWakeLockUids() {
577                        SortedVector<uid_t> wakeLockUids;
578                        for (const sp<T> &track : mActiveTracks) {
579                            wakeLockUids.add(track->uid());
580                        }
581                        return wakeLockUids; // moved by underlying SharedBuffer
582                    }
583
584                    std::map<uid_t, std::pair<ssize_t /* previous */, ssize_t /* current */>>
585                                        mBatteryCounter;
586                    SortedVector<sp<T>> mActiveTracks;
587                    int                 mActiveTracksGeneration;
588                    int                 mLastActiveTracksGeneration;
589                    wp<T>               mLatestActiveTrack; // latest track added to ActiveTracks
590                    SimpleLog * const   mLocalLog;
591                    // If the vector has changed since last call to readAndClearHasChanged
592                    bool                mHasChanged = false;
593                };
594
595                SimpleLog mLocalLog;
596};
597
598class VolumeInterface {
599 public:
600
601    virtual ~VolumeInterface() {}
602
603    virtual void        setMasterVolume(float value) = 0;
604    virtual void        setMasterMute(bool muted) = 0;
605    virtual void        setStreamVolume(audio_stream_type_t stream, float value) = 0;
606    virtual void        setStreamMute(audio_stream_type_t stream, bool muted) = 0;
607    virtual float       streamVolume(audio_stream_type_t stream) const = 0;
608
609};
610
611// --- PlaybackThread ---
612class PlaybackThread : public ThreadBase, public StreamOutHalInterfaceCallback,
613    public VolumeInterface {
614public:
615
616#include "PlaybackTracks.h"
617
618    enum mixer_state {
619        MIXER_IDLE,             // no active tracks
620        MIXER_TRACKS_ENABLED,   // at least one active track, but no track has any data ready
621        MIXER_TRACKS_READY,      // at least one active track, and at least one track has data
622        MIXER_DRAIN_TRACK,      // drain currently playing track
623        MIXER_DRAIN_ALL,        // fully drain the hardware
624        // standby mode does not have an enum value
625        // suspend by audio policy manager is orthogonal to mixer state
626    };
627
628    // retry count before removing active track in case of underrun on offloaded thread:
629    // we need to make sure that AudioTrack client has enough time to send large buffers
630    //FIXME may be more appropriate if expressed in time units. Need to revise how underrun is
631    // handled for offloaded tracks
632    static const int8_t kMaxTrackRetriesOffload = 20;
633    static const int8_t kMaxTrackStartupRetriesOffload = 100;
634    static const int8_t kMaxTrackStopRetriesOffload = 2;
635    static constexpr uint32_t kMaxTracksPerUid = 40;
636    static constexpr size_t kMaxTracks = 256;
637
638    // Maximum delay (in nanoseconds) for upcoming buffers in suspend mode, otherwise
639    // if delay is greater, the estimated time for timeLoopNextNs is reset.
640    // This allows for catch-up to be done for small delays, while resetting the estimate
641    // for initial conditions or large delays.
642    static const nsecs_t kMaxNextBufferDelayNs = 100000000;
643
644    PlaybackThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
645                   audio_io_handle_t id, audio_devices_t device, type_t type, bool systemReady);
646    virtual             ~PlaybackThread();
647
648                void        dump(int fd, const Vector<String16>& args);
649
650    // Thread virtuals
651    virtual     bool        threadLoop();
652
653    // RefBase
654    virtual     void        onFirstRef();
655
656    virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
657                                                       audio_session_t sessionId);
658
659protected:
660    // Code snippets that were lifted up out of threadLoop()
661    virtual     void        threadLoop_mix() = 0;
662    virtual     void        threadLoop_sleepTime() = 0;
663    virtual     ssize_t     threadLoop_write();
664    virtual     void        threadLoop_drain();
665    virtual     void        threadLoop_standby();
666    virtual     void        threadLoop_exit();
667    virtual     void        threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove);
668
669                // prepareTracks_l reads and writes mActiveTracks, and returns
670                // the pending set of tracks to remove via Vector 'tracksToRemove'.  The caller
671                // is responsible for clearing or destroying this Vector later on, when it
672                // is safe to do so. That will drop the final ref count and destroy the tracks.
673    virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove) = 0;
674                void        removeTracks_l(const Vector< sp<Track> >& tracksToRemove);
675
676    // StreamOutHalInterfaceCallback implementation
677    virtual     void        onWriteReady();
678    virtual     void        onDrainReady();
679    virtual     void        onError();
680
681                void        resetWriteBlocked(uint32_t sequence);
682                void        resetDraining(uint32_t sequence);
683
684    virtual     bool        waitingAsyncCallback();
685    virtual     bool        waitingAsyncCallback_l();
686    virtual     bool        shouldStandby_l();
687    virtual     void        onAddNewTrack_l();
688                void        onAsyncError(); // error reported by AsyncCallbackThread
689
690    // ThreadBase virtuals
691    virtual     void        preExit();
692
693    virtual     bool        keepWakeLock() const { return true; }
694    virtual     void        acquireWakeLock_l() {
695                                ThreadBase::acquireWakeLock_l();
696                                mActiveTracks.updatePowerState(this, true /* force */);
697                            }
698
699public:
700
701    virtual     status_t    initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; }
702
703                // return estimated latency in milliseconds, as reported by HAL
704                uint32_t    latency() const;
705                // same, but lock must already be held
706                uint32_t    latency_l() const;
707
708                // VolumeInterface
709    virtual     void        setMasterVolume(float value);
710    virtual     void        setMasterMute(bool muted);
711    virtual     void        setStreamVolume(audio_stream_type_t stream, float value);
712    virtual     void        setStreamMute(audio_stream_type_t stream, bool muted);
713    virtual     float       streamVolume(audio_stream_type_t stream) const;
714
715                sp<Track>   createTrack_l(
716                                const sp<AudioFlinger::Client>& client,
717                                audio_stream_type_t streamType,
718                                const audio_attributes_t& attr,
719                                uint32_t *sampleRate,
720                                audio_format_t format,
721                                audio_channel_mask_t channelMask,
722                                size_t *pFrameCount,
723                                size_t *pNotificationFrameCount,
724                                uint32_t notificationsPerBuffer,
725                                float speed,
726                                const sp<IMemory>& sharedBuffer,
727                                audio_session_t sessionId,
728                                audio_output_flags_t *flags,
729                                pid_t tid,
730                                uid_t uid,
731                                status_t *status /*non-NULL*/,
732                                audio_port_handle_t portId);
733
734                AudioStreamOut* getOutput() const;
735                AudioStreamOut* clearOutput();
736                virtual sp<StreamHalInterface> stream() const;
737
738                // a very large number of suspend() will eventually wraparound, but unlikely
739                void        suspend() { (void) android_atomic_inc(&mSuspended); }
740                void        restore()
741                                {
742                                    // if restore() is done without suspend(), get back into
743                                    // range so that the next suspend() will operate correctly
744                                    if (android_atomic_dec(&mSuspended) <= 0) {
745                                        android_atomic_release_store(0, &mSuspended);
746                                    }
747                                }
748                bool        isSuspended() const
749                                { return android_atomic_acquire_load(&mSuspended) > 0; }
750
751    virtual     String8     getParameters(const String8& keys);
752    virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
753                status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
754                // Consider also removing and passing an explicit mMainBuffer initialization
755                // parameter to AF::PlaybackThread::Track::Track().
756                effect_buffer_t *sinkBuffer() const {
757                    return reinterpret_cast<effect_buffer_t *>(mSinkBuffer); };
758
759    virtual     void detachAuxEffect_l(int effectId);
760                status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track>& track,
761                        int EffectId);
762                status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track>& track,
763                        int EffectId);
764
765                virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
766                virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
767                virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const;
768                virtual uint32_t getStrategyForSession_l(audio_session_t sessionId);
769
770
771                virtual status_t setSyncEvent(const sp<SyncEvent>& event);
772                virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
773
774                // called with AudioFlinger lock held
775                        bool     invalidateTracks_l(audio_stream_type_t streamType);
776                virtual void     invalidateTracks(audio_stream_type_t streamType);
777
778    virtual     size_t      frameCount() const { return mNormalFrameCount; }
779
780                status_t    getTimestamp_l(AudioTimestamp& timestamp);
781
782                void        addPatchTrack(const sp<PatchTrack>& track);
783                void        deletePatchTrack(const sp<PatchTrack>& track);
784
785    virtual     void        getAudioPortConfig(struct audio_port_config *config);
786
787                // Return the asynchronous signal wait time.
788    virtual     int64_t     computeWaitTimeNs_l() const { return INT64_MAX; }
789
790    virtual     bool        isOutput() const override { return true; }
791
792                // returns true if the track is allowed to be added to the thread.
793    virtual     bool        isTrackAllowed_l(
794                                    audio_channel_mask_t channelMask __unused,
795                                    audio_format_t format __unused,
796                                    audio_session_t sessionId __unused,
797                                    uid_t uid) const {
798                                return trackCountForUid_l(uid) < PlaybackThread::kMaxTracksPerUid
799                                       && mTracks.size() < PlaybackThread::kMaxTracks;
800                            }
801
802protected:
803    // updated by readOutputParameters_l()
804    size_t                          mNormalFrameCount;  // normal mixer and effects
805
806    bool                            mThreadThrottle;     // throttle the thread processing
807    uint32_t                        mThreadThrottleTimeMs; // throttle time for MIXER threads
808    uint32_t                        mThreadThrottleEndMs;  // notify once per throttling
809    uint32_t                        mHalfBufferMs;       // half the buffer size in milliseconds
810
811    void*                           mSinkBuffer;         // frame size aligned sink buffer
812
813    // TODO:
814    // Rearrange the buffer info into a struct/class with
815    // clear, copy, construction, destruction methods.
816    //
817    // mSinkBuffer also has associated with it:
818    //
819    // mSinkBufferSize: Sink Buffer Size
820    // mFormat: Sink Buffer Format
821
822    // Mixer Buffer (mMixerBuffer*)
823    //
824    // In the case of floating point or multichannel data, which is not in the
825    // sink format, it is required to accumulate in a higher precision or greater channel count
826    // buffer before downmixing or data conversion to the sink buffer.
827
828    // Set to "true" to enable the Mixer Buffer otherwise mixer output goes to sink buffer.
829    bool                            mMixerBufferEnabled;
830
831    // Storage, 32 byte aligned (may make this alignment a requirement later).
832    // Due to constraints on mNormalFrameCount, the buffer size is a multiple of 16 frames.
833    void*                           mMixerBuffer;
834
835    // Size of mMixerBuffer in bytes: mNormalFrameCount * #channels * sampsize.
836    size_t                          mMixerBufferSize;
837
838    // The audio format of mMixerBuffer. Set to AUDIO_FORMAT_PCM_(FLOAT|16_BIT) only.
839    audio_format_t                  mMixerBufferFormat;
840
841    // An internal flag set to true by MixerThread::prepareTracks_l()
842    // when mMixerBuffer contains valid data after mixing.
843    bool                            mMixerBufferValid;
844
845    // Effects Buffer (mEffectsBuffer*)
846    //
847    // In the case of effects data, which is not in the sink format,
848    // it is required to accumulate in a different buffer before data conversion
849    // to the sink buffer.
850
851    // Set to "true" to enable the Effects Buffer otherwise effects output goes to sink buffer.
852    bool                            mEffectBufferEnabled;
853
854    // Storage, 32 byte aligned (may make this alignment a requirement later).
855    // Due to constraints on mNormalFrameCount, the buffer size is a multiple of 16 frames.
856    void*                           mEffectBuffer;
857
858    // Size of mEffectsBuffer in bytes: mNormalFrameCount * #channels * sampsize.
859    size_t                          mEffectBufferSize;
860
861    // The audio format of mEffectsBuffer. Set to AUDIO_FORMAT_PCM_16_BIT only.
862    audio_format_t                  mEffectBufferFormat;
863
864    // An internal flag set to true by MixerThread::prepareTracks_l()
865    // when mEffectsBuffer contains valid data after mixing.
866    //
867    // When this is set, all mixer data is routed into the effects buffer
868    // for any processing (including output processing).
869    bool                            mEffectBufferValid;
870
871    // suspend count, > 0 means suspended.  While suspended, the thread continues to pull from
872    // tracks and mix, but doesn't write to HAL.  A2DP and SCO HAL implementations can't handle
873    // concurrent use of both of them, so Audio Policy Service suspends one of the threads to
874    // workaround that restriction.
875    // 'volatile' means accessed via atomic operations and no lock.
876    volatile int32_t                mSuspended;
877
878    int64_t                         mBytesWritten;
879    int64_t                         mFramesWritten; // not reset on standby
880    int64_t                         mSuspendedFrames; // not reset on standby
881private:
882    // mMasterMute is in both PlaybackThread and in AudioFlinger.  When a
883    // PlaybackThread needs to find out if master-muted, it checks it's local
884    // copy rather than the one in AudioFlinger.  This optimization saves a lock.
885    bool                            mMasterMute;
886                void        setMasterMute_l(bool muted) { mMasterMute = muted; }
887protected:
888    ActiveTracks<Track>     mActiveTracks;
889
890    // Time to sleep between cycles when:
891    virtual uint32_t        activeSleepTimeUs() const;      // mixer state MIXER_TRACKS_ENABLED
892    virtual uint32_t        idleSleepTimeUs() const = 0;    // mixer state MIXER_IDLE
893    virtual uint32_t        suspendSleepTimeUs() const = 0; // audio policy manager suspended us
894    // No sleep when mixer state == MIXER_TRACKS_READY; relies on audio HAL stream->write()
895    // No sleep in standby mode; waits on a condition
896
897    // Code snippets that are temporarily lifted up out of threadLoop() until the merge
898                void        checkSilentMode_l();
899
900    // Non-trivial for DUPLICATING only
901    virtual     void        saveOutputTracks() { }
902    virtual     void        clearOutputTracks() { }
903
904    // Cache various calculated values, at threadLoop() entry and after a parameter change
905    virtual     void        cacheParameters_l();
906
907    virtual     uint32_t    correctLatency_l(uint32_t latency) const;
908
909    virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
910                                   audio_patch_handle_t *handle);
911    virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
912
913                bool        usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL)
914                                    && mHwSupportsPause
915                                    && (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); }
916
917                uint32_t    trackCountForUid_l(uid_t uid) const;
918
919private:
920
921    friend class AudioFlinger;      // for numerous
922
923    DISALLOW_COPY_AND_ASSIGN(PlaybackThread);
924
925    status_t    addTrack_l(const sp<Track>& track);
926    bool        destroyTrack_l(const sp<Track>& track);
927    void        removeTrack_l(const sp<Track>& track);
928
929    void        readOutputParameters_l();
930    void        updateMetadata_l() final;
931    virtual void sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata& metadata);
932
933    virtual void dumpInternals(int fd, const Vector<String16>& args);
934    void        dumpTracks(int fd, const Vector<String16>& args);
935
936    // The Tracks class manages names for all tracks
937    // added and removed from the Thread.
938    template <typename T>
939    class Tracks {
940    public:
941        Tracks(bool saveDeletedTrackNames) :
942            mSaveDeletedTrackNames(saveDeletedTrackNames) { }
943
944        // SortedVector methods
945        ssize_t         add(const sp<T> &track);
946        ssize_t         remove(const sp<T> &track);
947        size_t          size() const {
948            return mTracks.size();
949        }
950        bool            isEmpty() const {
951            return mTracks.isEmpty();
952        }
953        ssize_t         indexOf(const sp<T> &item) {
954            return mTracks.indexOf(item);
955        }
956        sp<T>           operator[](size_t index) const {
957            return mTracks[index];
958        }
959        typename SortedVector<sp<T>>::iterator begin() {
960            return mTracks.begin();
961        }
962        typename SortedVector<sp<T>>::iterator end() {
963            return mTracks.end();
964        }
965
966        size_t          processDeletedTrackNames(std::function<void(int)> f) {
967            const size_t size = mDeletedTrackNames.size();
968            if (size > 0) {
969                for (const int name : mDeletedTrackNames) {
970                    f(name);
971                }
972            }
973            return size;
974        }
975
976        void            clearDeletedTrackNames() { mDeletedTrackNames.clear(); }
977
978    private:
979        // Track names pending deletion for MIXER type threads
980        const bool mSaveDeletedTrackNames; // true to enable tracking
981        std::set<int> mDeletedTrackNames;
982
983        // Fast lookup of previously deleted track names for reuse.
984        // This is an arbitrary decision (actually any non-negative
985        // integer that isn't in mTracks[*]->names() could be used) - we attempt
986        // to use the smallest possible available name.
987        std::set<int> mUnusedTrackNames;
988
989        SortedVector<sp<T>> mTracks; // wrapped SortedVector.
990    };
991
992    Tracks<Track>                   mTracks;
993
994    stream_type_t                   mStreamTypes[AUDIO_STREAM_CNT];
995    AudioStreamOut                  *mOutput;
996
997    float                           mMasterVolume;
998    nsecs_t                         mLastWriteTime;
999    int                             mNumWrites;
1000    int                             mNumDelayedWrites;
1001    bool                            mInWrite;
1002
1003    // FIXME rename these former local variables of threadLoop to standard "m" names
1004    nsecs_t                         mStandbyTimeNs;
1005    size_t                          mSinkBufferSize;
1006
1007    // cached copies of activeSleepTimeUs() and idleSleepTimeUs() made by cacheParameters_l()
1008    uint32_t                        mActiveSleepTimeUs;
1009    uint32_t                        mIdleSleepTimeUs;
1010
1011    uint32_t                        mSleepTimeUs;
1012
1013    // mixer status returned by prepareTracks_l()
1014    mixer_state                     mMixerStatus; // current cycle
1015                                                  // previous cycle when in prepareTracks_l()
1016    mixer_state                     mMixerStatusIgnoringFastTracks;
1017                                                  // FIXME or a separate ready state per track
1018
1019    // FIXME move these declarations into the specific sub-class that needs them
1020    // MIXER only
1021    uint32_t                        sleepTimeShift;
1022
1023    // same as AudioFlinger::mStandbyTimeInNsecs except for DIRECT which uses a shorter value
1024    nsecs_t                         mStandbyDelayNs;
1025
1026    // MIXER only
1027    nsecs_t                         maxPeriod;
1028
1029    // DUPLICATING only
1030    uint32_t                        writeFrames;
1031
1032    size_t                          mBytesRemaining;
1033    size_t                          mCurrentWriteLength;
1034    bool                            mUseAsyncWrite;
1035    // mWriteAckSequence contains current write sequence on bits 31-1. The write sequence is
1036    // incremented each time a write(), a flush() or a standby() occurs.
1037    // Bit 0 is set when a write blocks and indicates a callback is expected.
1038    // Bit 0 is reset by the async callback thread calling resetWriteBlocked(). Out of sequence
1039    // callbacks are ignored.
1040    uint32_t                        mWriteAckSequence;
1041    // mDrainSequence contains current drain sequence on bits 31-1. The drain sequence is
1042    // incremented each time a drain is requested or a flush() or standby() occurs.
1043    // Bit 0 is set when the drain() command is called at the HAL and indicates a callback is
1044    // expected.
1045    // Bit 0 is reset by the async callback thread calling resetDraining(). Out of sequence
1046    // callbacks are ignored.
1047    uint32_t                        mDrainSequence;
1048    sp<AsyncCallbackThread>         mCallbackThread;
1049
1050private:
1051    // The HAL output sink is treated as non-blocking, but current implementation is blocking
1052    sp<NBAIO_Sink>          mOutputSink;
1053    // If a fast mixer is present, the blocking pipe sink, otherwise clear
1054    sp<NBAIO_Sink>          mPipeSink;
1055    // The current sink for the normal mixer to write it's (sub)mix, mOutputSink or mPipeSink
1056    sp<NBAIO_Sink>          mNormalSink;
1057#ifdef TEE_SINK
1058    // For dumpsys
1059    sp<NBAIO_Sink>          mTeeSink;
1060    sp<NBAIO_Source>        mTeeSource;
1061#endif
1062    uint32_t                mScreenState;   // cached copy of gScreenState
1063    // TODO: add comment and adjust size as needed
1064    static const size_t     kFastMixerLogSize = 8 * 1024;
1065    sp<NBLog::Writer>       mFastMixerNBLogWriter;
1066
1067
1068public:
1069    virtual     bool        hasFastMixer() const = 0;
1070    virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex __unused) const
1071                                { FastTrackUnderruns dummy; return dummy; }
1072
1073protected:
1074                // accessed by both binder threads and within threadLoop(), lock on mutex needed
1075                unsigned    mFastTrackAvailMask;    // bit i set if fast track [i] is available
1076                bool        mHwSupportsPause;
1077                bool        mHwPaused;
1078                bool        mFlushPending;
1079                // volumes last sent to audio HAL with stream->setVolume()
1080                float mLeftVolFloat;
1081                float mRightVolFloat;
1082};
1083
1084class MixerThread : public PlaybackThread {
1085public:
1086    MixerThread(const sp<AudioFlinger>& audioFlinger,
1087                AudioStreamOut* output,
1088                audio_io_handle_t id,
1089                audio_devices_t device,
1090                bool systemReady,
1091                type_t type = MIXER);
1092    virtual             ~MixerThread();
1093
1094    // Thread virtuals
1095
1096    virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
1097                                                   status_t& status);
1098    virtual     void        dumpInternals(int fd, const Vector<String16>& args);
1099
1100    virtual     bool        isTrackAllowed_l(
1101                                    audio_channel_mask_t channelMask, audio_format_t format,
1102                                    audio_session_t sessionId, uid_t uid) const override;
1103protected:
1104    virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
1105    virtual     uint32_t    idleSleepTimeUs() const;
1106    virtual     uint32_t    suspendSleepTimeUs() const;
1107    virtual     void        cacheParameters_l();
1108
1109    virtual void acquireWakeLock_l() {
1110        PlaybackThread::acquireWakeLock_l();
1111        if (hasFastMixer()) {
1112            mFastMixer->setBoottimeOffset(
1113                    mTimestamp.mTimebaseOffset[ExtendedTimestamp::TIMEBASE_BOOTTIME]);
1114        }
1115    }
1116
1117    // threadLoop snippets
1118    virtual     ssize_t     threadLoop_write();
1119    virtual     void        threadLoop_standby();
1120    virtual     void        threadLoop_mix();
1121    virtual     void        threadLoop_sleepTime();
1122    virtual     void        threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove);
1123    virtual     uint32_t    correctLatency_l(uint32_t latency) const;
1124
1125    virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
1126                                   audio_patch_handle_t *handle);
1127    virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
1128
1129                AudioMixer* mAudioMixer;    // normal mixer
1130private:
1131                // one-time initialization, no locks required
1132                sp<FastMixer>     mFastMixer;     // non-0 if there is also a fast mixer
1133                sp<AudioWatchdog> mAudioWatchdog; // non-0 if there is an audio watchdog thread
1134
1135                // contents are not guaranteed to be consistent, no locks required
1136                FastMixerDumpState mFastMixerDumpState;
1137#ifdef STATE_QUEUE_DUMP
1138                StateQueueObserverDump mStateQueueObserverDump;
1139                StateQueueMutatorDump  mStateQueueMutatorDump;
1140#endif
1141                AudioWatchdogDump mAudioWatchdogDump;
1142
1143                // accessible only within the threadLoop(), no locks required
1144                //          mFastMixer->sq()    // for mutating and pushing state
1145                int32_t     mFastMixerFutex;    // for cold idle
1146
1147                std::atomic_bool mMasterMono;
1148public:
1149    virtual     bool        hasFastMixer() const { return mFastMixer != 0; }
1150    virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex) const {
1151                              ALOG_ASSERT(fastIndex < FastMixerState::sMaxFastTracks);
1152                              return mFastMixerDumpState.mTracks[fastIndex].mUnderruns;
1153                            }
1154
1155protected:
1156    virtual     void       setMasterMono_l(bool mono) {
1157                               mMasterMono.store(mono);
1158                               if (mFastMixer != nullptr) { /* hasFastMixer() */
1159                                   mFastMixer->setMasterMono(mMasterMono);
1160                               }
1161                           }
1162                // the FastMixer performs mono blend if it exists.
1163                // Blending with limiter is not idempotent,
1164                // and blending without limiter is idempotent but inefficient to do twice.
1165    virtual     bool       requireMonoBlend() { return mMasterMono.load() && !hasFastMixer(); }
1166};
1167
1168class DirectOutputThread : public PlaybackThread {
1169public:
1170
1171    DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
1172                       audio_io_handle_t id, audio_devices_t device, bool systemReady);
1173    virtual                 ~DirectOutputThread();
1174
1175    // Thread virtuals
1176
1177    virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
1178                                                   status_t& status);
1179    virtual     void        flushHw_l();
1180
1181protected:
1182    virtual     uint32_t    activeSleepTimeUs() const;
1183    virtual     uint32_t    idleSleepTimeUs() const;
1184    virtual     uint32_t    suspendSleepTimeUs() const;
1185    virtual     void        cacheParameters_l();
1186
1187    // threadLoop snippets
1188    virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
1189    virtual     void        threadLoop_mix();
1190    virtual     void        threadLoop_sleepTime();
1191    virtual     void        threadLoop_exit();
1192    virtual     bool        shouldStandby_l();
1193
1194    virtual     void        onAddNewTrack_l();
1195
1196    bool mVolumeShaperActive;
1197
1198    DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
1199                        audio_io_handle_t id, uint32_t device, ThreadBase::type_t type,
1200                        bool systemReady);
1201    void processVolume_l(Track *track, bool lastTrack);
1202
1203    // prepareTracks_l() tells threadLoop_mix() the name of the single active track
1204    sp<Track>               mActiveTrack;
1205
1206    wp<Track>               mPreviousTrack;         // used to detect track switch
1207
1208public:
1209    virtual     bool        hasFastMixer() const { return false; }
1210
1211    virtual     int64_t     computeWaitTimeNs_l() const override;
1212};
1213
1214class OffloadThread : public DirectOutputThread {
1215public:
1216
1217    OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
1218                        audio_io_handle_t id, uint32_t device, bool systemReady);
1219    virtual                 ~OffloadThread() {};
1220    virtual     void        flushHw_l();
1221
1222protected:
1223    // threadLoop snippets
1224    virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
1225    virtual     void        threadLoop_exit();
1226
1227    virtual     bool        waitingAsyncCallback();
1228    virtual     bool        waitingAsyncCallback_l();
1229    virtual     void        invalidateTracks(audio_stream_type_t streamType);
1230
1231    virtual     bool        keepWakeLock() const { return (mKeepWakeLock || (mDrainSequence & 1)); }
1232
1233private:
1234    size_t      mPausedWriteLength;     // length in bytes of write interrupted by pause
1235    size_t      mPausedBytesRemaining;  // bytes still waiting in mixbuffer after resume
1236    bool        mKeepWakeLock;          // keep wake lock while waiting for write callback
1237    uint64_t    mOffloadUnderrunPosition; // Current frame position for offloaded playback
1238                                          // used and valid only during underrun.  ~0 if
1239                                          // no underrun has occurred during playback and
1240                                          // is not reset on standby.
1241};
1242
1243class AsyncCallbackThread : public Thread {
1244public:
1245
1246    explicit AsyncCallbackThread(const wp<PlaybackThread>& playbackThread);
1247
1248    virtual             ~AsyncCallbackThread();
1249
1250    // Thread virtuals
1251    virtual bool        threadLoop();
1252
1253    // RefBase
1254    virtual void        onFirstRef();
1255
1256            void        exit();
1257            void        setWriteBlocked(uint32_t sequence);
1258            void        resetWriteBlocked();
1259            void        setDraining(uint32_t sequence);
1260            void        resetDraining();
1261            void        setAsyncError();
1262
1263private:
1264    const wp<PlaybackThread>   mPlaybackThread;
1265    // mWriteAckSequence corresponds to the last write sequence passed by the offload thread via
1266    // setWriteBlocked(). The sequence is shifted one bit to the left and the lsb is used
1267    // to indicate that the callback has been received via resetWriteBlocked()
1268    uint32_t                   mWriteAckSequence;
1269    // mDrainSequence corresponds to the last drain sequence passed by the offload thread via
1270    // setDraining(). The sequence is shifted one bit to the left and the lsb is used
1271    // to indicate that the callback has been received via resetDraining()
1272    uint32_t                   mDrainSequence;
1273    Condition                  mWaitWorkCV;
1274    Mutex                      mLock;
1275    bool                       mAsyncError;
1276};
1277
1278class DuplicatingThread : public MixerThread {
1279public:
1280    DuplicatingThread(const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread,
1281                      audio_io_handle_t id, bool systemReady);
1282    virtual                 ~DuplicatingThread();
1283
1284    // Thread virtuals
1285    virtual     void        dumpInternals(int fd, const Vector<String16>& args) override;
1286
1287                void        addOutputTrack(MixerThread* thread);
1288                void        removeOutputTrack(MixerThread* thread);
1289                uint32_t    waitTimeMs() const { return mWaitTimeMs; }
1290
1291                void        sendMetadataToBackend_l(
1292                        const StreamOutHalInterface::SourceMetadata& metadata) override;
1293protected:
1294    virtual     uint32_t    activeSleepTimeUs() const;
1295
1296private:
1297                bool        outputsReady(const SortedVector< sp<OutputTrack> > &outputTracks);
1298protected:
1299    // threadLoop snippets
1300    virtual     void        threadLoop_mix();
1301    virtual     void        threadLoop_sleepTime();
1302    virtual     ssize_t     threadLoop_write();
1303    virtual     void        threadLoop_standby();
1304    virtual     void        cacheParameters_l();
1305
1306private:
1307    // called from threadLoop, addOutputTrack, removeOutputTrack
1308    virtual     void        updateWaitTime_l();
1309protected:
1310    virtual     void        saveOutputTracks();
1311    virtual     void        clearOutputTracks();
1312private:
1313
1314                uint32_t    mWaitTimeMs;
1315    SortedVector < sp<OutputTrack> >  outputTracks;
1316    SortedVector < sp<OutputTrack> >  mOutputTracks;
1317public:
1318    virtual     bool        hasFastMixer() const { return false; }
1319};
1320
1321// record thread
1322class RecordThread : public ThreadBase
1323{
1324public:
1325
1326    class RecordTrack;
1327
1328    /* The ResamplerBufferProvider is used to retrieve recorded input data from the
1329     * RecordThread.  It maintains local state on the relative position of the read
1330     * position of the RecordTrack compared with the RecordThread.
1331     */
1332    class ResamplerBufferProvider : public AudioBufferProvider
1333    {
1334    public:
1335        explicit ResamplerBufferProvider(RecordTrack* recordTrack) :
1336            mRecordTrack(recordTrack),
1337            mRsmpInUnrel(0), mRsmpInFront(0) { }
1338        virtual ~ResamplerBufferProvider() { }
1339
1340        // called to set the ResamplerBufferProvider to head of the RecordThread data buffer,
1341        // skipping any previous data read from the hal.
1342        virtual void reset();
1343
1344        /* Synchronizes RecordTrack position with the RecordThread.
1345         * Calculates available frames and handle overruns if the RecordThread
1346         * has advanced faster than the ResamplerBufferProvider has retrieved data.
1347         * TODO: why not do this for every getNextBuffer?
1348         *
1349         * Parameters
1350         * framesAvailable:  pointer to optional output size_t to store record track
1351         *                   frames available.
1352         *      hasOverrun:  pointer to optional boolean, returns true if track has overrun.
1353         */
1354
1355        virtual void sync(size_t *framesAvailable = NULL, bool *hasOverrun = NULL);
1356
1357        // AudioBufferProvider interface
1358        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
1359        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
1360    private:
1361        RecordTrack * const mRecordTrack;
1362        size_t              mRsmpInUnrel;   // unreleased frames remaining from
1363                                            // most recent getNextBuffer
1364                                            // for debug only
1365        int32_t             mRsmpInFront;   // next available frame
1366                                            // rolling counter that is never cleared
1367    };
1368
1369#include "RecordTracks.h"
1370
1371            RecordThread(const sp<AudioFlinger>& audioFlinger,
1372                    AudioStreamIn *input,
1373                    audio_io_handle_t id,
1374                    audio_devices_t outDevice,
1375                    audio_devices_t inDevice,
1376                    bool systemReady
1377#ifdef TEE_SINK
1378                    , const sp<NBAIO_Sink>& teeSink
1379#endif
1380                    );
1381            virtual     ~RecordThread();
1382
1383    // no addTrack_l ?
1384    void        destroyTrack_l(const sp<RecordTrack>& track);
1385    void        removeTrack_l(const sp<RecordTrack>& track);
1386
1387    void        dumpInternals(int fd, const Vector<String16>& args);
1388    void        dumpTracks(int fd, const Vector<String16>& args);
1389
1390    // Thread virtuals
1391    virtual bool        threadLoop();
1392    virtual void        preExit();
1393
1394    // RefBase
1395    virtual void        onFirstRef();
1396
1397    virtual status_t    initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; }
1398
1399    virtual sp<MemoryDealer>    readOnlyHeap() const { return mReadOnlyHeap; }
1400
1401    virtual sp<IMemory> pipeMemory() const { return mPipeMemory; }
1402
1403            sp<AudioFlinger::RecordThread::RecordTrack>  createRecordTrack_l(
1404                    const sp<AudioFlinger::Client>& client,
1405                    const audio_attributes_t& attr,
1406                    uint32_t *pSampleRate,
1407                    audio_format_t format,
1408                    audio_channel_mask_t channelMask,
1409                    size_t *pFrameCount,
1410                    audio_session_t sessionId,
1411                    size_t *pNotificationFrameCount,
1412                    uid_t uid,
1413                    audio_input_flags_t *flags,
1414                    pid_t tid,
1415                    status_t *status /*non-NULL*/,
1416                    audio_port_handle_t portId);
1417
1418            status_t    start(RecordTrack* recordTrack,
1419                              AudioSystem::sync_event_t event,
1420                              audio_session_t triggerSession);
1421
1422            // ask the thread to stop the specified track, and
1423            // return true if the caller should then do it's part of the stopping process
1424            bool        stop(RecordTrack* recordTrack);
1425
1426            void        dump(int fd, const Vector<String16>& args);
1427            AudioStreamIn* clearInput();
1428            virtual sp<StreamHalInterface> stream() const;
1429
1430
1431    virtual bool        checkForNewParameter_l(const String8& keyValuePair,
1432                                               status_t& status);
1433    virtual void        cacheParameters_l() {}
1434    virtual String8     getParameters(const String8& keys);
1435    virtual void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
1436    virtual status_t    createAudioPatch_l(const struct audio_patch *patch,
1437                                           audio_patch_handle_t *handle);
1438    virtual status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
1439
1440            void        addPatchRecord(const sp<PatchRecord>& record);
1441            void        deletePatchRecord(const sp<PatchRecord>& record);
1442
1443            void        readInputParameters_l();
1444    virtual uint32_t    getInputFramesLost();
1445
1446    virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
1447    virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
1448    virtual uint32_t hasAudioSession_l(audio_session_t sessionId) const;
1449
1450            // Return the set of unique session IDs across all tracks.
1451            // The keys are the session IDs, and the associated values are meaningless.
1452            // FIXME replace by Set [and implement Bag/Multiset for other uses].
1453            KeyedVector<audio_session_t, bool> sessionIds() const;
1454
1455    virtual status_t setSyncEvent(const sp<SyncEvent>& event);
1456    virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
1457
1458    static void syncStartEventCallback(const wp<SyncEvent>& event);
1459
1460    virtual size_t      frameCount() const { return mFrameCount; }
1461            bool        hasFastCapture() const { return mFastCapture != 0; }
1462    virtual void        getAudioPortConfig(struct audio_port_config *config);
1463
1464    virtual status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
1465                                                   audio_session_t sessionId);
1466
1467    virtual void        acquireWakeLock_l() {
1468                            ThreadBase::acquireWakeLock_l();
1469                            mActiveTracks.updatePowerState(this, true /* force */);
1470                        }
1471    virtual bool        isOutput() const override { return false; }
1472
1473            void        checkBtNrec();
1474
1475            // Sets the UID records silence
1476            void        setRecordSilenced(uid_t uid, bool silenced);
1477
1478            status_t    getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
1479
1480            void        updateMetadata_l() override;
1481
1482private:
1483            // Enter standby if not already in standby, and set mStandby flag
1484            void    standbyIfNotAlreadyInStandby();
1485
1486            // Call the HAL standby method unconditionally, and don't change mStandby flag
1487            void    inputStandBy();
1488
1489            void    checkBtNrec_l();
1490
1491            AudioStreamIn                       *mInput;
1492            SortedVector < sp<RecordTrack> >    mTracks;
1493            // mActiveTracks has dual roles:  it indicates the current active track(s), and
1494            // is used together with mStartStopCond to indicate start()/stop() progress
1495            ActiveTracks<RecordTrack>           mActiveTracks;
1496
1497            Condition                           mStartStopCond;
1498
1499            // resampler converts input at HAL Hz to output at AudioRecord client Hz
1500            void                               *mRsmpInBuffer;  // size = mRsmpInFramesOA
1501            size_t                              mRsmpInFrames;  // size of resampler input in frames
1502            size_t                              mRsmpInFramesP2;// size rounded up to a power-of-2
1503            size_t                              mRsmpInFramesOA;// mRsmpInFramesP2 + over-allocation
1504
1505            // rolling index that is never cleared
1506            int32_t                             mRsmpInRear;    // last filled frame + 1
1507
1508            // For dumpsys
1509            const sp<NBAIO_Sink>                mTeeSink;
1510
1511            const sp<MemoryDealer>              mReadOnlyHeap;
1512
1513            // one-time initialization, no locks required
1514            sp<FastCapture>                     mFastCapture;   // non-0 if there is also
1515                                                                // a fast capture
1516
1517            // FIXME audio watchdog thread
1518
1519            // contents are not guaranteed to be consistent, no locks required
1520            FastCaptureDumpState                mFastCaptureDumpState;
1521#ifdef STATE_QUEUE_DUMP
1522            // FIXME StateQueue observer and mutator dump fields
1523#endif
1524            // FIXME audio watchdog dump
1525
1526            // accessible only within the threadLoop(), no locks required
1527            //          mFastCapture->sq()      // for mutating and pushing state
1528            int32_t     mFastCaptureFutex;      // for cold idle
1529
1530            // The HAL input source is treated as non-blocking,
1531            // but current implementation is blocking
1532            sp<NBAIO_Source>                    mInputSource;
1533            // The source for the normal capture thread to read from: mInputSource or mPipeSource
1534            sp<NBAIO_Source>                    mNormalSource;
1535            // If a fast capture is present, the non-blocking pipe sink written to by fast capture,
1536            // otherwise clear
1537            sp<NBAIO_Sink>                      mPipeSink;
1538            // If a fast capture is present, the non-blocking pipe source read by normal thread,
1539            // otherwise clear
1540            sp<NBAIO_Source>                    mPipeSource;
1541            // Depth of pipe from fast capture to normal thread and fast clients, always power of 2
1542            size_t                              mPipeFramesP2;
1543            // If a fast capture is present, the Pipe as IMemory, otherwise clear
1544            sp<IMemory>                         mPipeMemory;
1545
1546            // TODO: add comment and adjust size as needed
1547            static const size_t                 kFastCaptureLogSize = 4 * 1024;
1548            sp<NBLog::Writer>                   mFastCaptureNBLogWriter;
1549
1550            bool                                mFastTrackAvail;    // true if fast track available
1551            // common state to all record threads
1552            std::atomic_bool                    mBtNrecSuspended;
1553};
1554
1555class MmapThread : public ThreadBase
1556{
1557 public:
1558
1559#include "MmapTracks.h"
1560
1561    MmapThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1562                      AudioHwDevice *hwDev, sp<StreamHalInterface> stream,
1563                      audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
1564    virtual     ~MmapThread();
1565
1566    virtual     void        configure(const audio_attributes_t *attr,
1567                                      audio_stream_type_t streamType,
1568                                      audio_session_t sessionId,
1569                                      const sp<MmapStreamCallback>& callback,
1570                                      audio_port_handle_t deviceId,
1571                                      audio_port_handle_t portId);
1572
1573                void        disconnect();
1574
1575    // MmapStreamInterface
1576    status_t createMmapBuffer(int32_t minSizeFrames,
1577                                      struct audio_mmap_buffer_info *info);
1578    status_t getMmapPosition(struct audio_mmap_position *position);
1579    status_t start(const AudioClient& client, audio_port_handle_t *handle);
1580    status_t stop(audio_port_handle_t handle);
1581    status_t standby();
1582
1583    // RefBase
1584    virtual     void        onFirstRef();
1585
1586    // Thread virtuals
1587    virtual     bool        threadLoop();
1588
1589    virtual     void        threadLoop_exit();
1590    virtual     void        threadLoop_standby();
1591    virtual     bool        shouldStandby_l() { return false; }
1592    virtual     status_t    exitStandby();
1593
1594    virtual     status_t    initCheck() const { return (mHalStream == 0) ? NO_INIT : NO_ERROR; }
1595    virtual     size_t      frameCount() const { return mFrameCount; }
1596    virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
1597                                                    status_t& status);
1598    virtual     String8     getParameters(const String8& keys);
1599    virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0);
1600                void        readHalParameters_l();
1601    virtual     void        cacheParameters_l() {}
1602    virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
1603                                               audio_patch_handle_t *handle);
1604    virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
1605    virtual     void        getAudioPortConfig(struct audio_port_config *config);
1606
1607    virtual     sp<StreamHalInterface> stream() const { return mHalStream; }
1608    virtual     status_t    addEffectChain_l(const sp<EffectChain>& chain);
1609    virtual     size_t      removeEffectChain_l(const sp<EffectChain>& chain);
1610    virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
1611                                                               audio_session_t sessionId);
1612
1613    virtual     uint32_t    hasAudioSession_l(audio_session_t sessionId) const;
1614    virtual     status_t    setSyncEvent(const sp<SyncEvent>& event);
1615    virtual     bool        isValidSyncEvent(const sp<SyncEvent>& event) const;
1616
1617    virtual     void        checkSilentMode_l() {}
1618    virtual     void        processVolume_l() {}
1619                void        checkInvalidTracks_l();
1620
1621    virtual     audio_stream_type_t streamType() { return AUDIO_STREAM_DEFAULT; }
1622
1623    virtual     void        invalidateTracks(audio_stream_type_t streamType __unused) {}
1624
1625                // Sets the UID records silence
1626    virtual     void        setRecordSilenced(uid_t uid __unused, bool silenced __unused) {}
1627
1628                void        dump(int fd, const Vector<String16>& args);
1629    virtual     void        dumpInternals(int fd, const Vector<String16>& args);
1630                void        dumpTracks(int fd, const Vector<String16>& args);
1631
1632 protected:
1633
1634                audio_attributes_t      mAttr;
1635                audio_session_t         mSessionId;
1636                audio_port_handle_t     mDeviceId;
1637                audio_port_handle_t     mPortId;
1638
1639                wp<MmapStreamCallback>  mCallback;
1640                sp<StreamHalInterface>  mHalStream;
1641                sp<DeviceHalInterface>  mHalDevice;
1642                AudioHwDevice* const    mAudioHwDev;
1643                ActiveTracks<MmapTrack> mActiveTracks;
1644
1645                int32_t                 mNoCallbackWarningCount;
1646     static     constexpr int32_t       kMaxNoCallbackWarnings = 5;
1647};
1648
1649class MmapPlaybackThread : public MmapThread, public VolumeInterface
1650{
1651
1652public:
1653    MmapPlaybackThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1654                      AudioHwDevice *hwDev, AudioStreamOut *output,
1655                      audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
1656    virtual     ~MmapPlaybackThread() {}
1657
1658    virtual     void        configure(const audio_attributes_t *attr,
1659                                      audio_stream_type_t streamType,
1660                                      audio_session_t sessionId,
1661                                      const sp<MmapStreamCallback>& callback,
1662                                      audio_port_handle_t deviceId,
1663                                      audio_port_handle_t portId);
1664
1665                AudioStreamOut* clearOutput();
1666
1667                // VolumeInterface
1668    virtual     void        setMasterVolume(float value);
1669    virtual     void        setMasterMute(bool muted);
1670    virtual     void        setStreamVolume(audio_stream_type_t stream, float value);
1671    virtual     void        setStreamMute(audio_stream_type_t stream, bool muted);
1672    virtual     float       streamVolume(audio_stream_type_t stream) const;
1673
1674                void        setMasterMute_l(bool muted) { mMasterMute = muted; }
1675
1676    virtual     void        invalidateTracks(audio_stream_type_t streamType);
1677
1678    virtual     audio_stream_type_t streamType() { return mStreamType; }
1679    virtual     void        checkSilentMode_l();
1680                void        processVolume_l() override;
1681
1682    virtual     void        dumpInternals(int fd, const Vector<String16>& args);
1683
1684    virtual     bool        isOutput() const override { return true; }
1685
1686                void        updateMetadata_l() override;
1687
1688protected:
1689
1690                audio_stream_type_t         mStreamType;
1691                float                       mMasterVolume;
1692                float                       mStreamVolume;
1693                bool                        mMasterMute;
1694                bool                        mStreamMute;
1695                float                       mHalVolFloat;
1696                AudioStreamOut*             mOutput;
1697};
1698
1699class MmapCaptureThread : public MmapThread
1700{
1701
1702public:
1703    MmapCaptureThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1704                      AudioHwDevice *hwDev, AudioStreamIn *input,
1705                      audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
1706    virtual     ~MmapCaptureThread() {}
1707
1708                AudioStreamIn* clearInput();
1709
1710                status_t       exitStandby() override;
1711    virtual     bool           isOutput() const override { return false; }
1712
1713                void           updateMetadata_l() override;
1714                void           processVolume_l() override;
1715                void           setRecordSilenced(uid_t uid, bool silenced) override;
1716
1717protected:
1718
1719                AudioStreamIn*  mInput;
1720};
1721