AudioFlinger.h revision 8ac9f8d1c708dc8bb853f7697f10051031eb73c5
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
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        isMusicActive() 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
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IBinder::DeathRecipient
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        binderDied(const wp<IBinder>& who);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum hardware_call_state {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_IDLE = 0,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INIT,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_OPEN,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_CLOSE,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_OPEN,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_CLOSE,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_STANDBY,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MASTER_VOLUME,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_ROUTING,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_ROUTING,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MODE,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MODE,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MIC_MUTE,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MIC_MUTE,
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_VOICE_VOLUME,
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_PARAMETER,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // record interface
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
164ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    onTransact(
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t code,
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const Parcel& data,
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcel* reply,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AudioFlinger();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual                 ~AudioFlinger();
181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internal dump utilites.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpClients(int fd, const Vector<String16>& args);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpInternals(int fd, const Vector<String16>& args);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // --- Client ---
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client : public RefBase {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~Client();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<MemoryDealer>&     heap() const;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               pid() const { return mPid; }
195b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent        sp<AudioFlinger>    audioFlinger() { return mAudioFlinger; }
196b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const Client&);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client& operator = (const Client&);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AudioFlinger>    mAudioFlinger;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryDealer>    mMemoryDealer;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               mPid;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle;
208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread;
209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread;
210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread;
211a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread;
2128ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    class DuplicatingThread;
213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class Track;
214a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordTrack;
215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class ThreadBase : public Thread {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
21849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
219a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~ThreadBase();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2213fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent        status_t dumpBase(int fd, const Vector<String16>& args);
2223fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // base for record and playback
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class TrackBase : public AudioBufferProvider, public RefBase {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_state {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IDLE,
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TERMINATED,
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STOPPED,
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                RESUMING,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ACTIVE,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSING,
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSED
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_flags {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The upper 16 bits are used for track-specific flags.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                TrackBase(const wp<ThreadBase>& thread,
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t flags,
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~TrackBase();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start() = 0;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop() = 0;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<IMemory> getCblk() const;
2566c30a71122a6ef2189304c136f13a87727804b0aEric Laurent                    audio_track_cblk_t* cblk() const { return mCblk; }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
259a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class RecordHandle;
2612c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
2622c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
2632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
2642c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase(const TrackBase&);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase& operator = (const TrackBase&);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format() const {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mFormat;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount() const ;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sampleRate() const;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* getBuffer(uint32_t offset, uint32_t frames) const;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isStopped() const {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == STOPPED;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isTerminated() const {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == TERMINATED;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool step();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
293a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>      mThread;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<Client>          mClient;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mCblkMemory;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_track_cblk_t* mCblk;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBuffer;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBufferEnd;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFrameCount;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mState;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mClientTid;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t             mFormat;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFlags;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class ConfigEvent {
308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            ConfigEvent() : mEvent(0), mParam(0) {}
310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mEvent;
312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mParam;
313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t    sampleRate() const;
316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         channelCount() const;
317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         format() const;
318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t      frameCount() const;
319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        exit();
321a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l() = 0;
322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    setParameters(const String8& keyValuePairs);
323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys) = 0;
324a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0) = 0;
325a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        sendConfigEvent(int event, int param = 0);
3268fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    void        sendConfigEvent_l(int event, int param = 0);
327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        processConfigEvents();
32849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int         id() const { return mId;}
3298ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        standby() { return mStandby; }
330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3312c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        mutable     Mutex                   mLock;
3322c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class Track;
336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class TrackBase;
337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class PlaybackThread;
338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordThread;
342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordTrack;
343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mWaitWorkCV;
345a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    sp<AudioFlinger>        mAudioFlinger;
346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mSampleRate;
347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t                  mFrameCount;
348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mChannelCount;
349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mFormat;
350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mFrameSize;
351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mParamCond;
3528fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    Vector<String8>         mNewParameters;
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    status_t                mParamStatus;
354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Vector<ConfigEvent *>   mConfigEvents;
355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool                    mStandby;
35649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int                     mId;
35749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    bool                    mExiting;
358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // --- PlaybackThread ---
361a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread : public ThreadBase {
362a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
363a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        enum type {
365a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            MIXER,
366a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DIRECT,
367a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DUPLICATING
368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
370059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        enum mixer_state {
371059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_IDLE,
372059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_ENABLED,
373059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_READY
374059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        };
375059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Track : public TrackBase {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                Track(  const wp<ThreadBase>& thread,
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int streamType,
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~Track();
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        dump(char* buffer, size_t size);
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        pause();
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        flush();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        destroy();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        mute(bool);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        setVolume(float left, float right);
398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int name() const {
399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        return mName;
400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4024bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    int type() const {
4034bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                        return mStreamType;
4044bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    }
4054bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4064bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class AudioFlinger;
4102c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class TrackHandle;
4112c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
4122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
4132c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track(const Track&);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track& operator = (const Track&);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
419a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool isMuted() { return mMute; }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPausing() const {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSING;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPaused() const {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSED;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isReady() const;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void setPaused() { mState = PAUSED; }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            bool isOutputTrack() const {
43149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
43249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            }
43349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float               mVolume[2];
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile bool       mMute;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FILLED state is used for suppressing volume ramp at begin of playing
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mutable uint8_t     mFillingUpStatus;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int8_t              mRetryCount;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mSharedBuffer;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool                mResetDone;
4434bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent            int                 mStreamType;
444a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int                 mName;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };  // end of Track
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OutputTrack : public Track {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
451a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class Buffer: public AudioBufferProvider::Buffer {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int16_t *mBuffer;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                OutputTrack(  const wp<ThreadBase>& thread,
4588ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                                        DuplicatingThread *sourceThread,
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~OutputTrack();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        write(int16_t* data, uint32_t frames);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
469a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isActive() { return mActive; }
470a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>&     thread()  { return mThread; }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private:
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
474a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                clearBufferQueue();
476a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            // Maximum number of pending buffers allocated by OutputTrack::write()
4788ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            static const uint8_t kMaxOverFlowBuffers = 10;
479a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector < Buffer* >          mBufferQueue;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AudioBufferProvider::Buffer mOutBuffer;
482a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                        mActive;
4838ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            DuplicatingThread*          mSourceThread;
484a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };  // end of OutputTrack
485a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
48649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
487a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~PlaybackThread();
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    dump(int fd, const Vector<String16>& args);
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Thread virtuals
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    readyToRun();
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     void        onFirstRef();
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     uint32_t    latency() const;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterVolume(float value);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterMute(bool muted);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       masterVolume() const;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        masterMute() const;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamVolume(int stream, float value);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamMute(int stream, bool muted);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       streamVolume(int stream) const;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        streamMute(int stream) const;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isMusicActive() const;
510a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
511b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                    sp<Track>   createTrack_l(
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<AudioFlinger::Client>& client,
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int streamType,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate,
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int format,
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelCount,
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount,
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer,
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    status_t *status);
520a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
521a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    AudioStreamOut* getOutput() { return mOutput; }
522a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         type() const { return mType; }
524d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        suspend() { mSuspended++; }
525d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        restore() { if (mSuspended) mSuspended--; }
5268ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        isSuspended() { return (mSuspended != 0); }
527a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys);
528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0);
529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct  stream_type_t {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream_type_t()
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                :   volume(1.0f),
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mute(false)
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float       volume;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        mute;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5402c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent    protected:
5412c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mType;
5422c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int16_t*                        mMixBuffer;
543d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent        int                             mSuspended;
5442c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mBytesWritten;
5452c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mMasterMute;
5462c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        SortedVector< wp<Track> >       mActiveTracks;
5472c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
54862443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual int             getTrackName_l() = 0;
54962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual void            deleteTrackName_l(int name) = 0;
550059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        activeSleepTimeUs() = 0;
551059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        idleSleepTimeUs() = 0;
55262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class AudioFlinger;
5566c30a71122a6ef2189304c136f13a87727804b0aEric Laurent        friend class OutputTrack;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class Track;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class TrackBase;
559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread(const Client&);
564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread& operator = (const PlaybackThread&);
565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
566b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        status_t    addTrack_l(const sp<Track>& track);
567b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        void        destroyTrack_l(const sp<Track>& track);
56862443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        void        readOutputParameters();
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t    dumpTracks(int fd, const Vector<String16>& args);
573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector< sp<Track> >       mTracks;
575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioStreamOut*                 mOutput;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float                           mMasterVolume;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsecs_t                         mLastWriteTime;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumWrites;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumDelayedWrites;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                            mInWrite;
583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread : public PlaybackThread {
586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
58749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~MixerThread();
589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        getTracks(SortedVector < sp<Track> >& tracks,
594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks,
595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      int streamType);
596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        putTracks(SortedVector < sp<Track> >& tracks,
597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks);
598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
602059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
60362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     int         getTrackName_l();
60462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     void        deleteTrackName_l(int name);
605059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
606059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioMixer*                     mAudioMixer;
609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread : public PlaybackThread {
612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
61449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DirectOutputThread();
616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
617a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
618a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
619a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
62062443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     bool        checkForNewParameters_l();
62162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
62262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent    protected:
623a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
624a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
625059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
626059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
628a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
629a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mLeftVolume;
630a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mRightVolume;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
633a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DuplicatingThread : public MixerThread {
634a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
63549f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
636a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DuplicatingThread();
637a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
638a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        addOutputTrack(MixerThread* thread);
641a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        removeOutputTrack(MixerThread* thread);
6428ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
6438ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    protected:
6448ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
645a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
646a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
6478ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
6488ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    void        updateWaitTime();
6498ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent
650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        SortedVector < sp<OutputTrack> >  mOutputTracks;
6518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    mWaitTimeMs;
652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
654ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              PlaybackThread *checkPlaybackThread_l(int output) const;
655ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              MixerThread *checkMixerThread_l(int output) const;
656ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              RecordThread *checkRecordThread_l(int input) const;
657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
65849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent              void audioConfigChanged_l(int event, int ioHandle, void *param2);
659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class AudioBuffer;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle : public android::BnAudioTrack {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            TrackHandle(const sp<PlaybackThread::Track>& track);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~TrackHandle();
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        flush();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        mute(bool);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        pause();
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        setVolume(float left, float right);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<PlaybackThread::Track> mTrack;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Client;
680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread::Track;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
683b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent                void        removeClient_l(pid_t pid);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // record thread
687a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread : public ThreadBase, public AudioBufferProvider
688a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // record track
692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class RecordTrack : public TrackBase {
693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const wp<ThreadBase>& thread,
695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        const sp<Client>& client,
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t sampleRate,
697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int format,
698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int channelCount,
699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int frameCount,
700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t flags);
701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                ~RecordTrack();
702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t    start();
704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual void        stop();
705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
7093fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent                    void        dump(char* buffer, size_t size);
710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        private:
711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class AudioFlinger;
7122c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const RecordTrack&);
715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack& operator = (const RecordTrack&);
716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                mOverflow;
720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread(const sp<AudioFlinger>& audioFlinger,
724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        AudioStreamIn *input,
725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t sampleRate,
72649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        uint32_t channels,
72749f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        int id);
728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                ~RecordThread();
729a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        threadLoop();
731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    readyToRun() { return NO_ERROR; }
732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        onFirstRef();
733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    start(RecordTrack* recordTrack);
735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        stop(RecordTrack* recordTrack);
736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    dump(int fd, const Vector<String16>& args);
737a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn* getInput() { return mInput; }
738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        checkForNewParameters_l();
742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual String8     getParameters(const String8& keys);
743a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        audioConfigChanged(int event, int param = 0);
744a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        readInputParameters();
745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread();
748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn                       *mInput;
749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                sp<RecordTrack>                     mActiveTrack;
750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                Condition                           mStartStopCond;
751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioResampler                      *mResampler;
752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int32_t                             *mRsmpOutBuffer;
753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int16_t                             *mRsmpInBuffer;
754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mRsmpInIndex;
755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mInputBytes;
756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int                                 mReqChannelCount;
757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                uint32_t                            mReqSampleRate;
7589cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent                ssize_t                             mBytesRead;
759a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle : public android::BnAudioRecord {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
763a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~RecordHandle();
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
771a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<RecordThread::RecordTrack> mRecordTrack;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class RecordThread;
775a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
778b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    mutable     Mutex                               mLock;
779b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
782a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                mutable     Mutex                   mHardwareLock;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioHardwareInterface*             mAudioHardware;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable     int                                 mHardwareStatus;
785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
786a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
787ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
788a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
789a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                float                               mMasterVolume;
790a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                bool                                mMasterMute;
791a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
792ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
793a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
794a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                SortedVector< sp<IBinder> >         mNotificationClients;
795ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                int                                 mNextThreadId;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H
803