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