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;
517a92ebfa1cd96dc91174f68baab820dbed8239e4bEric Laurent            bool                mHasVolumeController;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };  // end of Track
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // playback track
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OutputTrack : public Track {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public:
524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class Buffer: public AudioBufferProvider::Buffer {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int16_t *mBuffer;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                OutputTrack(  const wp<ThreadBase>& thread,
5318ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                                        DuplicatingThread *sourceThread,
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t sampleRate,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int format,
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int channelCount,
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        int frameCount);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~OutputTrack();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual status_t    start();
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            virtual void        stop();
540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        write(int16_t* data, uint32_t frames);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        isActive() { return mActive; }
543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            wp<ThreadBase>&     thread()  { return mThread; }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private:
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                clearBufferQueue();
549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            // Maximum number of pending buffers allocated by OutputTrack::write()
5518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            static const uint8_t kMaxOverFlowBuffers = 10;
552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector < Buffer* >          mBufferQueue;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AudioBufferProvider::Buffer mOutBuffer;
555a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                        mActive;
5568ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent            DuplicatingThread*          mSourceThread;
557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };  // end of OutputTrack
558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
55965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~PlaybackThread();
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    dump(int fd, const Vector<String16>& args);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Thread virtuals
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    readyToRun();
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     void        onFirstRef();
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     uint32_t    latency() const;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterVolume(float value);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setMasterMute(bool muted);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       masterVolume() const;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        masterMute() const;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamVolume(int stream, float value);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     status_t    setStreamMute(int stream, bool muted);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     float       streamVolume(int stream) const;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual     bool        streamMute(int stream) const;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58223f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent                    bool        isStreamActive(int stream) const;
583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
584b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                    sp<Track>   createTrack_l(
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<AudioFlinger::Client>& client,
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int streamType,
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t sampleRate,
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int format,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int channelCount,
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int frameCount,
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const sp<IMemory>& sharedBuffer,
59265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                    int sessionId,
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    status_t *status);
594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    AudioStreamOut* getOutput() { return mOutput; }
596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         type() const { return mType; }
598d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        suspend() { mSuspended++; }
599d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent                    void        restore() { if (mSuspended) mSuspended--; }
6008ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        isSuspended() { return (mSuspended != 0); }
601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     String8     getParameters(const String8& keys);
602eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent        virtual     void        audioConfigChanged_l(int event, int param = 0);
6030986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent        virtual     status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
60465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    int16_t     *mixBuffer() { return mMixBuffer; };
60565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
60665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectHandle> createEffect_l(
60765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<AudioFlinger::Client>& client,
60865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        const sp<IEffectClient>& effectClient,
60965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int32_t priority,
61065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId,
61165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        effect_descriptor_t *desc,
61265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int *enabled,
61365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        status_t *status);
61453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                    void disconnectEffect(const sp< EffectModule>& effect,
61553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                                          const wp<EffectHandle>& handle);
61665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
617493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                    // return values for hasAudioSession (bit field)
618493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                    enum effect_state {
619493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                        EFFECT_SESSION = 0x1,   // the audio session corresponds to at least one
620493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                                                // effect
621493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                        TRACK_SESSION = 0x2     // the audio session corresponds to at least one
622493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                                                // track
623493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                    };
624493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent
625493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                    uint32_t hasAudioSession(int sessionId);
62665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectChain> getEffectChain(int sessionId);
62765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<EffectChain> getEffectChain_l(int sessionId);
62865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    status_t addEffectChain_l(const sp<EffectChain>& chain);
62965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    size_t removeEffectChain_l(const sp<EffectChain>& chain);
6308ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void lockEffectChains_l(Vector<sp <EffectChain> >& effectChains);
6318ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void unlockEffectChains(Vector<sp <EffectChain> >& effectChains);
63265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
63365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId);
63465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                    void detachAuxEffect_l(int effectId);
6358ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track,
6368ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                            int EffectId);
6378ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track,
6388ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                            int EffectId);
63953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                    void setMode(uint32_t mode);
640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    status_t addEffect_l(const sp< EffectModule>& effect);
6428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    void removeEffect_l(const sp< EffectModule>& effect);
6438ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
6448ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    uint32_t getStrategyForSession_l(int sessionId);
6458ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct  stream_type_t {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream_type_t()
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                :   volume(1.0f),
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mute(false)
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float       volume;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        mute;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6562c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent    protected:
6572c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mType;
6582c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int16_t*                        mMixBuffer;
659d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent        int                             mSuspended;
6602c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        int                             mBytesWritten;
6612c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        bool                            mMasterMute;
6622c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent        SortedVector< wp<Track> >       mActiveTracks;
6632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent
66462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual int             getTrackName_l() = 0;
66562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual void            deleteTrackName_l(int name) = 0;
666059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        activeSleepTimeUs() = 0;
667059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual uint32_t        idleSleepTimeUs() = 0;
6688448a79767b7dfc53a12502661cba89774733c10Eric Laurent        virtual uint32_t        suspendSleepTimeUs() = 0;
66962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class AudioFlinger;
6736c30a71122a6ef2189304c136f13a87727804b0aEric Laurent        friend class OutputTrack;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class Track;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        friend class TrackBase;
676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class MixerThread;
677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DirectOutputThread;
678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        friend class DuplicatingThread;
679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread(const Client&);
681a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        PlaybackThread& operator = (const PlaybackThread&);
682a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
683b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        status_t    addTrack_l(const sp<Track>& track);
684b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        void        destroyTrack_l(const sp<Track>& track);
68562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        void        readOutputParameters();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t    device() { return mDevice; }
68965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t    dumpTracks(int fd, const Vector<String16>& args);
69265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t    dumpEffectChains(int fd, const Vector<String16>& args);
693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SortedVector< sp<Track> >       mTracks;
695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioStreamOut*                 mOutput;
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float                           mMasterVolume;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsecs_t                         mLastWriteTime;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumWrites;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int                             mNumDelayedWrites;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bool                            mInWrite;
70365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector< sp<EffectChain> >       mEffectChains;
70465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t                        mDevice;
705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class MixerThread : public PlaybackThread {
708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
7098ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        MixerThread (const sp<AudioFlinger>& audioFlinger,
7108ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     AudioStreamOut* output,
7118ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     int id,
7128ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                     uint32_t device);
713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual             ~MixerThread();
714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
718eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent                    void        invalidateTracks(int streamType);
719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        checkForNewParameters_l();
720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    protected:
7238ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks,
7248ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                                                Vector< sp<Track> > *tracksToRemove);
72562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     int         getTrackName_l();
72662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     void        deleteTrackName_l(int name);
727059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
728059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
7298448a79767b7dfc53a12502661cba89774733c10Eric Laurent        virtual     uint32_t    suspendSleepTimeUs();
730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        AudioMixer*                     mAudioMixer;
732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DirectOutputThread : public PlaybackThread {
735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
73765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DirectOutputThread();
739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
74362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent        virtual     bool        checkForNewParameters_l();
74462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent
74562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent    protected:
746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     int         getTrackName_l();
747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     void        deleteTrackName_l(int name);
748059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
749059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent        virtual     uint32_t    idleSleepTimeUs();
7508448a79767b7dfc53a12502661cba89774733c10Eric Laurent        virtual     uint32_t    suspendSleepTimeUs();
751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
75365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp);
75465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
75565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        float mLeftVolFloat;
75665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        float mRightVolFloat;
75765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint16_t mLeftVolShort;
75865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint16_t mRightVolShort;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
761a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class DuplicatingThread : public MixerThread {
762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
76349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
764a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        ~DuplicatingThread();
765a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // Thread virtuals
767a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual     bool        threadLoop();
768a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        addOutputTrack(MixerThread* thread);
769a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    void        removeOutputTrack(MixerThread* thread);
7708ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
7718ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent    protected:
7728ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent        virtual     uint32_t    activeSleepTimeUs();
773a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
7758ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
7768ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    void        updateWaitTime();
7778ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent
778a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        SortedVector < sp<OutputTrack> >  mOutputTracks;
7798ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent                    uint32_t    mWaitTimeMs;
780a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
781a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
782ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              PlaybackThread *checkPlaybackThread_l(int output) const;
783ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              MixerThread *checkMixerThread_l(int output) const;
784ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent              RecordThread *checkRecordThread_l(int input) const;
785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
78649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent              void audioConfigChanged_l(int event, int ioHandle, void *param2);
787a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
78865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent              int  nextUniqueId();
7898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent              status_t moveEffectChain_l(int session,
7908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                                     AudioFlinger::PlaybackThread *srcThread,
791493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                                     AudioFlinger::PlaybackThread *dstThread,
792493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent                                     bool reRegister);
79365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class AudioBuffer;
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class TrackHandle : public android::BnAudioTrack {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
798a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                            TrackHandle(const sp<PlaybackThread::Track>& track);
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~TrackHandle();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        flush();
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        mute(bool);
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        pause();
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        setVolume(float left, float right);
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
80765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t    attachAuxEffect(int effectId);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<PlaybackThread::Track> mTrack;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class Client;
815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread::Track;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
818b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent                void        removeClient_l(pid_t pid);
8194f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                void        removeNotificationClient(pid_t pid);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    // record thread
823a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    class RecordThread : public ThreadBase, public AudioBufferProvider
824a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    {
825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    public:
826a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
827a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        // record track
828a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        class RecordTrack : public TrackBase {
829a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        public:
830a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const wp<ThreadBase>& thread,
831a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        const sp<Client>& client,
832a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        uint32_t sampleRate,
833a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int format,
834a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int channelCount,
835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                        int frameCount,
83665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        uint32_t flags,
83765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                                        int sessionId);
838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                ~RecordTrack();
839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
840a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t    start();
841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual void        stop();
842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
844a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
8463fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent                    void        dump(char* buffer, size_t size);
847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        private:
848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            friend class AudioFlinger;
8492c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent            friend class RecordThread;
850a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
851a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack(const RecordTrack&);
852a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                                RecordTrack& operator = (const RecordTrack&);
853a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
854a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
855a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
856a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent            bool                mOverflow;
857a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        };
858a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
859a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
860a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread(const sp<AudioFlinger>& audioFlinger,
861a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        AudioStreamIn *input,
862a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                        uint32_t sampleRate,
86349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        uint32_t channels,
86449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent                        int id);
865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                ~RecordThread();
866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        threadLoop();
868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    readyToRun() { return NO_ERROR; }
869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        onFirstRef();
870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    start(RecordTrack* recordTrack);
872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        stop(RecordTrack* recordTrack);
873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                status_t    dump(int fd, const Vector<String16>& args);
874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn* getInput() { return mInput; }
875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual bool        checkForNewParameters_l();
879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        virtual String8     getParameters(const String8& keys);
880eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent        virtual void        audioConfigChanged_l(int event, int param = 0);
881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                void        readInputParameters();
88247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent        virtual unsigned int  getInputFramesLost();
883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    private:
885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                RecordThread();
886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioStreamIn                       *mInput;
887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                sp<RecordTrack>                     mActiveTrack;
888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                Condition                           mStartStopCond;
889a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                AudioResampler                      *mResampler;
890a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int32_t                             *mRsmpOutBuffer;
891a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int16_t                             *mRsmpInBuffer;
892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mRsmpInIndex;
893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                size_t                              mInputBytes;
894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                int                                 mReqChannelCount;
895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                uint32_t                            mReqSampleRate;
8969cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent                ssize_t                             mBytesRead;
897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    };
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class RecordHandle : public android::BnAudioRecord {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
901a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual             ~RecordHandle();
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t    start();
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual void        stop();
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual sp<IMemory> getCblk() const;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual status_t onTransact(
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent        sp<RecordThread::RecordTrack> mRecordTrack;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    //--- Audio Effect Management
91365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
91465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // EffectModule and EffectChain classes both have their own mutex to protect
91565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // state changes or resource modifications. Always respect the following order
91665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // if multiple mutexes must be acquired to avoid cross deadlock:
91765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule
91865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
91965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectModule class is a wrapper object controlling the effect engine implementation
92065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // in the effect library. It prevents concurrent calls to process() and command() functions
92165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // from different client threads. It keeps a list of EffectHandle objects corresponding
92265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // to all client applications using this effect and notifies applications of effect state,
92365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // control or parameter changes. It manages the activation state machine to send appropriate
92465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // reset, enable, disable commands to effect engine and provide volume
92565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // ramping when effects are activated/deactivated.
92665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by
92765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // the attached track(s) to accumulate their auxiliary channel.
92865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectModule: public RefBase {
92965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
93065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule(const wp<ThreadBase>& wThread,
93165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        const wp<AudioFlinger::EffectChain>& chain,
93265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        effect_descriptor_t *desc,
93365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int id,
93465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                        int sessionId);
93565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        ~EffectModule();
93665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
93765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        enum effect_state {
93865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            IDLE,
9397d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent            RESTART,
94065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STARTING,
94165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            ACTIVE,
94265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STOPPING,
94365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            STOPPED
94465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        };
94565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
94665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int         id() { return mId; }
94765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void process();
9487d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        void updateState();
949a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent        status_t command(uint32_t cmdCode,
950a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                         uint32_t cmdSize,
951a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                         void *pCmdData,
952a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                         uint32_t *replySize,
953a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                         void *pReplyData);
95465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
955df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        void reset_l();
95665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t configure();
95765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t init();
95865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t state() {
95965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mState;
96065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
96165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t status() {
96265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mStatus;
96365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
9648ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        int sessionId() {
9658ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent            return mSessionId;
9668ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        }
96765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t    setEnabled(bool enabled);
96865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool isEnabled();
969a92ebfa1cd96dc91174f68baab820dbed8239e4bEric Laurent        bool isProcessEnabled();
97065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
97165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void        setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; }
97265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t     *inBuffer() { return mConfig.inputCfg.buffer.s16; }
97365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void        setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; }
97465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t     *outBuffer() { return mConfig.outputCfg.buffer.s16; }
9758ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void        setChain(const wp<EffectChain>& chain) { mChain = chain; }
9768ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void        setThread(const wp<ThreadBase>& thread) { mThread = thread; }
97765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
97865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t addHandle(sp<EffectHandle>& handle);
97965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void disconnect(const wp<EffectHandle>& handle);
98065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        size_t removeHandle (const wp<EffectHandle>& handle);
98165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
98265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_descriptor_t& desc() { return mDescriptor; }
98353334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        wp<EffectChain>&     chain() { return mChain; }
98465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
98565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         setDevice(uint32_t device);
98665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         setVolume(uint32_t *left, uint32_t *right, bool controller);
98753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        status_t         setMode(uint32_t mode);
98865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
98965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t         dump(int fd, const Vector<String16>& args);
99065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
99165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
99265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
9937d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        // Maximum time allocated to effect engines to complete the turn off sequence
9947d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        static const uint32_t MAX_DISABLE_TIME_MS = 10000;
9957d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent
99665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule(const EffectModule&);
99765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectModule& operator = (const EffectModule&);
99865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
999df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        status_t start_l();
1000df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent        status_t stop_l();
100165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
100253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified
100353334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static const uint32_t sDeviceConvTable[];
100453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static uint32_t deviceAudioSystemToEffectApi(uint32_t device);
100553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
100653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified
100753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static const uint32_t sModeConvTable[];
100853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent        static int modeAudioSystemToEffectApi(uint32_t mode);
100953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
101065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Mutex               mLock;      // mutex for process, commands and handles list protection
101165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<ThreadBase>      mThread;    // parent thread
101265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<EffectChain>     mChain;     // parent effect chain
101365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int                 mId;        // this instance unique ID
101465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int                 mSessionId; // audio session ID
101565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_descriptor_t mDescriptor;// effect descriptor received from effect engine
101665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_config_t     mConfig;    // input and output audio configuration
101765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_interface_t  mEffectInterface; // Effect module C API
101865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t mStatus;               // initialization status
101965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint32_t mState;                // current activation state (effect_state)
102065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector< wp<EffectHandle> > mHandles;    // list of client handles
10217d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        uint32_t mMaxDisableWaitCnt;    // maximum grace period before forcing an effect off after
10227d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent                                        // sending disable command.
10237d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent        uint32_t mDisableWaitCnt;       // current process() calls count during disable period.
102465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
102565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
102665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectHandle class implements the IEffect interface. It provides resources
102765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // to receive parameter updates, keeps track of effect control
102865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // ownership and state and has a pointer to the EffectModule object it is controlling.
102965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // There is one EffectHandle object for each application controlling (or using)
103065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // an effect module.
103165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffectHandle is obtained by calling AudioFlinger::createEffect().
103265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectHandle: public android::BnEffect {
103365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
103465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
103565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle(const sp<EffectModule>& effect,
103665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                const sp<AudioFlinger::Client>& client,
103765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                const sp<IEffectClient>& effectClient,
103865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                int32_t priority);
103965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual ~EffectHandle();
104065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
104165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // IEffect
104265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t enable();
104365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t disable();
1044a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent        virtual status_t command(uint32_t cmdCode,
1045a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                 uint32_t cmdSize,
1046a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                 void *pCmdData,
1047a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                 uint32_t *replySize,
1048a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                                 void *pReplyData);
104965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual void disconnect();
105065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual sp<IMemory> getCblk() const;
105165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        virtual status_t onTransact(uint32_t code, const Parcel& data,
105265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                Parcel* reply, uint32_t flags);
105365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
105465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
105565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // Give or take control of effect module
105665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setControl(bool hasControl, bool signal);
1057a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent        void commandExecuted(uint32_t cmdCode,
1058a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                             uint32_t cmdSize,
1059a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                             void *pCmdData,
1060a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                             uint32_t replySize,
1061a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent                             void *pReplyData);
106265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setEnabled(bool enabled);
106365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
106465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        // Getters
106565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int id() { return mEffect->id(); }
106665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int priority() { return mPriority; }
106765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool hasControl() { return mHasControl; }
106865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<EffectModule> effect() { return mEffect; }
106965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void dump(char* buffer, size_t size);
107165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
107365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle(const EffectHandle&);
107565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectHandle& operator =(const EffectHandle&);
107665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
107765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<EffectModule> mEffect;           // pointer to controlled EffectModule
107865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<IEffectClient> mEffectClient;    // callback interface for client notifications
107965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<Client>          mClient;        // client for shared memory allocation
108065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        sp<IMemory>         mCblkMemory;    // shared memory for control block
108165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        effect_param_cblk_t* mCblk;         // control block for deferred parameter setting via shared memory
108265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        uint8_t*            mBuffer;        // pointer to parameter area in shared memory
108365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mPriority;                      // client application priority to control the effect
108465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool mHasControl;                   // true if this handle is controlling the effect
108565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
108665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
108765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // the EffectChain class represents a group of effects associated to one audio session.
108865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // There can be any number of EffectChain objects per output mixer thread (PlaybackThread).
108965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // The EffecChain with session ID 0 contains global effects applied to the output mix.
109065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks)
109165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding
109265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // in the effect process order. When attached to a track (session ID != 0), it also provide it's own
109365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    // input buffer used by the track as accumulation buffer.
109465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    class EffectChain: public RefBase {
109565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    public:
109665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain(const wp<ThreadBase>& wThread, int sessionId);
109765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        ~EffectChain();
109865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
109965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void process_l();
110065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
110165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void lock() {
110265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mLock.lock();
110365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
110465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void unlock() {
110565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mLock.unlock();
110665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
110765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
11088ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        status_t addEffect_l(const sp<EffectModule>& handle);
110976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        size_t removeEffect_l(const sp<EffectModule>& handle);
111065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
111165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int sessionId() {
111265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mSessionId;
111365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
11148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
111576c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor);
111676c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        sp<EffectModule> getEffectFromId_l(int id);
111776c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        bool setVolume_l(uint32_t *left, uint32_t *right);
111876c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        void setDevice_l(uint32_t device);
111976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        void setMode_l(uint32_t mode);
112053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
112165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setInBuffer(int16_t *buffer, bool ownsBuffer = false) {
112265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mInBuffer = buffer;
112365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mOwnInBuffer = ownsBuffer;
112465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
112565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *inBuffer() {
112665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mInBuffer;
112765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
112865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void setOutBuffer(int16_t *buffer) {
112965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            mOutBuffer = buffer;
113065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
113165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *outBuffer() {
113265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent            return mOutBuffer;
113365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        }
113465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
113565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void startTrack() {mActiveTrackCnt++;}
113665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        void stopTrack() {mActiveTrackCnt--;}
113765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int activeTracks() { return mActiveTrackCnt;}
113865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
11398ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        uint32_t strategy() { return mStrategy; }
11408ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        void setStrategy(uint32_t strategy)
11418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent                 { mStrategy = strategy; }
11428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent
114365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        status_t dump(int fd, const Vector<String16>& args);
114465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
114565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    protected:
114665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
114765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain(const EffectChain&);
114865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        EffectChain& operator =(const EffectChain&);
114965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
115065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        wp<ThreadBase> mThread;     // parent mixer thread
115165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Mutex mLock;                // mutex protecting effect list
115265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        Vector<sp<EffectModule> > mEffects; // list of effect modules
115365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mSessionId;             // audio session ID
115465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *mInBuffer;         // chain input buffer
115565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int16_t *mOutBuffer;        // chain output buffer
115665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        int mActiveTrackCnt;        // number of active tracks connected
115765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent        bool mOwnInBuffer;          // true if the chain owns its input buffer
115876c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        int mVolumeCtrlIdx;         // index of insert effect having control over volume
115976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        uint32_t mLeftVolume;       // previous volume on left channel
116076c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent        uint32_t mRightVolume;      // previous volume on right channel
11610d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent        uint32_t mNewLeftVolume;       // new volume on left channel
11620d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent        uint32_t mNewRightVolume;      // new volume on right channel
11638ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent        uint32_t mStrategy; // strategy for this effect chain
116465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent    };
116565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent
1166a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class RecordThread;
1167a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent    friend class PlaybackThread;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1170b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    mutable     Mutex                               mLock;
1171b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1174a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                mutable     Mutex                   mHardwareLock;
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                AudioHardwareInterface*             mAudioHardware;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable     int                                 mHardwareStatus;
1177a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1179ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
1180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
1181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                float                               mMasterVolume;
1182a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent                bool                                mMasterMute;
1183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
1184ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
1185a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent
11864f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
118765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent                volatile int32_t                    mNextUniqueId;
11884f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#ifdef LVMX
11894f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent                int mLifeVibesClientPid;
11904f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#endif
119153334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent                uint32_t mMode;
119253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H
1200