19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/include/server/AudioFlinger/AudioFlinger.h 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIO_FLINGER_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_FLINGER_H 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 238ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent#include <limits.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlingerClient.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioTrack.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SortedVector.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3724651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian#include <binder/BinderService.h> 3824651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian#include <binder/MemoryDealer.h> 3924651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <hardware_legacy/AudioHardwareInterface.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h" 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass audio_track_cblk_t; 4765b65459e6ac59f8a257009df8014467ae0838eeEric Laurentclass effect_param_cblk_t; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioMixer; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioBuffer; 50a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurentclass AudioResampler; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const nsecs_t kStandbyTimeInNsecs = seconds(3); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6324651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopianclass AudioFlinger : 6424651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian public BinderService<AudioFlinger>, 6524651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian public BnAudioFlinger 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6724651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian friend class BinderService<AudioFlinger>; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 6924651682edaf71e8a826f23a7ea09bc97c8072c4Mathias Agopian static char const* getServiceName() { return "media.audio_flinger"; } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IAudioFlinger interface 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioTrack> createTrack( 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 83ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int output, 8465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *sessionId, 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 87ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t sampleRate(int output) const; 88ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int channelCount(int output) const; 89ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int format(int output) const; 90ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual size_t frameCount(int output) const; 91ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual uint32_t latency(int output) const; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamVolume(int stream, float value, int output); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 102ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual float streamVolume(int stream, int output) const; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMode(int mode); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMicMute(bool state); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool getMicMute() const; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11023f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent virtual bool isStreamActive(int stream) const; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 112ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setParameters(int ioHandle, const String8& keyValuePairs); 113ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual String8 getParameters(int ioHandle, const String8& keys); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void registerClient(const sp<IAudioFlingerClient>& client); 116a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); 11847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent virtual unsigned int getInputFramesLost(int ioHandle); 119a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 120ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openOutput(uint32_t *pDevices, 121a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 122a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 123a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 124a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pLatencyMs, 125a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t flags); 126a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 127ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openDuplicateOutput(int output1, int output2); 128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 129ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeOutput(int output); 130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 131ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t suspendOutput(int output); 132a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 133ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t restoreOutput(int output); 134a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 135ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual int openInput(uint32_t *pDevices, 136a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pSamplingRate, 137a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pFormat, 138a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t *pChannels, 139a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t acoustics); 140a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 141ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t closeInput(int input); 142a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 143ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent virtual status_t setStreamOutput(uint32_t stream, int output); 144a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 145415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent virtual status_t setVoiceVolume(float volume); 146415f3e2875b8b0b860d0dd6a69ff6868571c36bbEric Laurent 1470986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output); 1480986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent 14965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual int newAudioSessionId(); 15065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 15165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t loadEffectLibrary(const char *libPath, int *handle); 15265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 15365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t unloadEffectLibrary(int handle); 15465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 15565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t queryNumberEffects(uint32_t *numEffects); 15665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 15753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor); 15865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 15965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *descriptor); 16065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 16165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual sp<IEffect> createEffect(pid_t pid, 16265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t *pDesc, 16365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IEffectClient>& effectClient, 16465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t priority, 16565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int output, 16665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId, 16765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t *status, 16865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *id, 16965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *enabled); 17065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 1718ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent virtual status_t moveEffects(int session, int srcOutput, int dstOutput); 17253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum hardware_call_state { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_IDLE = 0, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INIT, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_OPEN, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_OUTPUT_CLOSE, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_OPEN, 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_INPUT_CLOSE, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_STANDBY, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MASTER_VOLUME, 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_ROUTING, 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_ROUTING, 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MODE, 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MODE, 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_GET_MIC_MUTE, 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_HW_SET_MIC_MUTE, 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_VOICE_VOLUME, 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AUDIO_SET_PARAMETER, 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // record interface 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IAudioRecord> openRecord( 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid, 195ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent int input, 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 20165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *sessionId, 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Parcel& data, 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply, 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent uint32_t getMode() { return mMode; } 21153334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioFlinger(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AudioFlinger(); 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internal dump utilites. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpClients(int fd, const Vector<String16>& args); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpInternals(int fd, const Vector<String16>& args); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // --- Client --- 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Client : public RefBase { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~Client(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<MemoryDealer>& heap() const; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t pid() const { return mPid; } 229b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent sp<AudioFlinger> audioFlinger() { return mAudioFlinger; } 230b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client(const Client&); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Client& operator = (const Client&); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AudioFlinger> mAudioFlinger; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MemoryDealer> mMemoryDealer; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid_t mPid; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2394f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent // --- Notification Client --- 2404f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent class NotificationClient : public IBinder::DeathRecipient { 2414f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent public: 2424f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent NotificationClient(const sp<AudioFlinger>& audioFlinger, 2434f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent const sp<IAudioFlingerClient>& client, 2444f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent pid_t pid); 2454f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent virtual ~NotificationClient(); 2464f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent 2474f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent sp<IAudioFlingerClient> client() { return mClient; } 2484f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent 2494f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent // IBinder::DeathRecipient 2504f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent virtual void binderDied(const wp<IBinder>& who); 2514f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent 2524f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent private: 2534f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent NotificationClient(const NotificationClient&); 2544f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent NotificationClient& operator = (const NotificationClient&); 2554f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent 2564f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent sp<AudioFlinger> mAudioFlinger; 2574f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent pid_t mPid; 2584f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent sp<IAudioFlingerClient> mClient; 2594f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent }; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle; 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread; 264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread; 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread; 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread; 2678ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent class DuplicatingThread; 268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class Track; 269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack; 27065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectModule; 27165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectHandle; 27265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectChain; 273a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 274a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ThreadBase : public Thread { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 27649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent ThreadBase (const sp<AudioFlinger>& audioFlinger, int id); 277a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~ThreadBase(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2793fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent status_t dumpBase(int fd, const Vector<String16>& args); 2803fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // base for record and playback 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackBase : public AudioBufferProvider, public RefBase { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_state { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IDLE, 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TERMINATED, 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED, 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RESUMING, 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ACTIVE, 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSING, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSED 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum track_flags { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SYSTEM_FLAGS_MASK = 0x0000ffffUL, 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The upper 16 bits are used for track-specific flags. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 301a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackBase(const wp<ThreadBase>& thread, 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags, 30865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IMemory>& sharedBuffer, 30965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~TrackBase(); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start() = 0; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop() = 0; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> getCblk() const; 3156c30a71122a6ef2189304c136f13a87727804b0aEric Laurent audio_track_cblk_t* cblk() const { return mCblk; } 31665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId() { return mSessionId; } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 319a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class RecordHandle; 3212c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 3222c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 3232c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 3242c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase(const TrackBase&); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TrackBase& operator = (const TrackBase&); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormat; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const ; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleRate() const; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* getBuffer(uint32_t offset, uint32_t frames) const; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isStopped() const { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == STOPPED; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isTerminated() const { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == TERMINATED; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool step(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 353a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase> mThread; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Client> mClient; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBuffer; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mBufferEnd; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mState; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mClientTid; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFlags; 36565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mSessionId; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 368a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class ConfigEvent { 369a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 370a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ConfigEvent() : mEvent(0), mParam(0) {} 371a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 372a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mEvent; 373a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mParam; 374a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 375a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 376a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate() const; 377a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount() const; 378a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format() const; 379a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t frameCount() const; 380a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void wakeUp() { mWaitWorkCV.broadcast(); } 381a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void exit(); 382a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l() = 0; 383a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t setParameters(const String8& keyValuePairs); 384a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys) = 0; 385eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent virtual void audioConfigChanged_l(int event, int param = 0) = 0; 386a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void sendConfigEvent(int event, int param = 0); 3878fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent void sendConfigEvent_l(int event, int param = 0); 388a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void processConfigEvents(); 38949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id() const { return mId;} 3908ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool standby() { return mStandby; } 391a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 3922c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent mutable Mutex mLock; 3932c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 394a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 395a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 396a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class Track; 397a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class TrackBase; 398a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 399a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 400a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 401a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 402a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 403a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordTrack; 404a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 405a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mWaitWorkCV; 406a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<AudioFlinger> mAudioFlinger; 407a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mSampleRate; 408a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mFrameCount; 409b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent uint32_t mChannels; 410b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent uint16_t mChannelCount; 411b0a0147f344a2d26d86be2b1bdf5bfde50ef86c2Eric Laurent uint16_t mFrameSize; 412a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mFormat; 413a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mParamCond; 4148fce46a2b3e93879ae372cf07232451736c5ea7eEric Laurent Vector<String8> mNewParameters; 415a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t mParamStatus; 416a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Vector<ConfigEvent *> mConfigEvents; 417a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mStandby; 41849f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int mId; 41949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool mExiting; 420a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 421a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 422a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // --- PlaybackThread --- 423a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class PlaybackThread : public ThreadBase { 424a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 425a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 426a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent enum type { 427a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent MIXER, 428a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DIRECT, 429a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent DUPLICATING 430a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 431a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 432059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent enum mixer_state { 433059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_IDLE, 434059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_ENABLED, 435059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent MIXER_TRACKS_READY 436059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent }; 437059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Track : public TrackBase { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 441a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Track( const wp<ThreadBase>& thread, 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<Client>& client, 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 44865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IMemory>& sharedBuffer, 44965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~Track(); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(char* buffer, size_t size); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void pause(); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void flush(); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void destroy(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mute(bool); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVolume(float left, float right); 461a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int name() const { 462a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent return mName; 463a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4654bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int type() const { 4664bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent return mStreamType; 4674bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent } 46865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t attachAuxEffect(int EffectId); 46965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setAuxBuffer(int EffectId, int32_t *buffer); 47065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t *auxBuffer() { return mAuxBuffer; } 47165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; } 47265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *mainBuffer() { return mMainBuffer; } 47365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int auxEffectId() { return mAuxEffectId; } 4744bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4754bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 477a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class ThreadBase; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 4792c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class TrackHandle; 4802c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class PlaybackThread; 4812c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class MixerThread; 4822c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class DirectOutputThread; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track(const Track&); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Track& operator = (const Track&); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 488a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isMuted() { return mMute; } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPausing() const { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSING; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isPaused() const { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mState == PAUSED; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isReady() const; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setPaused() { mState = PAUSED; } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void reset(); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49949f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent bool isOutputTrack() const { 50049f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent return (mStreamType == AudioSystem::NUM_STREAM_TYPES); 50149f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent } 50249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't really need a lock for these 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mVolume[2]; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile bool mMute; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FILLED state is used for suppressing volume ramp at begin of playing 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable uint8_t mFillingUpStatus; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t mRetryCount; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mSharedBuffer; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mResetDone; 5124bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int mStreamType; 513a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mName; 51465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *mMainBuffer; 51565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t *mAuxBuffer; 51665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mAuxEffectId; 517a92ebfa1cd96dc91174f68baab820dbed8239e4bEric Laurent bool mHasVolumeController; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; // end of Track 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // playback track 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class OutputTrack : public Track { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 524a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer: public AudioBufferProvider::Buffer { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *mBuffer; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 529a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 530a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent OutputTrack( const wp<ThreadBase>& thread, 5318ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread *sourceThread, 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~OutputTrack(); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 540a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool write(int16_t* data, uint32_t frames); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; } 542a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool isActive() { return mActive; } 543a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent wp<ThreadBase>& thread() { return mThread; } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 547a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearBufferQueue(); 549a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 550a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Maximum number of pending buffers allocated by OutputTrack::write() 5518ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent static const uint8_t kMaxOverFlowBuffers = 10; 552a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector < Buffer* > mBufferQueue; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider::Buffer mOutBuffer; 555a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mActive; 5568ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent DuplicatingThread* mSourceThread; 557a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; // end of OutputTrack 558a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 55965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device); 560a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~PlaybackThread(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Thread virtuals 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun(); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef(); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual uint32_t latency() const; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterVolume(float value); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setMasterMute(bool muted); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float masterVolume() const; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool masterMute() const; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamVolume(int stream, float value); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t setStreamMute(int stream, bool muted); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual float streamVolume(int stream) const; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool streamMute(int stream) const; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58223f25cda0c73f8eb878844dea32fb0bd419edca2Eric Laurent bool isStreamActive(int stream) const; 583a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 584b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sp<Track> createTrack_l( 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<AudioFlinger::Client>& client, 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int streamType, 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format, 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount, 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount, 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const sp<IMemory>& sharedBuffer, 59265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId, 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t *status); 594a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 595a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamOut* getOutput() { return mOutput; } 596a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 597a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int type() const { return mType; } 598d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void suspend() { mSuspended++; } 599d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent void restore() { if (mSuspended) mSuspended--; } 6008ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool isSuspended() { return (mSuspended != 0); } 601a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 602eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent virtual void audioConfigChanged_l(int event, int param = 0); 6030986e7907ffc8387b04fb201e285784bcd11b9b7Eric Laurent virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames); 60465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *mixBuffer() { return mMixBuffer; }; 60565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 60665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<EffectHandle> createEffect_l( 60765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<AudioFlinger::Client>& client, 60865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IEffectClient>& effectClient, 60965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t priority, 61065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId, 61165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t *desc, 61265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int *enabled, 61365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t *status); 61453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent void disconnectEffect(const sp< EffectModule>& effect, 61553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent const wp<EffectHandle>& handle); 61665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 617493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent // return values for hasAudioSession (bit field) 618493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent enum effect_state { 619493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent EFFECT_SESSION = 0x1, // the audio session corresponds to at least one 620493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent // effect 621493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent TRACK_SESSION = 0x2 // the audio session corresponds to at least one 622493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent // track 623493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent }; 624493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent 625493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent uint32_t hasAudioSession(int sessionId); 62665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<EffectChain> getEffectChain(int sessionId); 62765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<EffectChain> getEffectChain_l(int sessionId); 62865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t addEffectChain_l(const sp<EffectChain>& chain); 62965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent size_t removeEffectChain_l(const sp<EffectChain>& chain); 6308ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void lockEffectChains_l(Vector<sp <EffectChain> >& effectChains); 6318ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void unlockEffectChains(Vector<sp <EffectChain> >& effectChains); 63265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 63365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId); 63465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void detachAuxEffect_l(int effectId); 6358ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track, 6368ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int EffectId); 6378ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track, 6388ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int EffectId); 63953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent void setMode(uint32_t mode); 640a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent status_t addEffect_l(const sp< EffectModule>& effect); 6428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void removeEffect_l(const sp< EffectModule>& effect); 6438ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6448ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t getStrategyForSession_l(int sessionId); 6458ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct stream_type_t { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream_type_t() 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : volume(1.0f), 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mute(false) 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float volume; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mute; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6562c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent protected: 6572c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mType; 6582c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int16_t* mMixBuffer; 659d5603c126acdd94d9f7400bb1d04188020a425b4Eric Laurent int mSuspended; 6602c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent int mBytesWritten; 6612c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent bool mMasterMute; 6622c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent SortedVector< wp<Track> > mActiveTracks; 6632c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent 66462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l() = 0; 66562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name) = 0; 666059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs() = 0; 667059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs() = 0; 6688448a79767b7dfc53a12502661cba89774733c10Eric Laurent virtual uint32_t suspendSleepTimeUs() = 0; 66962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioFlinger; 6736c30a71122a6ef2189304c136f13a87727804b0aEric Laurent friend class OutputTrack; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Track; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class TrackBase; 676a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class MixerThread; 677a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DirectOutputThread; 678a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class DuplicatingThread; 679a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 680a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread(const Client&); 681a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread& operator = (const PlaybackThread&); 682a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 683b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project status_t addTrack_l(const sp<Track>& track); 684b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void destroyTrack_l(const sp<Track>& track); 68562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 686a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readOutputParameters(); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t device() { return mDevice; } 68965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 690a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t dumpTracks(int fd, const Vector<String16>& args); 69265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t dumpEffectChains(int fd, const Vector<String16>& args); 693a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector< sp<Track> > mTracks; 695a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread 696a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1]; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioStreamOut* mOutput; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float mMasterVolume; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t mLastWriteTime; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumWrites; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mNumDelayedWrites; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mInWrite; 70365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Vector< sp<EffectChain> > mEffectChains; 70465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t mDevice; 705a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 706a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 707a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class MixerThread : public PlaybackThread { 708a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 7098ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent MixerThread (const sp<AudioFlinger>& audioFlinger, 7108ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent AudioStreamOut* output, 7118ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int id, 7128ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t device); 713a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual ~MixerThread(); 714a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 715a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 716a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 717a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 718eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent void invalidateTracks(int streamType); 719a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 720a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t dumpInternals(int fd, const Vector<String16>& args); 721a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 722a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent protected: 7238ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, 7248ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent Vector< sp<Track> > *tracksToRemove); 72562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual int getTrackName_l(); 72662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual void deleteTrackName_l(int name); 727059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 728059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 7298448a79767b7dfc53a12502661cba89774733c10Eric Laurent virtual uint32_t suspendSleepTimeUs(); 730a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 731a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioMixer* mAudioMixer; 732a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 733a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 734a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DirectOutputThread : public PlaybackThread { 735a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 736a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 73765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device); 738a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DirectOutputThread(); 739a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 740a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 741a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 742a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 74362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent virtual bool checkForNewParameters_l(); 74462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 74562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent protected: 746a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual int getTrackName_l(); 747a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void deleteTrackName_l(int name); 748059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t activeSleepTimeUs(); 749059b4be2a5a5b3fd410f8263e5f5928689c97af7Eric Laurent virtual uint32_t idleSleepTimeUs(); 7508448a79767b7dfc53a12502661cba89774733c10Eric Laurent virtual uint32_t suspendSleepTimeUs(); 751a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 752a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 75365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp); 75465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 75565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent float mLeftVolFloat; 75665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent float mRightVolFloat; 75765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint16_t mLeftVolShort; 75865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint16_t mRightVolShort; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 761a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class DuplicatingThread : public MixerThread { 762a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 76349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id); 764a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~DuplicatingThread(); 765a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 766a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Thread virtuals 767a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 768a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void addOutputTrack(MixerThread* thread); 769a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void removeOutputTrack(MixerThread* thread); 7708ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t waitTimeMs() { return mWaitTimeMs; } 7718ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent protected: 7728ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent virtual uint32_t activeSleepTimeUs(); 773a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 774a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 7758ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks); 7768ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent void updateWaitTime(); 7778ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent 778a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent SortedVector < sp<OutputTrack> > mOutputTracks; 7798ac9f8d1c708dc8bb853f7697f10051031eb73c5Eric Laurent uint32_t mWaitTimeMs; 780a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 781a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 782ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent PlaybackThread *checkPlaybackThread_l(int output) const; 783ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent MixerThread *checkMixerThread_l(int output) const; 784ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent RecordThread *checkRecordThread_l(int input) const; 785a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; } 78649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent void audioConfigChanged_l(int event, int ioHandle, void *param2); 787a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 78865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int nextUniqueId(); 7898ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent status_t moveEffectChain_l(int session, 7908ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent AudioFlinger::PlaybackThread *srcThread, 791493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent AudioFlinger::PlaybackThread *dstThread, 792493941b8d8a12ee843d9823c0177f8005a7be54fEric Laurent bool reRegister); 79365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioBuffer; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class TrackHandle : public android::BnAudioTrack { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 798a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent TrackHandle(const sp<PlaybackThread::Track>& track); 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~TrackHandle(); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void flush(); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void mute(bool); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void pause(); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setVolume(float left, float right); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 80765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t attachAuxEffect(int effectId); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 811a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<PlaybackThread::Track> mTrack; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class Client; 815a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread::Track; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 818b9481d8cf6f3ade96ed062dc3f601c777fe4430fEric Laurent void removeClient_l(pid_t pid); 8194f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent void removeNotificationClient(pid_t pid); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 822a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record thread 823a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordThread : public ThreadBase, public AudioBufferProvider 824a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent { 825a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 826a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 827a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // record track 828a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent class RecordTrack : public TrackBase { 829a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent public: 830a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const wp<ThreadBase>& thread, 831a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent const sp<Client>& client, 832a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 833a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int format, 834a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channelCount, 835a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int frameCount, 83665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t flags, 83765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId); 838a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordTrack(); 839a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 840a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t start(); 841a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void stop(); 842a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 843a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 844a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 845a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 8463fdb1267c1623773b4eb5e1b06d5859019275e40Eric Laurent void dump(char* buffer, size_t size); 847a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 848a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class AudioFlinger; 8492c817f5d52478453a1bd7e451fa14c1b7fe4802bEric Laurent friend class RecordThread; 850a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 851a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack(const RecordTrack&); 852a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordTrack& operator = (const RecordTrack&); 853a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 854a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 855a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 856a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mOverflow; 857a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 858a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 859a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 860a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(const sp<AudioFlinger>& audioFlinger, 861a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *input, 862a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t sampleRate, 86349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent uint32_t channels, 86449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent int id); 865a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent ~RecordThread(); 866a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 867a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool threadLoop(); 868a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t readyToRun() { return NO_ERROR; } 869a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void onFirstRef(); 870a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 871a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t start(RecordTrack* recordTrack); 872a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void stop(RecordTrack* recordTrack); 873a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent status_t dump(int fd, const Vector<String16>& args); 874a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn* getInput() { return mInput; } 875a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 876a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer); 877a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 878a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual bool checkForNewParameters_l(); 879a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent virtual String8 getParameters(const String8& keys); 880eb8f850d0b7e53956e917fd9645f808c1a09bc88Eric Laurent virtual void audioConfigChanged_l(int event, int param = 0); 881a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent void readInputParameters(); 88247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent virtual unsigned int getInputFramesLost(); 883a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 884a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent private: 885a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordThread(); 886a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioStreamIn *mInput; 887a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordTrack> mActiveTrack; 888a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent Condition mStartStopCond; 889a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioResampler *mResampler; 890a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int32_t *mRsmpOutBuffer; 891a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int16_t *mRsmpInBuffer; 892a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mRsmpInIndex; 893a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent size_t mInputBytes; 894a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int mReqChannelCount; 895a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t mReqSampleRate; 8969cc489a2196e449dbe090ad9bdbc5cedd0b8334fEric Laurent ssize_t mBytesRead; 897a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent }; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class RecordHandle : public android::BnAudioRecord { 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 901a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~RecordHandle(); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t start(); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void stop(); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IMemory> getCblk() const; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 909a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent sp<RecordThread::RecordTrack> mRecordTrack; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent //--- Audio Effect Management 91365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 91465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // EffectModule and EffectChain classes both have their own mutex to protect 91565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // state changes or resource modifications. Always respect the following order 91665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // if multiple mutexes must be acquired to avoid cross deadlock: 91765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule 91865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 91965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // The EffectModule class is a wrapper object controlling the effect engine implementation 92065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // in the effect library. It prevents concurrent calls to process() and command() functions 92165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // from different client threads. It keeps a list of EffectHandle objects corresponding 92265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // to all client applications using this effect and notifies applications of effect state, 92365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // control or parameter changes. It manages the activation state machine to send appropriate 92465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // reset, enable, disable commands to effect engine and provide volume 92565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // ramping when effects are activated/deactivated. 92665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by 92765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // the attached track(s) to accumulate their auxiliary channel. 92865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectModule: public RefBase { 92965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent public: 93065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectModule(const wp<ThreadBase>& wThread, 93165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const wp<AudioFlinger::EffectChain>& chain, 93265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t *desc, 93365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int id, 93465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId); 93565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent ~EffectModule(); 93665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 93765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent enum effect_state { 93865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent IDLE, 9397d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent RESTART, 94065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent STARTING, 94165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent ACTIVE, 94265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent STOPPING, 94365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent STOPPED 94465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent }; 94565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 94665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int id() { return mId; } 94765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void process(); 9487d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent void updateState(); 949a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent status_t command(uint32_t cmdCode, 950a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t cmdSize, 951a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pCmdData, 952a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t *replySize, 953a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pReplyData); 95465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 955df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent void reset_l(); 95665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t configure(); 95765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t init(); 95865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t state() { 95965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return mState; 96065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 96165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t status() { 96265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return mStatus; 96365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 9648ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent int sessionId() { 9658ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent return mSessionId; 9668ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent } 96765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t setEnabled(bool enabled); 96865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent bool isEnabled(); 969a92ebfa1cd96dc91174f68baab820dbed8239e4bEric Laurent bool isProcessEnabled(); 97065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 97165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; } 97265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *inBuffer() { return mConfig.inputCfg.buffer.s16; } 97365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; } 97465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *outBuffer() { return mConfig.outputCfg.buffer.s16; } 9758ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void setChain(const wp<EffectChain>& chain) { mChain = chain; } 9768ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void setThread(const wp<ThreadBase>& thread) { mThread = thread; } 97765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 97865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t addHandle(sp<EffectHandle>& handle); 97965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void disconnect(const wp<EffectHandle>& handle); 98065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent size_t removeHandle (const wp<EffectHandle>& handle); 98165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 98265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t& desc() { return mDescriptor; } 98353334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent wp<EffectChain>& chain() { return mChain; } 98465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 98565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t setDevice(uint32_t device); 98665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t setVolume(uint32_t *left, uint32_t *right, bool controller); 98753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent status_t setMode(uint32_t mode); 98865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 98965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t dump(int fd, const Vector<String16>& args); 99065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 99165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent protected: 99265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 9937d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent // Maximum time allocated to effect engines to complete the turn off sequence 9947d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent static const uint32_t MAX_DISABLE_TIME_MS = 10000; 9957d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent 99665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectModule(const EffectModule&); 99765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectModule& operator = (const EffectModule&); 99865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 999df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent status_t start_l(); 1000df9b81ced437b11f8a3fcf4ba3ea6af703d121e2Eric Laurent status_t stop_l(); 100165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 100253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified 100353334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent static const uint32_t sDeviceConvTable[]; 100453334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent static uint32_t deviceAudioSystemToEffectApi(uint32_t device); 100553334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 100653334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified 100753334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent static const uint32_t sModeConvTable[]; 100853334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent static int modeAudioSystemToEffectApi(uint32_t mode); 100953334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 101065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Mutex mLock; // mutex for process, commands and handles list protection 101165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent wp<ThreadBase> mThread; // parent thread 101265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent wp<EffectChain> mChain; // parent effect chain 101365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mId; // this instance unique ID 101465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mSessionId; // audio session ID 101565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_descriptor_t mDescriptor;// effect descriptor received from effect engine 101665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_config_t mConfig; // input and output audio configuration 101765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_interface_t mEffectInterface; // Effect module C API 101865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t mStatus; // initialization status 101965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint32_t mState; // current activation state (effect_state) 102065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Vector< wp<EffectHandle> > mHandles; // list of client handles 10217d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent uint32_t mMaxDisableWaitCnt; // maximum grace period before forcing an effect off after 10227d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent // sending disable command. 10237d850f23c857fe0c0deec9b9ea593d3029665a16Eric Laurent uint32_t mDisableWaitCnt; // current process() calls count during disable period. 102465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent }; 102565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 102665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // The EffectHandle class implements the IEffect interface. It provides resources 102765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // to receive parameter updates, keeps track of effect control 102865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // ownership and state and has a pointer to the EffectModule object it is controlling. 102965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // There is one EffectHandle object for each application controlling (or using) 103065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // an effect module. 103165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // The EffectHandle is obtained by calling AudioFlinger::createEffect(). 103265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectHandle: public android::BnEffect { 103365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent public: 103465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 103565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectHandle(const sp<EffectModule>& effect, 103665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<AudioFlinger::Client>& client, 103765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent const sp<IEffectClient>& effectClient, 103865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int32_t priority); 103965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual ~EffectHandle(); 104065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 104165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // IEffect 104265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t enable(); 104365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t disable(); 1044a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent virtual status_t command(uint32_t cmdCode, 1045a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t cmdSize, 1046a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pCmdData, 1047a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t *replySize, 1048a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pReplyData); 104965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual void disconnect(); 105065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual sp<IMemory> getCblk() const; 105165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent virtual status_t onTransact(uint32_t code, const Parcel& data, 105265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Parcel* reply, uint32_t flags); 105365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 105465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 105565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // Give or take control of effect module 105665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setControl(bool hasControl, bool signal); 1057a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void commandExecuted(uint32_t cmdCode, 1058a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t cmdSize, 1059a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pCmdData, 1060a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent uint32_t replySize, 1061a4c72acfbc6c06588dd26cf41e67a834fc0a54f9Eric Laurent void *pReplyData); 106265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setEnabled(bool enabled); 106365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 106465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // Getters 106565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int id() { return mEffect->id(); } 106665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int priority() { return mPriority; } 106765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent bool hasControl() { return mHasControl; } 106865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<EffectModule> effect() { return mEffect; } 106965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 107065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void dump(char* buffer, size_t size); 107165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 107265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent protected: 107365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 107465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectHandle(const EffectHandle&); 107565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectHandle& operator =(const EffectHandle&); 107665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 107765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<EffectModule> mEffect; // pointer to controlled EffectModule 107865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<IEffectClient> mEffectClient; // callback interface for client notifications 107965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<Client> mClient; // client for shared memory allocation 108065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent sp<IMemory> mCblkMemory; // shared memory for control block 108165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent effect_param_cblk_t* mCblk; // control block for deferred parameter setting via shared memory 108265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent uint8_t* mBuffer; // pointer to parameter area in shared memory 108365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mPriority; // client application priority to control the effect 108465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent bool mHasControl; // true if this handle is controlling the effect 108565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent }; 108665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 108765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // the EffectChain class represents a group of effects associated to one audio session. 108865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // There can be any number of EffectChain objects per output mixer thread (PlaybackThread). 108965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // The EffecChain with session ID 0 contains global effects applied to the output mix. 109065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks) 109165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding 109265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // in the effect process order. When attached to a track (session ID != 0), it also provide it's own 109365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent // input buffer used by the track as accumulation buffer. 109465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent class EffectChain: public RefBase { 109565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent public: 109665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectChain(const wp<ThreadBase>& wThread, int sessionId); 109765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent ~EffectChain(); 109865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 109965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void process_l(); 110065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 110165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void lock() { 110265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent mLock.lock(); 110365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 110465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void unlock() { 110565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent mLock.unlock(); 110665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 110765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 11088ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent status_t addEffect_l(const sp<EffectModule>& handle); 110976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent size_t removeEffect_l(const sp<EffectModule>& handle); 111065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 111165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId() { 111265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return mSessionId; 111365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 11148ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 111576c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor); 111676c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent sp<EffectModule> getEffectFromId_l(int id); 111776c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent bool setVolume_l(uint32_t *left, uint32_t *right); 111876c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent void setDevice_l(uint32_t device); 111976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent void setMode_l(uint32_t mode); 112053334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 112165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setInBuffer(int16_t *buffer, bool ownsBuffer = false) { 112265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent mInBuffer = buffer; 112365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent mOwnInBuffer = ownsBuffer; 112465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 112565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *inBuffer() { 112665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return mInBuffer; 112765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 112865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void setOutBuffer(int16_t *buffer) { 112965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent mOutBuffer = buffer; 113065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 113165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *outBuffer() { 113265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent return mOutBuffer; 113365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent } 113465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 113565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void startTrack() {mActiveTrackCnt++;} 113665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent void stopTrack() {mActiveTrackCnt--;} 113765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int activeTracks() { return mActiveTrackCnt;} 113865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 11398ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t strategy() { return mStrategy; } 11408ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent void setStrategy(uint32_t strategy) 11418ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent { mStrategy = strategy; } 11428ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent 114365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent status_t dump(int fd, const Vector<String16>& args); 114465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 114565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent protected: 114665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 114765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectChain(const EffectChain&); 114865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent EffectChain& operator =(const EffectChain&); 114965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 115065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent wp<ThreadBase> mThread; // parent mixer thread 115165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Mutex mLock; // mutex protecting effect list 115265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent Vector<sp<EffectModule> > mEffects; // list of effect modules 115365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mSessionId; // audio session ID 115465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *mInBuffer; // chain input buffer 115565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int16_t *mOutBuffer; // chain output buffer 115665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mActiveTrackCnt; // number of active tracks connected 115765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent bool mOwnInBuffer; // true if the chain owns its input buffer 115876c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent int mVolumeCtrlIdx; // index of insert effect having control over volume 115976c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent uint32_t mLeftVolume; // previous volume on left channel 116076c40f74ced0b034a534ebc31ab9616425d3e711Eric Laurent uint32_t mRightVolume; // previous volume on right channel 11610d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent uint32_t mNewLeftVolume; // new volume on left channel 11620d7e048cf2e38d32568261760aef82d1ee145126Eric Laurent uint32_t mNewRightVolume; // new volume on right channel 11638ed6ed0b6216a9dfcbcd6a5ba6a62d28a901baecEric Laurent uint32_t mStrategy; // strategy for this effect chain 116465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent }; 116565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 1166a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class RecordThread; 1167a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent friend class PlaybackThread; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1170b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mutable Mutex mLock; 1171b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultKeyedVector< pid_t, wp<Client> > mClients; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1174a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent mutable Mutex mHardwareLock; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioHardwareInterface* mAudioHardware; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable int mHardwareStatus; 1177a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1178a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1179ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<PlaybackThread> > mPlaybackThreads; 1180a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent PlaybackThread::stream_type_t mStreamTypes[AudioSystem::NUM_STREAM_TYPES]; 1181a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent float mMasterVolume; 1182a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent bool mMasterMute; 1183a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 1184ddb78e7753be03937ad57ce7c3c842c52bdad65eEric Laurent DefaultKeyedVector< int, sp<RecordThread> > mRecordThreads; 1185a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 11864f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent DefaultKeyedVector< pid_t, sp<NotificationClient> > mNotificationClients; 118765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent volatile int32_t mNextUniqueId; 11884f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#ifdef LVMX 11894f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent int mLifeVibesClientPid; 11904f0f17d2f10ceb22c2e23b593bab434fc899ecb7Eric Laurent#endif 119153334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent uint32_t mMode; 119253334cdb81bab4a4dfd0a41d2ef50709015a36c8Eric Laurent 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_FLINGER_H 1200