AudioFlinger.h revision 8ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baec
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>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3724651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian#include <binder/BinderService.h>
3824651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian#include <binder/MemoryDealer.h>
3924651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h"
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t;
4765b65459e6ac59f8a257009df8014467ae0838eeEric Laurentclass effect_param_cblk_t;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer;
50a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6324651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopianclass AudioFlinger :
6424651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian    public BinderService<AudioFlinger>,
6524651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian    public BnAudioFlinger
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6724651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian    friend class BinderService<AudioFlinger>;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
6924651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian    static char const* getServiceName() { return "media.audio_flinger"; }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    dump(int fd, const Vector<String16>& args);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // IAudioFlinger interface
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioTrack> createTrack(
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int streamType,
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const sp<IMemory>& sharedBuffer,
83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int output,
8465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                int *sessionId,
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    sampleRate(int output) const;
88ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         channelCount(int output) const;
89ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     int         format(int output) const;
90ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     size_t      frameCount(int output) const;
91ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     uint32_t    latency(int output) const;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterVolume(float value);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMasterMute(bool muted);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     float       masterVolume() const;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        masterMute() const;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setStreamVolume(int stream, float value, int output);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setStreamMute(int stream, bool muted);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
102ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     float       streamVolume(int stream, int output) const;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        streamMute(int stream) const;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMode(int mode);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    setMicMute(bool state);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool        getMicMute() const;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11023f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent    virtual     bool        isStreamActive(int stream) const;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
112ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs);
113ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual     String8     getParameters(int ioHandle, const String8& keys);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
11847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent    virtual     unsigned int  getInputFramesLost(int ioHandle);
119a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
120ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openOutput(uint32_t *pDevices,
121a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pSamplingRate,
122a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pFormat,
123a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pChannels,
124a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t *pLatencyMs,
125a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                    uint32_t flags);
126a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
127ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openDuplicateOutput(int output1, int output2);
128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
129ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeOutput(int output);
130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
131ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t suspendOutput(int output);
132a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t restoreOutput(int output);
134a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
135ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual int openInput(uint32_t *pDevices,
136a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pSamplingRate,
137a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pFormat,
138a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t *pChannels,
139a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            uint32_t acoustics);
140a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
141ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t closeInput(int input);
142a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
143ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent    virtual status_t setStreamOutput(uint32_t stream, int output);
144a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
145415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent    virtual status_t setVoiceVolume(float volume);
146415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent
1470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output);
1480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent
14965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual int newAudioSessionId();
15065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
15165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t loadEffectLibrary(const char *libPath, int *handle);
15265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
15365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t unloadEffectLibrary(int handle);
15465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
15565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t queryNumberEffects(uint32_t *numEffects);
15665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
15753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor);
15865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
15965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *descriptor);
16065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
16165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    virtual sp<IEffect> createEffect(pid_t pid,
16265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        effect_descriptor_t *pDesc,
16365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        const sp<IEffectClient>& effectClient,
16465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int32_t priority,
16565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int output,
16665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int sessionId,
16765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        status_t *status,
16865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int *id,
16965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int *enabled);
17065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
1718ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent    virtual status_t moveEffects(int session, int srcOutput, int dstOutput);
17253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum hardware_call_state {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_IDLE = 0,
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INIT,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_OPEN,
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_OUTPUT_CLOSE,
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_OPEN,
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_INPUT_CLOSE,
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_STANDBY,
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MASTER_VOLUME,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_ROUTING,
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_ROUTING,
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MODE,
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MODE,
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_GET_MIC_MUTE,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_HW_SET_MIC_MUTE,
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_VOICE_VOLUME,
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AUDIO_SET_PARAMETER,
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // record interface
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<IAudioRecord> openRecord(
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pid_t pid,
195ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                                int input,
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t sampleRate,
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int format,
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int channelCount,
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                int frameCount,
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags,
20165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                int *sessionId,
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                status_t *status);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     status_t    onTransact(
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t code,
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const Parcel& data,
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Parcel* reply,
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                uint32_t flags);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                uint32_t    getMode() { return mMode; }
21153334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            AudioFlinger();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual                 ~AudioFlinger();
215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Internal dump utilites.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpClients(int fd, const Vector<String16>& args);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t dumpInternals(int fd, const Vector<String16>& args);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // --- Client ---
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class Client : public RefBase {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~Client();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<MemoryDealer>&     heap() const;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               pid() const { return mPid; }
229b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent        sp<AudioFlinger>    audioFlinger() { return mAudioFlinger; }
230b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client(const Client&);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Client& operator = (const Client&);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<AudioFlinger>    mAudioFlinger;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<MemoryDealer>    mMemoryDealer;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pid_t               mPid;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2394f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent    // --- Notification Client ---
2404f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent    class NotificationClient : public IBinder::DeathRecipient {
2414f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent    public:
2424f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                            NotificationClient(const sp<AudioFlinger>& audioFlinger,
2434f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                                                const sp<IAudioFlingerClient>& client,
2444f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                                                pid_t pid);
2454f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent        virtual             ~NotificationClient();
2464f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent
2474f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                sp<IAudioFlingerClient>    client() { return mClient; }
2484f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent
2494f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                // IBinder::DeathRecipient
2504f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                virtual     void        binderDied(const wp<IBinder>& who);
2514f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent
2524f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent    private:
2534f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                            NotificationClient(const NotificationClient&);
2544f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                            NotificationClient& operator = (const NotificationClient&);
2554f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent
2564f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent        sp<AudioFlinger>        mAudioFlinger;
2574f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent        pid_t                   mPid;
2584f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent        sp<IAudioFlingerClient> mClient;
2594f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent    };
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle;
263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread;
264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread;
265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread;
266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread;
2678ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    class DuplicatingThread;
268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class Track;
269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordTrack;
27065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectModule;
27165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectHandle;
27265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectChain;
273a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
274a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class ThreadBase : public Thread {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
27649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
277a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~ThreadBase();
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2793fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent        status_t dumpBase(int fd, const Vector<String16>& args);
2803fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // base for record and playback
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class TrackBase : public AudioBufferProvider, public RefBase {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_state {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                IDLE,
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TERMINATED,
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STOPPED,
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                RESUMING,
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ACTIVE,
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSING,
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PAUSED
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum track_flags {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The upper 16 bits are used for track-specific flags.
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                TrackBase(const wp<ThreadBase>& thread,
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t flags,
30865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<IMemory>& sharedBuffer,
30965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~TrackBase();
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start() = 0;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop() = 0;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sp<IMemory> getCblk() const;
3156c30a71122a6ef2189304c136f13a87727804b0aEric Laurent                    audio_track_cblk_t* cblk() const { return mCblk; }
31665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int         sessionId() { return mSessionId; }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class RecordHandle;
3212c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
3222c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
3232c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
3242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase(const TrackBase&);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                TrackBase& operator = (const TrackBase&);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int format() const {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mFormat;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int channelCount() const ;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int sampleRate() const;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* getBuffer(uint32_t offset, uint32_t frames) const;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isStopped() const {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == STOPPED;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isTerminated() const {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == TERMINATED;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool step();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>      mThread;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<Client>          mClient;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mCblkMemory;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            audio_track_cblk_t* mCblk;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBuffer;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void*               mBufferEnd;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFrameCount;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mState;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int                 mClientTid;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint8_t             mFormat;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t            mFlags;
36565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int                 mSessionId;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class ConfigEvent {
369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            ConfigEvent() : mEvent(0), mParam(0) {}
371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
372a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mEvent;
373a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int mParam;
374a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
376a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t    sampleRate() const;
377a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         channelCount() const;
378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int         format() const;
379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t      frameCount() const;
380a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        exit();
382a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l() = 0;
383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    setParameters(const String8& keyValuePairs);
384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys) = 0;
385eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent        virtual     void        audioConfigChanged_l(int event, int param = 0) = 0;
386a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        sendConfigEvent(int event, int param = 0);
3878fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    void        sendConfigEvent_l(int event, int param = 0);
388a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        processConfigEvents();
38949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int         id() const { return mId;}
3908ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        standby() { return mStandby; }
391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
3922c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        mutable     Mutex                   mLock;
3932c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
395a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class Track;
397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class TrackBase;
398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class PlaybackThread;
399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordThread;
403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class RecordTrack;
404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mWaitWorkCV;
406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    sp<AudioFlinger>        mAudioFlinger;
407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    uint32_t                mSampleRate;
408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    size_t                  mFrameCount;
409b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent                    uint32_t                mChannels;
410b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent                    uint16_t                mChannelCount;
411b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent                    uint16_t                mFrameSize;
412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int                     mFormat;
413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Condition               mParamCond;
4148fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent                    Vector<String8>         mNewParameters;
415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    status_t                mParamStatus;
416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    Vector<ConfigEvent *>   mConfigEvents;
417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool                    mStandby;
41849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    int                     mId;
41949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                    bool                    mExiting;
420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
422a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // --- PlaybackThread ---
423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class PlaybackThread : public ThreadBase {
424a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        enum type {
427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            MIXER,
428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DIRECT,
429a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            DUPLICATING
430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
432059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        enum mixer_state {
433059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_IDLE,
434059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_ENABLED,
435059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent            MIXER_TRACKS_READY
436059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        };
437059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Track : public TrackBase {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
441a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                Track(  const wp<ThreadBase>& thread,
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        const sp<Client>& client,
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int streamType,
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount,
44865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<IMemory>& sharedBuffer,
44965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~Track();
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        dump(char* buffer, size_t size);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        pause();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        flush();
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        destroy();
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        mute(bool);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    void        setVolume(float left, float right);
461a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    int name() const {
462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        return mName;
463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4654bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    int type() const {
4664bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                        return mStreamType;
4674bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent                    }
46865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    status_t    attachAuxEffect(int EffectId);
46965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    void        setAuxBuffer(int EffectId, int32_t *buffer);
47065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int32_t     *auxBuffer() { return mAuxBuffer; }
47165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    void        setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; }
47265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int16_t     *mainBuffer() { return mMainBuffer; }
47365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int         auxEffectId() { return mAuxEffectId; }
4744bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4754bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected:
477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class ThreadBase;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class AudioFlinger;
4792c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class TrackHandle;
4802c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class PlaybackThread;
4812c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class MixerThread;
4822c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class DirectOutputThread;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track(const Track&);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Track& operator = (const Track&);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool isMuted() { return mMute; }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPausing() const {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSING;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isPaused() const {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mState == PAUSED;
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool isReady() const;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void setPaused() { mState = PAUSED; }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void reset();
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            bool isOutputTrack() const {
50049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
50149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent            }
50249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we don't really need a lock for these
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float               mVolume[2];
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile bool       mMute;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FILLED state is used for suppressing volume ramp at begin of playing
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mutable uint8_t     mFillingUpStatus;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int8_t              mRetryCount;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<IMemory>         mSharedBuffer;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool                mResetDone;
5124bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent            int                 mStreamType;
513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            int                 mName;
51465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int16_t             *mMainBuffer;
51565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int32_t             *mAuxBuffer;
51665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            int                 mAuxEffectId;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };  // end of Track
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OutputTrack : public Track {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
523a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class Buffer: public AudioBufferProvider::Buffer {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int16_t *mBuffer;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
528a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                OutputTrack(  const wp<ThreadBase>& thread,
5308ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                                        DuplicatingThread *sourceThread,
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~OutputTrack();
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
539a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        write(int16_t* data, uint32_t frames);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
541a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isActive() { return mActive; }
542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>&     thread()  { return mThread; }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private:
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
546a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                clearBufferQueue();
548a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            // Maximum number of pending buffers allocated by OutputTrack::write()
5508ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            static const uint8_t kMaxOverFlowBuffers = 10;
551a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector < Buffer* >          mBufferQueue;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AudioBufferProvider::Buffer mOutBuffer;
554a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                        mActive;
5558ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            DuplicatingThread*          mSourceThread;
556a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };  // end of OutputTrack
557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
55865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
559a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~PlaybackThread();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    dump(int fd, const Vector<String16>& args);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Thread virtuals
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    readyToRun();
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     void        onFirstRef();
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     uint32_t    latency() const;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterVolume(float value);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterMute(bool muted);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       masterVolume() const;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        masterMute() const;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamVolume(int stream, float value);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamMute(int stream, bool muted);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       streamVolume(int stream) const;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        streamMute(int stream) const;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58123f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent                    bool        isStreamActive(int stream) const;
582a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
583b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                    sp<Track>   createTrack_l(
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<AudioFlinger::Client>& client,
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int streamType,
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate,
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int format,
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelCount,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount,
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer,
59165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int sessionId,
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    status_t *status);
593a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    AudioStreamOut* getOutput() { return mOutput; }
595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         type() const { return mType; }
597d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        suspend() { mSuspended++; }
598d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        restore() { if (mSuspended) mSuspended--; }
5998ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        isSuspended() { return (mSuspended != 0); }
600a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys);
601eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent        virtual     void        audioConfigChanged_l(int event, int param = 0);
6020986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        virtual     status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
60365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int16_t     *mixBuffer() { return mMixBuffer; };
60465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
60565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectHandle> createEffect_l(
60665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<AudioFlinger::Client>& client,
60765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<IEffectClient>& effectClient,
60865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int32_t priority,
60965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId,
61065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        effect_descriptor_t *desc,
61165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int *enabled,
61265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        status_t *status);
61353334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                    void disconnectEffect(const sp< EffectModule>& effect,
61453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                                          const wp<EffectHandle>& handle);
61565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
61665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    bool hasAudioSession(int sessionId);
61765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectChain> getEffectChain(int sessionId);
61865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectChain> getEffectChain_l(int sessionId);
61965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    status_t addEffectChain_l(const sp<EffectChain>& chain);
62065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    size_t removeEffectChain_l(const sp<EffectChain>& chain);
6218ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void lockEffectChains_l(Vector<sp <EffectChain> >& effectChains);
6228ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void unlockEffectChains(Vector<sp <EffectChain> >& effectChains);
62365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
62465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId);
62565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    void detachAuxEffect_l(int effectId);
6268ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track,
6278ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                            int EffectId);
6288ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track,
6298ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                            int EffectId);
63053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                    void setMode(uint32_t mode);
631a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6328ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t addEffect_l(const sp< EffectModule>& effect);
6338ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void removeEffect_l(const sp< EffectModule>& effect);
6348ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
6358ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    uint32_t getStrategyForSession_l(int sessionId);
6368ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct  stream_type_t {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream_type_t()
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                :   volume(1.0f),
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mute(false)
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float       volume;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        mute;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6472c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent    protected:
6482c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mType;
6492c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int16_t*                        mMixBuffer;
650d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent        int                             mSuspended;
6512c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mBytesWritten;
6522c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mMasterMute;
6532c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        SortedVector< wp<Track> >       mActiveTracks;
6542c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
65562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual int             getTrackName_l() = 0;
65662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual void            deleteTrackName_l(int name) = 0;
657059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        activeSleepTimeUs() = 0;
658059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        idleSleepTimeUs() = 0;
65962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class AudioFlinger;
6636c30a71122a6ef2189304c136f13a87727804b0aEric Laurent        friend class OutputTrack;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class Track;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class TrackBase;
666a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
667a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
668a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
669a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
670a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread(const Client&);
671a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread& operator = (const PlaybackThread&);
672a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
673b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        status_t    addTrack_l(const sp<Track>& track);
674b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        void        destroyTrack_l(const sp<Track>& track);
67562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        void        readOutputParameters();
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t    device() { return mDevice; }
67965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t    dumpTracks(int fd, const Vector<String16>& args);
68265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t    dumpEffectChains(int fd, const Vector<String16>& args);
683a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector< sp<Track> >       mTracks;
685a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioStreamOut*                 mOutput;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float                           mMasterVolume;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsecs_t                         mLastWriteTime;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumWrites;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumDelayedWrites;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                            mInWrite;
69365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector< sp<EffectChain> >       mEffectChains;
69465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t                        mDevice;
695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
697a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread : public PlaybackThread {
698a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
6998ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        MixerThread (const sp<AudioFlinger>& audioFlinger,
7008ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     AudioStreamOut* output,
7018ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     int id,
7028ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     uint32_t device);
703a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~MixerThread();
704a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
708eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent                    void        invalidateTracks(int streamType);
709a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
710a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
711a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
712a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
7138ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks,
7148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                                                Vector< sp<Track> > *tracksToRemove);
71562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     int         getTrackName_l();
71662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     void        deleteTrackName_l(int name);
717059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
718059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioMixer*                     mAudioMixer;
721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
723a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread : public PlaybackThread {
724a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
725a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
72665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
727a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DirectOutputThread();
728a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
729a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
73262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     bool        checkForNewParameters_l();
73362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
73462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent    protected:
735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
737059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
738059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
74165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp);
74265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
74365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        float mLeftVolFloat;
74465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        float mRightVolFloat;
74565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint16_t mLeftVolShort;
74665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint16_t mRightVolShort;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DuplicatingThread : public MixerThread {
750a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
75149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DuplicatingThread();
753a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
754a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
755a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
756a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        addOutputTrack(MixerThread* thread);
757a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        removeOutputTrack(MixerThread* thread);
7588ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
7598ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    protected:
7608ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
761a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
7638ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
7648ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    void        updateWaitTime();
7658ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent
766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        SortedVector < sp<OutputTrack> >  mOutputTracks;
7678ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    mWaitTimeMs;
768a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
769a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
770ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              PlaybackThread *checkPlaybackThread_l(int output) const;
771ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              MixerThread *checkMixerThread_l(int output) const;
772ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              RecordThread *checkRecordThread_l(int input) const;
773a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
77449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent              void audioConfigChanged_l(int event, int ioHandle, void *param2);
775a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
77665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent              int  nextUniqueId();
7778ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent              status_t moveEffectChain_l(int session,
7788ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                                     AudioFlinger::PlaybackThread *srcThread,
7798ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                                     AudioFlinger::PlaybackThread *dstThread);
78065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class AudioBuffer;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle : public android::BnAudioTrack {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            TrackHandle(const sp<PlaybackThread::Track>& track);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~TrackHandle();
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        flush();
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        mute(bool);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        pause();
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        setVolume(float left, float right);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
79465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t    attachAuxEffect(int effectId);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
798a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<PlaybackThread::Track> mTrack;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Client;
802a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread::Track;
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
805b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent                void        removeClient_l(pid_t pid);
8064f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                void        removeNotificationClient(pid_t pid);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // record thread
810a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread : public ThreadBase, public AudioBufferProvider
811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
812a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
813a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
814a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // record track
815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class RecordTrack : public TrackBase {
816a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
817a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const wp<ThreadBase>& thread,
818a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        const sp<Client>& client,
819a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t sampleRate,
820a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int format,
821a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int channelCount,
822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int frameCount,
82365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        uint32_t flags,
82465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId);
825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                ~RecordTrack();
826a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
827a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t    start();
828a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual void        stop();
829a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
830a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
831a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
832a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
8333fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent                    void        dump(char* buffer, size_t size);
834a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        private:
835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class AudioFlinger;
8362c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
837a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const RecordTrack&);
839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack& operator = (const RecordTrack&);
840a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                mOverflow;
844a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
846a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread(const sp<AudioFlinger>& audioFlinger,
848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        AudioStreamIn *input,
849a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t sampleRate,
85049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        uint32_t channels,
85149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        int id);
852a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                ~RecordThread();
853a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
854a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        threadLoop();
855a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    readyToRun() { return NO_ERROR; }
856a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        onFirstRef();
857a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
858a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    start(RecordTrack* recordTrack);
859a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        stop(RecordTrack* recordTrack);
860a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    dump(int fd, const Vector<String16>& args);
861a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn* getInput() { return mInput; }
862a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
863a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
864a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        checkForNewParameters_l();
866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual String8     getParameters(const String8& keys);
867eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent        virtual void        audioConfigChanged_l(int event, int param = 0);
868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        readInputParameters();
86947d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        virtual unsigned int  getInputFramesLost();
870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread();
873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn                       *mInput;
874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                sp<RecordTrack>                     mActiveTrack;
875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                Condition                           mStartStopCond;
876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioResampler                      *mResampler;
877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int32_t                             *mRsmpOutBuffer;
878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int16_t                             *mRsmpInBuffer;
879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mRsmpInIndex;
880a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mInputBytes;
881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int                                 mReqChannelCount;
882a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                uint32_t                            mReqSampleRate;
8839cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent                ssize_t                             mBytesRead;
884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle : public android::BnAudioRecord {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~RecordHandle();
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
896a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<RecordThread::RecordTrack> mRecordTrack;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    //--- Audio Effect Management
90065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
90165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // EffectModule and EffectChain classes both have their own mutex to protect
90265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // state changes or resource modifications. Always respect the following order
90365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // if multiple mutexes must be acquired to avoid cross deadlock:
90465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule
90565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
90665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectModule class is a wrapper object controlling the effect engine implementation
90765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // in the effect library. It prevents concurrent calls to process() and command() functions
90865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // from different client threads. It keeps a list of EffectHandle objects corresponding
90965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // to all client applications using this effect and notifies applications of effect state,
91065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // control or parameter changes. It manages the activation state machine to send appropriate
91165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // reset, enable, disable commands to effect engine and provide volume
91265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // ramping when effects are activated/deactivated.
91365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by
91465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // the attached track(s) to accumulate their auxiliary channel.
91565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectModule: public RefBase {
91665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
91765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule(const wp<ThreadBase>& wThread,
91865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        const wp<AudioFlinger::EffectChain>& chain,
91965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        effect_descriptor_t *desc,
92065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int id,
92165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int sessionId);
92265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        ~EffectModule();
92365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
92465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        enum effect_state {
92565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            IDLE,
9267d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent            RESTART,
92765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STARTING,
92865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            ACTIVE,
92965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STOPPING,
93065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STOPPED
93165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        };
93265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
93365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int         id() { return mId; }
93465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void process();
9357d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        void updateState();
93665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t command(int cmdCode, int cmdSize, void *pCmdData, int *replySize, void *pReplyData);
93765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
938df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        void reset_l();
93965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t configure();
94065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t init();
94165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t state() {
94265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mState;
94365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
94465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t status() {
94565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mStatus;
94665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
9478ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        int sessionId() {
9488ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            return mSessionId;
9498ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        }
95065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t    setEnabled(bool enabled);
95165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool isEnabled();
95265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
95365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void        setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; }
95465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t     *inBuffer() { return mConfig.inputCfg.buffer.s16; }
95565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void        setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; }
95665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t     *outBuffer() { return mConfig.outputCfg.buffer.s16; }
9578ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void        setChain(const wp<EffectChain>& chain) { mChain = chain; }
9588ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void        setThread(const wp<ThreadBase>& thread) { mThread = thread; }
95965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
96065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t addHandle(sp<EffectHandle>& handle);
96165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void disconnect(const wp<EffectHandle>& handle);
96265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        size_t removeHandle (const wp<EffectHandle>& handle);
96365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
96465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_descriptor_t& desc() { return mDescriptor; }
96553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        wp<EffectChain>&     chain() { return mChain; }
96665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
96765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         setDevice(uint32_t device);
96865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         setVolume(uint32_t *left, uint32_t *right, bool controller);
96953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        status_t         setMode(uint32_t mode);
97065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
97165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         dump(int fd, const Vector<String16>& args);
97265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
97365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
97465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
9757d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        // Maximum time allocated to effect engines to complete the turn off sequence
9767d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        static const uint32_t MAX_DISABLE_TIME_MS = 10000;
9777d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent
97865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule(const EffectModule&);
97965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule& operator = (const EffectModule&);
98065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
981df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        status_t start_l();
982df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        status_t stop_l();
98365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
98453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified
98553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static const uint32_t sDeviceConvTable[];
98653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static uint32_t deviceAudioSystemToEffectApi(uint32_t device);
98753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
98853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified
98953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static const uint32_t sModeConvTable[];
99053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static int modeAudioSystemToEffectApi(uint32_t mode);
99153334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
99265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Mutex               mLock;      // mutex for process, commands and handles list protection
99365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<ThreadBase>      mThread;    // parent thread
99465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<EffectChain>     mChain;     // parent effect chain
99565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int                 mId;        // this instance unique ID
99665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int                 mSessionId; // audio session ID
99765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_descriptor_t mDescriptor;// effect descriptor received from effect engine
99865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_config_t     mConfig;    // input and output audio configuration
99965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_interface_t  mEffectInterface; // Effect module C API
100065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t mStatus;               // initialization status
100165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t mState;                // current activation state (effect_state)
100265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector< wp<EffectHandle> > mHandles;    // list of client handles
10037d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        uint32_t mMaxDisableWaitCnt;    // maximum grace period before forcing an effect off after
10047d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent                                        // sending disable command.
10057d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        uint32_t mDisableWaitCnt;       // current process() calls count during disable period.
100665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
100765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
100865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectHandle class implements the IEffect interface. It provides resources
100965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // to receive parameter updates, keeps track of effect control
101065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // ownership and state and has a pointer to the EffectModule object it is controlling.
101165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // There is one EffectHandle object for each application controlling (or using)
101265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // an effect module.
101365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectHandle is obtained by calling AudioFlinger::createEffect().
101465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectHandle: public android::BnEffect {
101565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
101665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
101765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle(const sp<EffectModule>& effect,
101865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                const sp<AudioFlinger::Client>& client,
101965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                const sp<IEffectClient>& effectClient,
102065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                int32_t priority);
102165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual ~EffectHandle();
102265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
102365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // IEffect
102465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t enable();
102565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t disable();
102665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t command(int cmdCode, int cmdSize, void *pCmdData, int *replySize, void *pReplyData);
102765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual void disconnect();
102865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual sp<IMemory> getCblk() const;
102965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t onTransact(uint32_t code, const Parcel& data,
103065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                Parcel* reply, uint32_t flags);
103165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
103265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
103365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // Give or take control of effect module
103465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setControl(bool hasControl, bool signal);
103565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void commandExecuted(int cmdCode, int cmdSize, void *pCmdData, int replySize, void *pReplyData);
103665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setEnabled(bool enabled);
103765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
103865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // Getters
103965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int id() { return mEffect->id(); }
104065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int priority() { return mPriority; }
104165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool hasControl() { return mHasControl; }
104265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<EffectModule> effect() { return mEffect; }
104365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
104465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void dump(char* buffer, size_t size);
104565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
104665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
104765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
104865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle(const EffectHandle&);
104965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle& operator =(const EffectHandle&);
105065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
105165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<EffectModule> mEffect;           // pointer to controlled EffectModule
105265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<IEffectClient> mEffectClient;    // callback interface for client notifications
105365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<Client>          mClient;        // client for shared memory allocation
105465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<IMemory>         mCblkMemory;    // shared memory for control block
105565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_param_cblk_t* mCblk;         // control block for deferred parameter setting via shared memory
105665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint8_t*            mBuffer;        // pointer to parameter area in shared memory
105765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mPriority;                      // client application priority to control the effect
105865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool mHasControl;                   // true if this handle is controlling the effect
105965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
106065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
106165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // the EffectChain class represents a group of effects associated to one audio session.
106265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // There can be any number of EffectChain objects per output mixer thread (PlaybackThread).
106365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffecChain with session ID 0 contains global effects applied to the output mix.
106465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks)
106565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding
106665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // in the effect process order. When attached to a track (session ID != 0), it also provide it's own
106765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // input buffer used by the track as accumulation buffer.
106865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectChain: public RefBase {
106965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
107065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain(const wp<ThreadBase>& wThread, int sessionId);
107165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        ~EffectChain();
107265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void process_l();
107465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void lock() {
107665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mLock.lock();
107765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
107865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void unlock() {
107965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mLock.unlock();
108065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
108165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
10828ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        status_t addEffect_l(const sp<EffectModule>& handle);
108376c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        size_t removeEffect_l(const sp<EffectModule>& handle);
108465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
108565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int sessionId() {
108665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mSessionId;
108765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
10888ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
108976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor);
109076c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        sp<EffectModule> getEffectFromId_l(int id);
109176c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        bool setVolume_l(uint32_t *left, uint32_t *right);
109276c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        void setDevice_l(uint32_t device);
109376c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        void setMode_l(uint32_t mode);
109453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
109565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setInBuffer(int16_t *buffer, bool ownsBuffer = false) {
109665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mInBuffer = buffer;
109765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mOwnInBuffer = ownsBuffer;
109865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
109965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *inBuffer() {
110065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mInBuffer;
110165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
110265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setOutBuffer(int16_t *buffer) {
110365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mOutBuffer = buffer;
110465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
110565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *outBuffer() {
110665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mOutBuffer;
110765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
110865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
110965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void startTrack() {mActiveTrackCnt++;}
111065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void stopTrack() {mActiveTrackCnt--;}
111165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int activeTracks() { return mActiveTrackCnt;}
111265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
11138ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        uint32_t strategy() { return mStrategy; }
11148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void setStrategy(uint32_t strategy)
11158ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                 { mStrategy = strategy; }
11168ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
111765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t dump(int fd, const Vector<String16>& args);
111865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
111965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
112065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
112165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain(const EffectChain&);
112265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain& operator =(const EffectChain&);
112365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
112465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<ThreadBase> mThread;     // parent mixer thread
112565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Mutex mLock;                // mutex protecting effect list
112665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector<sp<EffectModule> > mEffects; // list of effect modules
112765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mSessionId;             // audio session ID
112865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *mInBuffer;         // chain input buffer
112965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *mOutBuffer;        // chain output buffer
113065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mActiveTrackCnt;        // number of active tracks connected
113165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool mOwnInBuffer;          // true if the chain owns its input buffer
113276c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        int mVolumeCtrlIdx;         // index of insert effect having control over volume
113376c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        uint32_t mLeftVolume;       // previous volume on left channel
113476c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        uint32_t mRightVolume;      // previous volume on right channel
11350d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent        uint32_t mNewLeftVolume;       // new volume on left channel
11360d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent        uint32_t mNewRightVolume;      // new volume on right channel
11378ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        uint32_t mStrategy; // strategy for this effect chain
113865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
113965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
1140a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class RecordThread;
1141a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1144b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    mutable     Mutex                               mLock;
1145b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1148a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                mutable     Mutex                   mHardwareLock;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioHardwareInterface*             mAudioHardware;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable     int                                 mHardwareStatus;
1151a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1152a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1153ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
1154a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
1155a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                float                               mMasterVolume;
1156a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                bool                                mMasterMute;
1157a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1158ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
1159a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
11604f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
116165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                volatile int32_t                    mNextUniqueId;
11624f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#ifdef LVMX
11634f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                int mLifeVibesClientPid;
11644f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#endif
116553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                uint32_t mMode;
116653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H
1174