AudioFlinger.h revision 0986e7907ffc8387b04fb201e285784bcd11b9b7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/include/server/AudioFlinger/AudioFlinger.h
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIO_FLINGER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_FLINGER_H
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
238ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent#include <limits.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlingerClient.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h"
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer;
47a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void instantiate();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    dump(int fd, const Vector<String16>& args);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IAudioFlinger interface
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int streamType,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
77ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int output,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    sampleRate(int output) const;
81ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         channelCount(int output) const;
82ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         format(int output) const;
83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     size_t      frameCount(int output) const;
84ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    latency(int output) const;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterVolume(float value);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterMute(bool muted);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     float       masterVolume() const;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        masterMute() const;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setStreamVolume(int stream, float value, int output);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setStreamMute(int stream, bool muted);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     float       streamVolume(int stream, int output) const;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        streamMute(int stream) const;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMode(int mode);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMicMute(bool state);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        getMicMute() const;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10323f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent    virtual     bool        isStreamActive(int stream) const;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
105ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs);
106ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     String8     getParameters(int ioHandle, const String8& keys);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
109a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
111a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
112ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openOutput(uint32_t *pDevices,
113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pSamplingRate,
114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pFormat,
115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pChannels,
116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pLatencyMs,
117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t flags);
118a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
119ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openDuplicateOutput(int output1, int output2);
120a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
121ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeOutput(int output);
122a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
123ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t suspendOutput(int output);
124a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
125ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t restoreOutput(int output);
126a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
127ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openInput(uint32_t *pDevices,
128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pSamplingRate,
129a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pFormat,
130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pChannels,
131a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t acoustics);
132a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeInput(int input);
134a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
135ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output);
136a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
137415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    virtual status_t setVoiceVolume(float volume);
138415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent
1390986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output);
1400986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IBinder::DeathRecipient
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        binderDied(const wp<IBinder>& who);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum hardware_call_state {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_IDLE = 0,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INIT,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_OPEN,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_CLOSE,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_OPEN,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_CLOSE,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_STANDBY,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MASTER_VOLUME,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_ROUTING,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_ROUTING,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MODE,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MODE,
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MIC_MUTE,
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MIC_MUTE,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_VOICE_VOLUME,
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_PARAMETER,
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // record interface
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
166ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    onTransact(
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t code,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const Parcel& data,
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcel* reply,
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AudioFlinger();
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual                 ~AudioFlinger();
183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internal dump utilites.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpClients(int fd, const Vector<String16>& args);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpInternals(int fd, const Vector<String16>& args);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // --- Client ---
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client : public RefBase {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~Client();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<MemoryDealer>&     heap() const;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               pid() const { return mPid; }
197b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent        sp<AudioFlinger>    audioFlinger() { return mAudioFlinger; }
198b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const Client&);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client& operator = (const Client&);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AudioFlinger>    mAudioFlinger;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryDealer>    mMemoryDealer;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               mPid;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle;
210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread;
211a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread;
212a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread;
213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread;
2148ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    class DuplicatingThread;
215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class Track;
216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordTrack;
217a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
218a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class ThreadBase : public Thread {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
22049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
221a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~ThreadBase();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2233fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent        status_t dumpBase(int fd, const Vector<String16>& args);
2243fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // base for record and playback
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class TrackBase : public AudioBufferProvider, public RefBase {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_state {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IDLE,
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TERMINATED,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STOPPED,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                RESUMING,
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ACTIVE,
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSING,
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSED
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_flags {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The upper 16 bits are used for track-specific flags.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
245a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                TrackBase(const wp<ThreadBase>& thread,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t flags,
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~TrackBase();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start() = 0;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop() = 0;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<IMemory> getCblk() const;
2586c30a71122a6ef2189304c136f13a87727804b0aEric Laurent                    audio_track_cblk_t* cblk() const { return mCblk; }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
261a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class RecordHandle;
2632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
2642c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
2652c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
2662c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase(const TrackBase&);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase& operator = (const TrackBase&);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format() const {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mFormat;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount() const ;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sampleRate() const;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* getBuffer(uint32_t offset, uint32_t frames) const;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isStopped() const {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == STOPPED;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isTerminated() const {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == TERMINATED;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool step();
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
295a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>      mThread;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<Client>          mClient;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mCblkMemory;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_track_cblk_t* mCblk;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBuffer;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBufferEnd;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFrameCount;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mState;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mClientTid;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t             mFormat;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFlags;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class ConfigEvent {
310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            ConfigEvent() : mEvent(0), mParam(0) {}
312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mEvent;
314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mParam;
315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t    sampleRate() const;
318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         channelCount() const;
319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         format() const;
320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t      frameCount() const;
321a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        exit();
323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l() = 0;
324a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    setParameters(const String8& keyValuePairs);
325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys) = 0;
326a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0) = 0;
327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        sendConfigEvent(int event, int param = 0);
3288fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    void        sendConfigEvent_l(int event, int param = 0);
329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        processConfigEvents();
33049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int         id() const { return mId;}
3318ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        standby() { return mStandby; }
332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3332c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        mutable     Mutex                   mLock;
3342c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class Track;
338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class TrackBase;
339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class PlaybackThread;
340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordThread;
344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordTrack;
345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mWaitWorkCV;
347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    sp<AudioFlinger>        mAudioFlinger;
348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mSampleRate;
349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t                  mFrameCount;
350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mChannelCount;
351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mFormat;
352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mFrameSize;
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mParamCond;
3548fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    Vector<String8>         mNewParameters;
355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    status_t                mParamStatus;
356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Vector<ConfigEvent *>   mConfigEvents;
357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool                    mStandby;
35849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int                     mId;
35949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    bool                    mExiting;
360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // --- PlaybackThread ---
363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread : public ThreadBase {
364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        enum type {
367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            MIXER,
368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DIRECT,
369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DUPLICATING
370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
372059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        enum mixer_state {
373059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_IDLE,
374059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_ENABLED,
375059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_READY
376059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        };
377059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Track : public TrackBase {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                Track(  const wp<ThreadBase>& thread,
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int streamType,
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~Track();
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        dump(char* buffer, size_t size);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        pause();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        flush();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        destroy();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        mute(bool);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        setVolume(float left, float right);
400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int name() const {
401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        return mName;
402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4044bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    int type() const {
4054bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                        return mStreamType;
4064bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    }
4074bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4084bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
410a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class AudioFlinger;
4122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class TrackHandle;
4132c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
4142c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
4152c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track(const Track&);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track& operator = (const Track&);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool isMuted() { return mMute; }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPausing() const {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSING;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPaused() const {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSED;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isReady() const;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void setPaused() { mState = PAUSED; }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            bool isOutputTrack() const {
43349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
43449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            }
43549f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float               mVolume[2];
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile bool       mMute;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FILLED state is used for suppressing volume ramp at begin of playing
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mutable uint8_t     mFillingUpStatus;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int8_t              mRetryCount;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mSharedBuffer;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool                mResetDone;
4454bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent            int                 mStreamType;
446a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int                 mName;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };  // end of Track
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OutputTrack : public Track {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
453a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class Buffer: public AudioBufferProvider::Buffer {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int16_t *mBuffer;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                OutputTrack(  const wp<ThreadBase>& thread,
4608ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                                        DuplicatingThread *sourceThread,
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~OutputTrack();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        write(int16_t* data, uint32_t frames);
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
471a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isActive() { return mActive; }
472a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>&     thread()  { return mThread; }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private:
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                clearBufferQueue();
478a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            // Maximum number of pending buffers allocated by OutputTrack::write()
4808ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            static const uint8_t kMaxOverFlowBuffers = 10;
481a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector < Buffer* >          mBufferQueue;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AudioBufferProvider::Buffer mOutBuffer;
484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                        mActive;
4858ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            DuplicatingThread*          mSourceThread;
486a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };  // end of OutputTrack
487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
48849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
489a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~PlaybackThread();
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    dump(int fd, const Vector<String16>& args);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Thread virtuals
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    readyToRun();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     void        onFirstRef();
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     uint32_t    latency() const;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterVolume(float value);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterMute(bool muted);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       masterVolume() const;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        masterMute() const;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamVolume(int stream, float value);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamMute(int stream, bool muted);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       streamVolume(int stream) const;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        streamMute(int stream) const;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51123f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent                    bool        isStreamActive(int stream) const;
512a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
513b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                    sp<Track>   createTrack_l(
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<AudioFlinger::Client>& client,
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int streamType,
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate,
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int format,
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelCount,
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount,
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer,
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    status_t *status);
522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    AudioStreamOut* getOutput() { return mOutput; }
524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
525a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         type() const { return mType; }
526d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        suspend() { mSuspended++; }
527d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        restore() { if (mSuspended) mSuspended--; }
5288ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        isSuspended() { return (mSuspended != 0); }
529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys);
530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0);
5310986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        virtual     status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
532a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct  stream_type_t {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream_type_t()
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                :   volume(1.0f),
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mute(false)
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float       volume;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        mute;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5432c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent    protected:
5442c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mType;
5452c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int16_t*                        mMixBuffer;
546d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent        int                             mSuspended;
5472c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mBytesWritten;
5482c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mMasterMute;
5492c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        SortedVector< wp<Track> >       mActiveTracks;
5502c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
55162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual int             getTrackName_l() = 0;
55262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual void            deleteTrackName_l(int name) = 0;
553059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        activeSleepTimeUs() = 0;
554059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        idleSleepTimeUs() = 0;
55562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class AudioFlinger;
5596c30a71122a6ef2189304c136f13a87727804b0aEric Laurent        friend class OutputTrack;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class Track;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class TrackBase;
562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread(const Client&);
567a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread& operator = (const PlaybackThread&);
568a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
569b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        status_t    addTrack_l(const sp<Track>& track);
570b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        void        destroyTrack_l(const sp<Track>& track);
57162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
572a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        void        readOutputParameters();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
574a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t    dumpTracks(int fd, const Vector<String16>& args);
576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector< sp<Track> >       mTracks;
578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioStreamOut*                 mOutput;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float                           mMasterVolume;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsecs_t                         mLastWriteTime;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumWrites;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumDelayedWrites;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                            mInWrite;
586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread : public PlaybackThread {
589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
59049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~MixerThread();
592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        getTracks(SortedVector < sp<Track> >& tracks,
597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks,
598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      int streamType);
599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        putTracks(SortedVector < sp<Track> >& tracks,
600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks);
601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
602a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
605059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
60662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     int         getTrackName_l();
60762443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     void        deleteTrackName_l(int name);
608059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
609059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioMixer*                     mAudioMixer;
612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread : public PlaybackThread {
615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
61749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DirectOutputThread();
619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
621a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
62362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     bool        checkForNewParameters_l();
62462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
62562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent    protected:
626a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
628059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
629059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
632a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mLeftVolume;
633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mRightVolume;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DuplicatingThread : public MixerThread {
637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
63849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DuplicatingThread();
640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
642a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        addOutputTrack(MixerThread* thread);
644a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        removeOutputTrack(MixerThread* thread);
6458ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
6468ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    protected:
6478ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
648a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
6508ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
6518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    void        updateWaitTime();
6528ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent
653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        SortedVector < sp<OutputTrack> >  mOutputTracks;
6548ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    mWaitTimeMs;
655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
657ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              PlaybackThread *checkPlaybackThread_l(int output) const;
658ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              MixerThread *checkMixerThread_l(int output) const;
659ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              RecordThread *checkRecordThread_l(int input) const;
660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
66149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent              void audioConfigChanged_l(int event, int ioHandle, void *param2);
662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class AudioBuffer;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle : public android::BnAudioTrack {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            TrackHandle(const sp<PlaybackThread::Track>& track);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~TrackHandle();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        flush();
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        mute(bool);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        pause();
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        setVolume(float left, float right);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<PlaybackThread::Track> mTrack;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Client;
683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread::Track;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
686b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent                void        removeClient_l(pid_t pid);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // record thread
690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread : public ThreadBase, public AudioBufferProvider
691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // record track
695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class RecordTrack : public TrackBase {
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const wp<ThreadBase>& thread,
698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        const sp<Client>& client,
699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t sampleRate,
700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int format,
701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int channelCount,
702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int frameCount,
703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t flags);
704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                ~RecordTrack();
705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t    start();
707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual void        stop();
708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
7123fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent                    void        dump(char* buffer, size_t size);
713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        private:
714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class AudioFlinger;
7152c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const RecordTrack&);
718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack& operator = (const RecordTrack&);
719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                mOverflow;
723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
726a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread(const sp<AudioFlinger>& audioFlinger,
727a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        AudioStreamIn *input,
728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t sampleRate,
72949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        uint32_t channels,
73049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        int id);
731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                ~RecordThread();
732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        threadLoop();
734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    readyToRun() { return NO_ERROR; }
735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        onFirstRef();
736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    start(RecordTrack* recordTrack);
738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        stop(RecordTrack* recordTrack);
739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    dump(int fd, const Vector<String16>& args);
740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn* getInput() { return mInput; }
741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        checkForNewParameters_l();
745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual String8     getParameters(const String8& keys);
746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        audioConfigChanged(int event, int param = 0);
747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        readInputParameters();
748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread();
751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn                       *mInput;
752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                sp<RecordTrack>                     mActiveTrack;
753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                Condition                           mStartStopCond;
754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioResampler                      *mResampler;
755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int32_t                             *mRsmpOutBuffer;
756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int16_t                             *mRsmpInBuffer;
757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mRsmpInIndex;
758a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mInputBytes;
759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int                                 mReqChannelCount;
760a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                uint32_t                            mReqSampleRate;
7619cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent                ssize_t                             mBytesRead;
762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle : public android::BnAudioRecord {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~RecordHandle();
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<RecordThread::RecordTrack> mRecordTrack;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
777a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class RecordThread;
778a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread;
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
781b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    mutable     Mutex                               mLock;
782b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                mutable     Mutex                   mHardwareLock;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioHardwareInterface*             mAudioHardware;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable     int                                 mHardwareStatus;
788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
790ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
792a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                float                               mMasterVolume;
793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                bool                                mMasterMute;
794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
795ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
796a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
797a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                SortedVector< sp<IBinder> >         mNotificationClients;
798ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                int                                 mNextThreadId;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H
806