AudioFlinger.h revision 8fce46a2b3e93879ae372cf07232451736c5ea7e
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>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlingerClient.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/MemoryDealer.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h"
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer;
46a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void instantiate();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    dump(int fd, const Vector<String16>& args);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IAudioFlinger interface
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int streamType,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
76ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int output,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
79ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    sampleRate(int output) const;
80ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         channelCount(int output) const;
81ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         format(int output) const;
82ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     size_t      frameCount(int output) const;
83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    latency(int output) const;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterVolume(float value);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterMute(bool muted);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     float       masterVolume() const;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        masterMute() const;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setStreamVolume(int stream, float value, int output);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setStreamMute(int stream, bool muted);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     float       streamVolume(int stream, int output) const;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        streamMute(int stream) const;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMode(int mode);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMicMute(bool state);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        getMicMute() const;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        isMusicActive() const;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs);
105ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     String8     getParameters(int ioHandle, const String8& keys);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
108a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
110a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
111ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openOutput(uint32_t *pDevices,
112a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pSamplingRate,
113a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pFormat,
114a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pChannels,
115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pLatencyMs,
116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t flags);
117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
118ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openDuplicateOutput(int output1, int output2);
119a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
120ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeOutput(int output);
121a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
122ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t suspendOutput(int output);
123a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
124ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t restoreOutput(int output);
125a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
126ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openInput(uint32_t *pDevices,
127a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pSamplingRate,
128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pFormat,
129a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pChannels,
130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t acoustics);
131a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
132ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeInput(int input);
133a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
134ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output);
135a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IBinder::DeathRecipient
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        binderDied(const wp<IBinder>& who);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum hardware_call_state {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_IDLE = 0,
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INIT,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_OPEN,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_CLOSE,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_OPEN,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_CLOSE,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_STANDBY,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MASTER_VOLUME,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_ROUTING,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_ROUTING,
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MODE,
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MODE,
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MIC_MUTE,
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MIC_MUTE,
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_VOICE_VOLUME,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_PARAMETER,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // record interface
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
161ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    onTransact(
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t code,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const Parcel& data,
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcel* reply,
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AudioFlinger();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual                 ~AudioFlinger();
178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internal dump utilites.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpClients(int fd, const Vector<String16>& args);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpInternals(int fd, const Vector<String16>& args);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // --- Client ---
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client : public RefBase {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~Client();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<MemoryDealer>&     heap() const;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               pid() const { return mPid; }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const Client&);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client& operator = (const Client&);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AudioFlinger>    mAudioFlinger;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryDealer>    mMemoryDealer;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               mPid;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle;
203a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread;
204a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread;
205a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread;
206a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread;
207a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class Track;
208a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordTrack;
209a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
210a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class ThreadBase : public Thread {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
212a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ThreadBase (const sp<AudioFlinger>& audioFlinger);
213a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~ThreadBase();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // base for record and playback
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class TrackBase : public AudioBufferProvider, public RefBase {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_state {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IDLE,
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TERMINATED,
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STOPPED,
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                RESUMING,
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ACTIVE,
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSING,
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSED
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_flags {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The upper 16 bits are used for track-specific flags.
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
235a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                TrackBase(const wp<ThreadBase>& thread,
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t flags,
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~TrackBase();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start() = 0;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop() = 0;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<IMemory> getCblk() const;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class RecordHandle;
2522c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
2532c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
2542c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
2552c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase(const TrackBase&);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase& operator = (const TrackBase&);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_track_cblk_t* cblk() const {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mCblk;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format() const {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mFormat;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount() const ;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sampleRate() const;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* getBuffer(uint32_t offset, uint32_t frames) const;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isStopped() const {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == STOPPED;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isTerminated() const {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == TERMINATED;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool step();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
288a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>      mThread;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<Client>          mClient;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mCblkMemory;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_track_cblk_t* mCblk;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBuffer;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBufferEnd;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFrameCount;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mState;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mClientTid;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t             mFormat;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFlags;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
302a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class ConfigEvent {
303a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
304a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            ConfigEvent() : mEvent(0), mParam(0) {}
305a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
306a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mEvent;
307a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mParam;
308a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
309a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
310a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t    sampleRate() const;
311a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         channelCount() const;
312a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         format() const;
313a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t      frameCount() const;
314a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
315a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        exit();
316a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l() = 0;
317a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    setParameters(const String8& keyValuePairs);
318a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys) = 0;
319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0) = 0;
320a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        sendConfigEvent(int event, int param = 0);
3218fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    void        sendConfigEvent_l(int event, int param = 0);
322a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        processConfigEvents();
323a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        mutable     Mutex                   mLock;
3252c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
326a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
327a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
328a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class Track;
329a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class TrackBase;
330a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class PlaybackThread;
331a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
332a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
333a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
334a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordThread;
335a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordTrack;
336a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
337a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mWaitWorkCV;
338a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    sp<AudioFlinger>        mAudioFlinger;
339a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mSampleRate;
340a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t                  mFrameCount;
341a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mChannelCount;
342a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mFormat;
343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mFrameSize;
344a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mParamCond;
3458fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    Vector<String8>         mNewParameters;
346a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    status_t                mParamStatus;
347a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Vector<ConfigEvent *>   mConfigEvents;
348a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool                    mStandby;
349a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
350a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
351a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // --- PlaybackThread ---
352a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread : public ThreadBase {
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
354a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
355a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        enum type {
356a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            MIXER,
357a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DIRECT,
358a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DUPLICATING
359a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
360a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Track : public TrackBase {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
364a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                Track(  const wp<ThreadBase>& thread,
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int streamType,
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<IMemory>& sharedBuffer);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~Track();
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        dump(char* buffer, size_t size);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        pause();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        flush();
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        destroy();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        mute(bool);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        setVolume(float left, float right);
383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int name() const {
384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        return mName;
385a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3874bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    int type() const {
3884bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                        return mStreamType;
3894bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    }
3904bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
3914bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
393a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class AudioFlinger;
3952c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class TrackHandle;
3962c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
3972c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
3982c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track(const Track&);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track& operator = (const Track&);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool isMuted() { return mMute; }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPausing() const {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSING;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPaused() const {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSED;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isReady() const;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void setPaused() { mState = PAUSED; }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float               mVolume[2];
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile bool       mMute;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FILLED state is used for suppressing volume ramp at begin of playing
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mutable uint8_t     mFillingUpStatus;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int8_t              mRetryCount;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mSharedBuffer;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool                mResetDone;
4244bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent            int                 mStreamType;
425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int                 mName;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };  // end of Track
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OutputTrack : public Track {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
432a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class Buffer: public AudioBufferProvider::Buffer {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int16_t *mBuffer;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
437a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
438a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                OutputTrack(  const wp<ThreadBase>& thread,
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~OutputTrack();
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
447a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        write(int16_t* data, uint32_t frames);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
449a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isActive() { return mActive; }
450a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>&     thread()  { return mThread; }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private:
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
454a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                clearBufferQueue();
456a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
457a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            // Maximum number of pending buffers allocated by OutputTrack::write()
458a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            static const uint8_t kMaxOverFlowBuffers = 3;
459a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector < Buffer* >          mBufferQueue;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AudioBufferProvider::Buffer mOutBuffer;
462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            uint32_t                    mWaitTimeMs;
463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                        mActive;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
465a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };  // end of OutputTrack
466a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
467a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
468a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~PlaybackThread();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    dump(int fd, const Vector<String16>& args);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Thread virtuals
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    readyToRun();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     void        onFirstRef();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     uint32_t    latency() const;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterVolume(float value);
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterMute(bool muted);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       masterVolume() const;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        masterMute() const;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamVolume(int stream, float value);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamMute(int stream, bool muted);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       streamVolume(int stream) const;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        streamMute(int stream) const;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
490a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isMusicActive() const;
491a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
492b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                    sp<Track>   createTrack_l(
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<AudioFlinger::Client>& client,
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int streamType,
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate,
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int format,
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelCount,
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount,
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer,
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    status_t *status);
501a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
502a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    AudioStreamOut* getOutput() { return mOutput; }
503a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
504a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         type() const { return mType; }
505a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        suspend() { mSuspended = true; }
506a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        restore() { mSuspended = false; }
507a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys);
508a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        audioConfigChanged(int event, int param = 0);
509a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct  stream_type_t {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream_type_t()
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                :   volume(1.0f),
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mute(false)
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float       volume;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        mute;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5202c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent    protected:
5212c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mType;
5222c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int16_t*                        mMixBuffer;
5232c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mSuspended;
5242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mBytesWritten;
5252c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mMasterMute;
5262c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        SortedVector< wp<Track> >       mActiveTracks;
5272c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class AudioFlinger;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class Track;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class TrackBase;
533a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
534a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
535a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
536a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
537a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread(const Client&);
538a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread& operator = (const PlaybackThread&);
539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
540b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        status_t    addTrack_l(const sp<Track>& track);
541b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        void        destroyTrack_l(const sp<Track>& track);
542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual int         getTrackName_l() = 0;
543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        deleteTrackName_l(int name) = 0;
544a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        void        readOutputParameters();
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t    dumpTracks(int fd, const Vector<String16>& args);
548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector< sp<Track> >       mTracks;
550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioStreamOut*                 mOutput;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float                           mMasterVolume;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsecs_t                         mLastWriteTime;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumWrites;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumDelayedWrites;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                            mInWrite;
558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        int                             mMinBytesToWrite;
559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
561a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread : public PlaybackThread {
562a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
563a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
564a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~MixerThread();
565a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
566a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
567a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
568a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
569a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        getTracks(SortedVector < sp<Track> >& tracks,
570a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks,
571a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      int streamType);
572a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        putTracks(SortedVector < sp<Track> >& tracks,
573a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                      SortedVector < wp<Track> >& activeTracks);
574a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
575a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
576a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
577a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
578a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
579a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
580a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        size_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
581a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioMixer*                     mAudioMixer;
583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
584a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
585a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread : public PlaybackThread {
586a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
587a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
588a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output);
589a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DirectOutputThread();
590a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
591a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
592a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
598a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
599a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mLeftVolume;
600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        float mRightVolume;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
603a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DuplicatingThread : public MixerThread {
604a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
605a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread);
606a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DuplicatingThread();
607a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
608a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
609a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
610a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        addOutputTrack(MixerThread* thread);
611a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        removeOutputTrack(MixerThread* thread);
612a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
613a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
614a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        SortedVector < sp<OutputTrack> >  mOutputTracks;
615a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
616a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
617ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              PlaybackThread *checkPlaybackThread_l(int output) const;
618ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              MixerThread *checkMixerThread_l(int output) const;
619ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              RecordThread *checkRecordThread_l(int input) const;
620a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
621ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              void audioConfigChanged(int event, const sp<ThreadBase>& thread, void *param2);
622a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class AudioBuffer;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle : public android::BnAudioTrack {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
627a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            TrackHandle(const sp<PlaybackThread::Track>& track);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~TrackHandle();
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        flush();
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        mute(bool);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        pause();
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        setVolume(float left, float right);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
639a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<PlaybackThread::Track> mTrack;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Client;
643a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread::Track;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void        removeClient(pid_t pid);
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // record thread
650a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread : public ThreadBase, public AudioBufferProvider
651a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
652a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
653a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
654a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // record track
655a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class RecordTrack : public TrackBase {
656a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
657a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const wp<ThreadBase>& thread,
658a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        const sp<Client>& client,
659a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t sampleRate,
660a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int format,
661a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int channelCount,
662a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int frameCount,
663a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t flags);
664a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                ~RecordTrack();
665a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
666a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t    start();
667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual void        stop();
668a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
669a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
670a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        private:
673a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class AudioFlinger;
6742c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
675a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const RecordTrack&);
677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack& operator = (const RecordTrack&);
678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
681a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                mOverflow;
682a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
684a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
685a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread(const sp<AudioFlinger>& audioFlinger,
686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        AudioStreamIn *input,
687a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t sampleRate,
688a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t channels);
689a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                ~RecordThread();
690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
691a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        threadLoop();
692a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    readyToRun() { return NO_ERROR; }
693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        onFirstRef();
694a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    start(RecordTrack* recordTrack);
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        stop(RecordTrack* recordTrack);
697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    dump(int fd, const Vector<String16>& args);
698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn* getInput() { return mInput; }
699a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
700a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
701a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
702a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        checkForNewParameters_l();
703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual String8     getParameters(const String8& keys);
704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        audioConfigChanged(int event, int param = 0);
705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        readInputParameters();
706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread();
709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn                       *mInput;
710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                sp<RecordTrack>                     mActiveTrack;
711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                Condition                           mStartStopCond;
712a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioResampler                      *mResampler;
713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int32_t                             *mRsmpOutBuffer;
714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int16_t                             *mRsmpInBuffer;
715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mRsmpInIndex;
716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mInputBytes;
717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int                                 mReqChannelCount;
718a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                uint32_t                            mReqSampleRate;
719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle : public android::BnAudioRecord {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~RecordHandle();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<RecordThread::RecordTrack> mRecordTrack;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class RecordThread;
735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
738b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    mutable     Mutex                               mLock;
739b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                mutable     Mutex                   mHardwareLock;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioHardwareInterface*             mAudioHardware;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable     int                                 mHardwareStatus;
745a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
747ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
748a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                float                               mMasterVolume;
750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                bool                                mMasterMute;
751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
752ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                SortedVector< sp<IBinder> >         mNotificationClients;
755ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                int                                 mNextThreadId;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H
763