AudioFlinger.h revision 8abf44d2f2bcd20a2835570efe89d89c19db426a
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/* 261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** 361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** Copyright 2007, The Android Open Source Project 461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** 561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** Licensed under the Apache License, Version 2.0 (the "License"); 661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** you may not use this file except in compliance with the License. 761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** You may obtain a copy of the License at 861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** 961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** http://www.apache.org/licenses/LICENSE-2.0 1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** 1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** Unless required by applicable law or agreed to in writing, software 1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** distributed under the License is distributed on an "AS IS" BASIS, 1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** See the License for the specific language governing permissions and 1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala** limitations under the License. 1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala*/ 17cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He 18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#ifndef ANDROID_AUDIO_FLINGER_H 1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ANDROID_AUDIO_FLINGER_H 20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <stdint.h> 22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <sys/types.h> 2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <limits.h> 2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <common_time/cc_helper.h> 2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/IAudioFlinger.h> 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/IAudioFlingerClient.h> 297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/IAudioTrack.h> 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/IAudioRecord.h> 317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/AudioSystem.h> 327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <media/AudioTrack.h> 337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <utils/Atomic.h> 35ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <utils/Errors.h> 3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/threads.h> 3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/SortedVector.h> 3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/TypeHelpers.h> 392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <utils/Vector.h> 402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <binder/BinderService.h> 4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <binder/MemoryDealer.h> 4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <system/audio.h> 4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <hardware/audio.h> 4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "AudioBufferProvider.h" 4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <powermanager/IPowerManager.h> 50ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android { 5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 53ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkinclass audio_track_cblk_t; 54ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaclass effect_param_cblk_t; 55b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvalaclass AudioMixer; 56b99c5b8eebb35133a08c46b015624bd4c4a6c477Eino-Ville Talvalaclass AudioBuffer; 5744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinclass AudioResampler; 58ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin// ---------------------------------------------------------------------------- 60ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatic const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); 62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 63228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalaclass AudioFlinger : 642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public BinderService<AudioFlinger>, 652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public BnAudioFlinger 66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{ 67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala friend class BinderService<AudioFlinger>; 68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalapublic: 69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala static const char* getServiceName() { return "media.audio_flinger"; } 70a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 71c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala virtual status_t dump(int fd, const Vector<String16>& args); 72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala // IAudioFlinger interface, in binder opcode order 74e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin virtual sp<IAudioTrack> createTrack( 75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala pid_t pid, 76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala audio_stream_type_t streamType, 77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala uint32_t sampleRate, 78ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala audio_format_t format, 79fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint32_t channelMask, 80fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int frameCount, 81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint32_t flags, 82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala const sp<IMemory>& sharedBuffer, 83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala audio_io_handle_t output, 84fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool isTimed, 85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int *sessionId, 86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala status_t *status); 87fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual sp<IAudioRecord> openRecord( 893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala pid_t pid, 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala audio_io_handle_t input, 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t sampleRate, 9273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala audio_format_t format, 93254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala uint32_t channelMask, 94254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala int frameCount, 95254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala uint32_t flags, 9673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala int *sessionId, 97ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin status_t *status); 984bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual uint32_t sampleRate(audio_io_handle_t output) const; 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual int channelCount(audio_io_handle_t output) const; 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual audio_format_t format(audio_io_handle_t output) const; 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual size_t frameCount(audio_io_handle_t output) const; 1034bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala virtual uint32_t latency(audio_io_handle_t output) const; 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual status_t setMasterVolume(float value); 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual status_t setMasterMute(bool muted); 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1084bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala virtual float masterVolume() const; 109ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala virtual float masterVolumeSW() const; 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual bool masterMute() const; 111ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala 112ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 113ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin audio_io_handle_t output); 114ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t setStreamMute(audio_stream_type_t stream, bool muted); 115ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 116ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual float streamVolume(audio_stream_type_t stream, 117ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin audio_io_handle_t output) const; 118ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual bool streamMute(audio_stream_type_t stream) const; 119ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 120ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t setMode(audio_mode_t mode); 121ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 122ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t setMicMute(bool state); 123ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual bool getMicMute() const; 124ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 125ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); 126ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const; 127ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 128ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual void registerClient(const sp<IAudioFlingerClient>& client); 129ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 1304bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, int channelCount) const; 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 132ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual audio_io_handle_t openOutput(uint32_t *pDevices, 133ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala uint32_t *pSamplingRate, 134d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala audio_format_t *pFormat, 1354bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala uint32_t *pChannels, 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t *pLatencyMs, 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t flags); 138d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala 139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 140fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala audio_io_handle_t output2); 141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual status_t closeOutput(audio_io_handle_t output); 1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual status_t suspendOutput(audio_io_handle_t output); 145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual status_t restoreOutput(audio_io_handle_t output); 14761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 14861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual audio_io_handle_t openInput(uint32_t *pDevices, 14961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala uint32_t *pSamplingRate, 150a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala audio_format_t *pFormat, 151d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala uint32_t *pChannels, 1524ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala audio_in_acoustics_t acoustics); 153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual status_t closeInput(audio_io_handle_t input); 155c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala 156c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output); 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual status_t setVoiceVolume(float volume); 15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 161611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala audio_io_handle_t output) const; 162d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala 163611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const; 16444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 165d0158c38ad82c1c3033a6dd5806435def3727784Eino-Ville Talvala virtual int newAudioSessionId(); 166611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala 1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual void acquireAudioSessionId(int audioSession); 1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual void releaseAudioSessionId(int audioSession); 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 171836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala virtual status_t queryNumberEffects(uint32_t *numEffects) const; 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const; 1744ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala 1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala effect_descriptor_t *descriptor) const; 1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 178836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala virtual sp<IEffect> createEffect(pid_t pid, 1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala effect_descriptor_t *pDesc, 180836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const sp<IEffectClient>& effectClient, 18111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala int32_t priority, 182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala audio_io_handle_t io, 1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala int sessionId, 184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala status_t *status, 1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala int *id, 186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala int *enabled); 1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput, 189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala audio_io_handle_t dstOutput); 1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala virtual status_t onTransact( 192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint32_t code, 1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const Parcel& data, 194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala Parcel* reply, 195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint32_t flags); 1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala // end of IAudioFlinger interface 1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalaprivate: 2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala audio_mode_t getMode() const { return mMode; } 2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala bool btNrecIsOff() const { return mBtNrecIsOff; } 203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 204d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin AudioFlinger(); 205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin virtual ~AudioFlinger(); 206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin 207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin // call in any IAudioFlinger method that accesses mPrimaryHardwareDev 208d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin status_t initCheck() const { return mPrimaryHardwareDev == NULL ? NO_INIT : NO_ERROR; } 209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin 210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin virtual void onFirstRef(); 211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin audio_hw_device_t* findSuitableHwDev_l(uint32_t devices); 2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala void purgeStaleEffects_l(); 2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala static nsecs_t mStandbyTimeInNsecs; 2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 216836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala // Internal dump utilites. 217d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin status_t dumpPermissionDenial(int fd, const Vector<String16>& args); 218d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin status_t dumpClients(int fd, const Vector<String16>& args); 219d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin status_t dumpInternals(int fd, const Vector<String16>& args); 220d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin 221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin // --- Client --- 222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin class Client : public RefBase { 223d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin public: 224d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 225d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin virtual ~Client(); 2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala sp<MemoryDealer> heap() const; 2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala pid_t pid() const { return mPid; } 2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala sp<AudioFlinger> audioFlinger() const { return mAudioFlinger; } 2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 230836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala bool reserveTimedTrack(); 231d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin void releaseTimedTrack(); 232d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin 233d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin private: 234d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin Client(const Client&); 2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala Client& operator = (const Client&); 2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const sp<AudioFlinger> mAudioFlinger; 2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const sp<MemoryDealer> mMemoryDealer; 2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const pid_t mPid; 239836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala Mutex mTimedTrackLock; 2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala int mTimedTrackCount; 2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala }; 2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala // --- Notification Client --- 2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class NotificationClient : public IBinder::DeathRecipient { 2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala public: 2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala NotificationClient(const sp<AudioFlinger>& audioFlinger, 2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const sp<IAudioFlingerClient>& client, 2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala pid_t pid); 2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual ~NotificationClient(); 2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } 2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala // IBinder::DeathRecipient 2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual void binderDied(const wp<IBinder>& who); 2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala private: 2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala NotificationClient(const NotificationClient&); 2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala NotificationClient& operator = (const NotificationClient&); 2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 261836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const sp<AudioFlinger> mAudioFlinger; 2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const pid_t mPid; 2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const sp<IAudioFlingerClient> mAudioFlingerClient; 2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala }; 2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class TrackHandle; 2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class RecordHandle; 2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class RecordThread; 2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class PlaybackThread; 2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class MixerThread; 2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class DirectOutputThread; 272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala class DuplicatingThread; 2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class Track; 2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class RecordTrack; 2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class EffectModule; 2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class EffectHandle; 2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class EffectChain; 2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala struct AudioStreamOut; 2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala struct AudioStreamIn; 2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala class ThreadBase : public Thread { 2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala public: 2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 284d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala enum type_t { 285d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala MIXER, // Thread class is MixerThread 286d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala DIRECT, // Thread class is DirectOutputThread 287d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala DUPLICATING, // Thread class is DuplicatingThread 288d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala RECORD // Thread class is RecordThread 2894ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala }; 290d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala ThreadBase (const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id, uint32_t device, type_t type); 292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual ~ThreadBase(); 293d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala status_t dumpBase(int fd, const Vector<String16>& args); 295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala status_t dumpEffectChains(int fd, const Vector<String16>& args); 2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala void clearPowerManager(); 2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala 299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala // base for record and playback 300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala class TrackBase : public AudioBufferProvider, public RefBase { 301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala public: 303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala enum track_state { 3047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala IDLE, 3057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala TERMINATED, 3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala // These are order-sensitive; do not change order without reviewing the impact. 307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala // In particular there are assumptions about > STOPPED. 3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala STOPPED, 3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala RESUMING, 310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala ACTIVE, 311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala PAUSING, 3127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala PAUSED 3137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala }; 314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala enum track_flags { 316836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala STEPSERVER_FAILED = 0x01, // StepServer could not acquire cblk->lock mutex 317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala SYSTEM_FLAGS_MASK = 0x0000ffffUL, 318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala // The upper 16 bits are used for track-specific flags. 319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala }; 320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 3217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala TrackBase(ThreadBase *thread, 3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala const sp<Client>& client, 323836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint32_t sampleRate, 324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala audio_format_t format, 325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala uint32_t channelMask, 3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala int frameCount, 3273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala uint32_t flags, 328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala const sp<IMemory>& sharedBuffer, 3297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala int sessionId); 3303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala virtual ~TrackBase(); 331836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala 3327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala virtual status_t start(pid_t tid) = 0; 3330181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala virtual void stop() = 0; 3340181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala sp<IMemory> getCblk() const { return mCblkMemory; } 3350181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala audio_track_cblk_t* cblk() const { return mCblk; } 3360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int sessionId() const { return mSessionId; } 3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala 338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala protected: 339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala friend class ThreadBase; 340ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala friend class RecordHandle; 341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala friend class PlaybackThread; 342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala friend class RecordThread; 343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala friend class MixerThread; 344e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala friend class DirectOutputThread; 345e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 346e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala TrackBase(const TrackBase&); 347e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala TrackBase& operator = (const TrackBase&); 348e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 349e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala virtual status_t getNextBuffer( 350e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala AudioBufferProvider::Buffer* buffer, 351e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala int64_t pts) = 0; 352e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 353e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala audio_format_t format() const { 3557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return mFormat; 3567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 3577373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 3587373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int channelCount() const { return mChannelCount; } 359fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 360fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala uint32_t channelMask() const { return mChannelMask; } 361fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 362fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int sampleRate() const; // FIXME inline after cblk sr moved 363e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 364e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala void* getBuffer(uint32_t offset, uint32_t frames) const; 365e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 366e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala bool isStopped() const { 36773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala return mState == STOPPED; 3683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala } 36973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 370428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala bool isTerminated() const { 371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mState == TERMINATED; 372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 373c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala 374c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala bool step(); 37597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala void reset(); 37697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 37744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const wp<ThreadBase> mThread; 3787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala /*const*/ sp<Client> mClient; // see explanation at ~TrackBase() why not const 37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala sp<IMemory> mCblkMemory; 38061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala audio_track_cblk_t* mCblk; 38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala void* mBuffer; 38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala void* mBufferEnd; 38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala uint32_t mFrameCount; 384a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala // we don't really need a lock for these 38544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin track_state mState; 386c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala const audio_format_t mFormat; 387c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala uint32_t mFlags; 388c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala const int mSessionId; 389c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala uint8_t mChannelCount; 390ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala uint32_t mChannelMask; 391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala }; 392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala 39398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala class ConfigEvent { 39498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala public: 395d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala ConfigEvent() : mEvent(0), mParam(0) {} 396d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala 397d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala int mEvent; 398d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala int mParam; 399d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala }; 400d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala 401d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala class PMDeathRecipient : public IBinder::DeathRecipient { 4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala public: 40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala PMDeathRecipient(const wp<ThreadBase>& thread) : mThread(thread) {} 40498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala virtual ~PMDeathRecipient() {} 405c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala 40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala // IBinder::DeathRecipient 40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala virtual void binderDied(const wp<IBinder>& who); 40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 409254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala private: 41098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala PMDeathRecipient(const PMDeathRecipient&); 41198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala PMDeathRecipient& operator = (const PMDeathRecipient&); 41298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 413ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin wp<ThreadBase> mThread; 41498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala }; 41598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala 41698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala virtual status_t initCheck() const = 0; 41798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala type_t type() const { return mType; } 418254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala uint32_t sampleRate() const { return mSampleRate; } 41998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala int channelCount() const { return mChannelCount; } 42098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala audio_format_t format() const { return mFormat; } 42198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala size_t frameCount() const { return mFrameCount; } 422ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin void wakeUp() { mWaitWorkCV.broadcast(); } 42398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala // Should be "virtual status_t requestExitAndWait()" and override same 42498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala // method in Thread, but Thread::requestExitAndWait() is not yet virtual. 425dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk void exit(); 426dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk virtual bool checkForNewParameters_l() = 0; 427dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk virtual status_t setParameters(const String8& keyValuePairs); 428dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk virtual String8 getParameters(const String8& keys) = 0; 429dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk virtual void audioConfigChanged_l(int event, int param = 0) = 0; 430dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk void sendConfigEvent(int event, int param = 0); 431dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk void sendConfigEvent_l(int event, int param = 0); 432dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk void processConfigEvents(); 43398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala audio_io_handle_t id() const { return mId;} 43498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala bool standby() { return mStandby; } 43598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala uint32_t device() { return mDevice; } 43698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala virtual audio_stream_t* stream() = 0; 4373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 4388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala sp<EffectHandle> createEffect_l( 43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<AudioFlinger::Client>& client, 44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<IEffectClient>& effectClient, 44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int32_t priority, 44261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int sessionId, 443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala effect_descriptor_t *desc, 4449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala int *enabled, 44544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin status_t *status); 446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala void disconnectEffect(const sp< EffectModule>& effect, 4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala const wp<EffectHandle>& handle, 4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bool unpinIfLast); 4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // return values for hasAudioSession (bit field) 4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala enum effect_state { 4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala EFFECT_SESSION = 0x1, // the audio session corresponds to at least one 4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // effect 4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala TRACK_SESSION = 0x2 // the audio session corresponds to at least one 4558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // track 45644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin }; 45744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // get effect chain corresponding to session Id. 4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<EffectChain> getEffectChain(int sessionId); 46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // same as getEffectChain() but must be called with ThreadBase mutex locked 46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala sp<EffectChain> getEffectChain_l(int sessionId); 46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // add an effect chain to the chain list (mEffectChains) 463a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala virtual status_t addEffectChain_l(const sp<EffectChain>& chain) = 0; 4649e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala // remove an effect chain from the chain list (mEffectChains) 46544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual size_t removeEffectChain_l(const sp<EffectChain>& chain) = 0; 4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // lock mall effect chains Mutexes. Must be called before releasing the 4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // ThreadBase mutex before processing the mixer and effects. This guarantees the 468ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala // integrity of the chains during the process. 4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void lockEffectChains_l(Vector<sp <EffectChain> >& effectChains); 4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // unlock effect chains after process 4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void unlockEffectChains(Vector<sp <EffectChain> >& effectChains); 4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // set audio mode to all effect chains 4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void setMode(audio_mode_t mode); 4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // get effect module with corresponding ID on specified audio session 4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId); 4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // add and effect module. Also creates the effect chain is none exists for 4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // the effects audio session 4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t addEffect_l(const sp< EffectModule>& effect); 4799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // remove and effect module. Also removes the effect chain is this was the last 4809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // effect 48161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala void removeEffect_l(const sp< EffectModule>& effect); 48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // detach all tracks connected to an auxiliary effect 48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual void detachAuxEffect_l(int effectId) {} 484a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala // returns either EFFECT_SESSION if effects on this audio session exist in one 4859e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala // chain, or TRACK_SESSION if tracks on this audio session exist, or both 48644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual uint32_t hasAudioSession(int sessionId) = 0; 4879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // the value returned by default implementation is not important as the 4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // strategy is only meaningful for PlaybackThread which implements this method 489ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala virtual uint32_t getStrategyForSession_l(int sessionId) { return 0; } 4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 491907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala // suspend or restore effect according to the type of effect passed. a NULL 492907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala // type pointer means suspend all effects in the session 493907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala void setEffectSuspended(const effect_uuid_t *type, 494907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala bool suspend, 495907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala int sessionId = AUDIO_SESSION_OUTPUT_MIX); 496907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala // check if some effects must be suspended/restored when an effect is enabled 4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // or disabled 49844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect, 49944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin bool enabled, 5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala int sessionId = AUDIO_SESSION_OUTPUT_MIX); 5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala void checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect, 5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bool enabled, 5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala int sessionId = AUDIO_SESSION_OUTPUT_MIX); 5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala mutable Mutex mLock; 5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 50661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala protected: 50761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 5081ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala // entry describing an effect being suspended in mSuspendedSessions keyed vector 5098ba01021b573889802e67e029225a96f0dfa471aAndy McFadden class SuspendedSessionDesc : public RefBase { 510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala public: 5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala SuspendedSessionDesc() : mRefCount(0) {} 51244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 5133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int mRefCount; // number of active suspend requests 5143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala effect_uuid_t mType; // effect type UUID 515ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala }; 5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala void acquireWakeLock(); 5188ba01021b573889802e67e029225a96f0dfa471aAndy McFadden void acquireWakeLock_l(); 5198ba01021b573889802e67e029225a96f0dfa471aAndy McFadden void releaseWakeLock(); 5201ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala void releaseWakeLock_l(); 5211ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala void setEffectSuspended_l(const effect_uuid_t *type, 5221ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala bool suspend, 5231ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala int sessionId = AUDIO_SESSION_OUTPUT_MIX); 5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // updated mSuspendedSessions when an effect suspended or restored 52536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void updateSuspendedSessions_l(const effect_uuid_t *type, 5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala bool suspend, 5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int sessionId); 52836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // check if some effects must be suspended when an effect chain is added 529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala void checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain); 530a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class AudioFlinger; 5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class Track; 5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class TrackBase; 5349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala friend class PlaybackThread; 5359e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala friend class MixerThread; 5366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class DirectOutputThread; 5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class DuplicatingThread; 5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala friend class RecordThread; 539f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala friend class RecordTrack; 540f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala 541f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala const type_t mType; 542f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Condition mWaitWorkCV; 543f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala const sp<AudioFlinger> mAudioFlinger; 544f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala uint32_t mSampleRate; 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t mFrameCount; 5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t mChannelMask; 5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint16_t mChannelCount; 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t mFrameSize; 5499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala audio_format_t mFormat; 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Condition mParamCond; 551f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala Vector<String8> mNewParameters; 5529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala status_t mParamStatus; 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<ConfigEvent> mConfigEvents; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool mStandby; 5559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala const audio_io_handle_t mId; 5569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala Vector< sp<EffectChain> > mEffectChains; 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t mDevice; // output device for PlaybackThread 5589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // input + output devices for RecordThread 559d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala static const int kNameLength = 32; 560d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala char mName[kNameLength]; 561d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala sp<IPowerManager> mPowerManager; 562d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala sp<IBinder> mWakeLockToken; 563d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala const sp<PMDeathRecipient> mDeathRecipient; 564d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala // list of suspended effects per session and per type. The first vector is 565f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala // keyed by session ID, the second by type UUID timeLow field 5669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala KeyedVector< int, KeyedVector< int, sp<SuspendedSessionDesc> > > mSuspendedSessions; 5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 5689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 569bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala struct stream_type_t { 57073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala stream_type_t() 57173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala : volume(1.0f), 57273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala mute(false), 57373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala valid(true) 57473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala { 57573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala } 576bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala float volume; 577f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala bool mute; 578f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala bool valid; 579f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala }; 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // --- PlaybackThread --- 5826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala class PlaybackThread : public ThreadBase { 5836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala public: 58461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 58561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala enum mixer_state { 58661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala MIXER_IDLE, 587a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala MIXER_TRACKS_ENABLED, 588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala MIXER_TRACKS_READY 58944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin }; 590ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin 591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // playback track 592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala class Track : public TrackBase { 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Track( PlaybackThread *thread, 595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala const sp<Client>& client, 596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala audio_stream_type_t streamType, 597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint32_t sampleRate, 598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala audio_format_t format, 599a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala uint32_t channelMask, 600a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala int frameCount, 601a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala const sp<IMemory>& sharedBuffer, 602a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala int sessionId); 603a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual ~Track(); 604a2520db02bead68d4980783c41500ae96511bdf8Zhijun He 605a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void dump(char* buffer, size_t size); 606a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual status_t start(pid_t tid); 607a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual void stop(); 608a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void pause(); 609a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 610a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void flush(); 611a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void destroy(); 612a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void mute(bool); 613a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala int name() const { 614a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala return mName; 615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala audio_stream_type_t streamType() const { 618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala return mStreamType; 619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala } 6203ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala status_t attachAuxEffect(int EffectId); 621527748abf04c0060894fd7aace54959a2c343435Zhijun He void setAuxBuffer(int EffectId, int32_t *buffer); 6223ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int32_t *auxBuffer() const { return mAuxBuffer; } 6233ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala void setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; } 6243ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int16_t *mainBuffer() const { return mMainBuffer; } 6253ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int auxEffectId() const { return mAuxEffectId; } 6263ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6273ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala protected: 6283ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala friend class ThreadBase; 6293ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala friend class TrackHandle; 6303ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala friend class PlaybackThread; 6313ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala friend class MixerThread; 6323ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala friend class DirectOutputThread; 633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 6343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala Track(const Track&); 635a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala Track& operator = (const Track&); 636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 637a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual status_t getNextBuffer( 638a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala AudioBufferProvider::Buffer* buffer, 639a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala int64_t pts); 640a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual uint32_t framesReady() const; 641a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 6423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool isMuted() const { return mMute; } 6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool isPausing() const { 6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return mState == PAUSING; 6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool isPaused() const { 6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return mState == PAUSED; 6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool isReady() const; 6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala void setPaused() { mState = PAUSED; } 6513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala void reset(); 6523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool isOutputTrack() const { 6543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return (mStreamType == AUDIO_STREAM_CNT); 6553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala } 6563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala virtual bool isTimedTrack() const { return false; } 6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // we don't really need a lock for these 6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala volatile bool mMute; 6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala // FILLED state is used for suppressing volume ramp at begin of playing 6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; 6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala mutable uint8_t mFillingUpStatus; 6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int8_t mRetryCount; 6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala sp<IMemory> mSharedBuffer; 6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool mResetDone; 6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala audio_stream_type_t mStreamType; 6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int mName; 6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int16_t *mMainBuffer; 6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int32_t *mAuxBuffer; 6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int mAuxEffectId; 6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool mHasVolumeController; 6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala }; // end of Track 6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala class TimedTrack : public Track { 6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala public: 6773ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala static sp<TimedTrack> create(PlaybackThread *thread, 6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<Client>& client, 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_stream_type_t streamType, 6803ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala uint32_t sampleRate, 681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala audio_format_t format, 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t channelMask, 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int frameCount, 6843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IMemory>& sharedBuffer, 685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int sessionId); 686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala ~TimedTrack(); 687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala class TimedBuffer { 6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala public: 6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala TimedBuffer(); 6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala TimedBuffer(const sp<IMemory>& buffer, int64_t pts); 6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IMemory>& buffer() const { return mBuffer; } 693228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int64_t pts() const { return mPTS; } 694228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala int position() const { return mPosition; } 6953ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala void setPosition(int pos) { mPosition = pos; } 69661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala private: 69761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala sp<IMemory> mBuffer; 6983ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int64_t mPTS; 69961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int mPosition; 700a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala }; 7019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala 70244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual bool isTimedTrack() const { return true; } 7033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 7043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual uint32_t framesReady() const; 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, 707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala int64_t pts); 708ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala void timedYieldSamples(AudioBufferProvider::Buffer* buffer); 710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala void timedYieldSilence(uint32_t numFrames, 7116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala AudioBufferProvider::Buffer* buffer); 71222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin 71322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin status_t allocateTimedBuffer(size_t size, 71422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin sp<IMemory>* buffer); 715a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala status_t queueTimedBuffer(const sp<IMemory>& buffer, 716a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala int64_t pts); 717a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala status_t setMediaTimeTransform(const LinearTransform& xform, 718a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala TimedAudioTrack::TargetTimeline target); 719a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala void trimTimedBufferQueue_l(); 720a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala 721a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala private: 72277449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray TimedTrack(PlaybackThread *thread, 72377449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray const sp<Client>& client, 72477449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray audio_stream_type_t streamType, 7254ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala uint32_t sampleRate, 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_format_t format, 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t channelMask, 7284ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala int frameCount, 7294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala const sp<IMemory>& sharedBuffer, 7306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int sessionId); 73173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint64_t mLocalTimeFreq; 7336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala LinearTransform mLocalTimeToSampleTransform; 7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala sp<MemoryDealer> mTimedMemoryDealer; 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<TimedBuffer> mTimedBufferQueue; 7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint8_t* mTimedSilenceBuffer; 73773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala uint32_t mTimedSilenceBufferSize; 738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala mutable Mutex mTimedBufferQueueLock; 739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala bool mTimedAudioOutputOnTime; 740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala CCHelper mCCHelper; 741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala 7426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala Mutex mMediaTimeTransformLock; 74373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala LinearTransform mMediaTimeTransform; 744a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala bool mMediaTimeTransformValid; 745a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala TimedAudioTrack::TargetTimeline mMediaTimeTransformTarget; 746a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala }; 747a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 748a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 749a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala // playback track 750a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala class OutputTrack : public Track { 751a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala public: 752a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 753a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala class Buffer: public AudioBufferProvider::Buffer { 754a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala public: 755a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala int16_t *mBuffer; 756a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala }; 757a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala 758a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala OutputTrack(PlaybackThread *thread, 759a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala DuplicatingThread *sourceThread, 760d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He uint32_t sampleRate, 7613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala audio_format_t format, 7623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala uint32_t channelMask, 7633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala int frameCount); 7643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala virtual ~OutputTrack(); 765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 766a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual status_t start(pid_t tid); 767a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala virtual void stop(); 768a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala bool write(int16_t* data, uint32_t frames); 769a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala bool bufferQueueEmpty() const { return mBufferQueue.size() == 0; } 770a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala bool isActive() const { return mActive; } 771a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala const wp<ThreadBase>& thread() const { return mThread; } 772a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 773a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala private: 774a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 775a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala enum { 776a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala NO_MORE_BUFFERS = 0x80000001, // same in AudioTrack.h, ok to be different value 777a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala }; 778a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 779a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala status_t obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs); 780a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void clearBufferQueue(); 781a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 782a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // Maximum number of pending buffers allocated by OutputTrack::write() 783a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala static const uint8_t kMaxOverFlowBuffers = 10; 784a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 785a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala Vector < Buffer* > mBufferQueue; 786d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala AudioBufferProvider::Buffer mOutBuffer; 787228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool mActive; 788228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala DuplicatingThread* const mSourceThread; // for waitTimeMs() in write() 789228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala }; // end of OutputTrack 790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, 79273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala audio_io_handle_t id, uint32_t device, type_t type); 793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual ~PlaybackThread(); 7945a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala 795dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin virtual status_t dump(int fd, const Vector<String16>& args); 796da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 797da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Thread virtuals 798da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual status_t readyToRun(); 799da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala virtual void onFirstRef(); 800da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 80173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual status_t initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; } 802da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 8036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala virtual uint32_t latency() const; 80473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 80573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala void setMasterVolume(float value); 8065a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala void setMasterMute(bool muted); 80773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 80873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala void setStreamVolume(audio_stream_type_t stream, float value); 8095a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala void setStreamMute(audio_stream_type_t stream, bool muted); 81073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 81173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala float streamVolume(audio_stream_type_t stream) const; 81273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 8135a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala sp<Track> createTrack_l( 8145a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala const sp<AudioFlinger::Client>& client, 8155a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala audio_stream_type_t streamType, 81673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala uint32_t sampleRate, 81773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala audio_format_t format, 8185a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala uint32_t channelMask, 81973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala int frameCount, 82073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala const sp<IMemory>& sharedBuffer, 82173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala int sessionId, 82273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala bool isTimed, 82373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala status_t *status); 82473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 82573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala AudioStreamOut* getOutput() const; 82673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala AudioStreamOut* clearOutput(); 82773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual audio_stream_t* stream(); 82873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 82973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala void suspend() { mSuspended++; } 830be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala void restore() { if (mSuspended) mSuspended--; } 831be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala bool isSuspended() const { return (mSuspended != 0); } 83273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual String8 getParameters(const String8& keys); 833be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala virtual void audioConfigChanged_l(int event, int param = 0); 8346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames); 8356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala int16_t *mixBuffer() const { return mMixBuffer; }; 8366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala 8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual void detachAuxEffect_l(int effectId); 8386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track, 83961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int EffectId); 84061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track, 84161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala int EffectId); 842a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 8439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala virtual status_t addEffectChain_l(const sp<EffectChain>& chain); 84444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual size_t removeEffectChain_l(const sp<EffectChain>& chain); 8453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual uint32_t hasAudioSession(int sessionId); 8463a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual uint32_t getStrategyForSession_l(int sessionId); 84736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 848ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala void setStreamValid(audio_stream_type_t streamType, bool valid); 849ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala 85036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala protected: 851ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala int16_t* mMixBuffer; 8524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int mSuspended; 853d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala int mBytesWritten; 8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala private: 855228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // mMasterMute is in both PlaybackThread and in AudioFlinger. When a 8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PlaybackThread needs to find out if master-muted, it checks it's local 8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // copy rather than the one in AudioFlinger. This optimization saves a lock. 858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala bool mMasterMute; 859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala void setMasterMute_l(bool muted) { mMasterMute = muted; } 860228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala protected: 8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SortedVector< wp<Track> > mActiveTracks; 862ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala 863d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala virtual int getTrackName_l() = 0; 8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual void deleteTrackName_l(int name) = 0; 865d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala virtual uint32_t activeSleepTimeUs(); 8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual uint32_t idleSleepTimeUs() = 0; 867d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala virtual uint32_t suspendSleepTimeUs() = 0; 868d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala 8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala private: 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 871a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk friend class AudioFlinger; 872d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala friend class OutputTrack; 873d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala friend class Track; 874d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala friend class TrackBase; 875d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala friend class MixerThread; 876d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala friend class DirectOutputThread; 8774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala friend class DuplicatingThread; 8784865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 8794865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala PlaybackThread(const Client&); 8804865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala PlaybackThread& operator = (const PlaybackThread&); 8814865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 882228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala status_t addTrack_l(const sp<Track>& track); 8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void destroyTrack_l(const sp<Track>& track); 8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void removeTrack_l(const sp<Track>& track); 8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void readOutputParameters(); 887d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 888228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual status_t dumpInternals(int fd, const Vector<String16>& args); 889d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala status_t dumpTracks(int fd, const Vector<String16>& args); 890d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala 891228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala SortedVector< sp<Track> > mTracks; 892d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // mStreamTypes[] uses 1 additional stream type internally for the OutputTrack used by DuplicatingThread 89361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala stream_type_t mStreamTypes[AUDIO_STREAM_CNT + 1]; 89461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala AudioStreamOut *mOutput; 89561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala float mMasterVolume; 896a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala nsecs_t mLastWriteTime; 89744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int mNumWrites; 8983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int mNumDelayedWrites; 8993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala bool mInWrite; 9003a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala }; 9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala class MixerThread : public PlaybackThread { 90361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala public: 90461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala MixerThread (const sp<AudioFlinger>& audioFlinger, 90561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala AudioStreamOut* output, 906a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala audio_io_handle_t id, 90744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin uint32_t device, 9083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala type_t type = MIXER); 9093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual ~MixerThread(); 9103a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Thread virtuals 9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual bool threadLoop(); 9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void invalidateTracks(audio_stream_type_t streamType); 91578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual bool checkForNewParameters_l(); 9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual status_t dumpInternals(int fd, const Vector<String16>& args); 9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 91878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala protected: 91978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala mixer_state prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, 92078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala Vector< sp<Track> > *tracksToRemove); 92178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual int getTrackName_l(); 92278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual void deleteTrackName_l(int name); 92378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual uint32_t idleSleepTimeUs(); 9242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual uint32_t suspendSleepTimeUs(); 92578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala 92678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala AudioMixer* mAudioMixer; 92761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala mixer_state mPrevMixerStatus; // previous status returned by prepareTracks_l() 92861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala }; 92961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 930a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala class DirectOutputThread : public PlaybackThread { 9319e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala public: 93244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, 9343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala audio_io_handle_t id, uint32_t device); 9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual ~DirectOutputThread(); 936228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 9372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Thread virtuals 938228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual bool threadLoop(); 9393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 940228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual bool checkForNewParameters_l(); 941228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 94222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin protected: 94322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin virtual int getTrackName_l(); 94422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin virtual void deleteTrackName_l(int name); 945228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual uint32_t activeSleepTimeUs(); 9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual uint32_t idleSleepTimeUs(); 947228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala virtual uint32_t suspendSleepTimeUs(); 9489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala private: 9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp); 9519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala // volumes last sent to audio HAL with stream->set_volume() 9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FIXME use standard representation and names 9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float mLeftVolFloat; 955228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala float mRightVolFloat; 956228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint16_t mLeftVolShort; 957228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala uint16_t mRightVolShort; 9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 9609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala class DuplicatingThread : public MixerThread { 9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, 9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala audio_io_handle_t id); 9649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual ~DuplicatingThread(); 9659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 966228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // Thread virtuals 96778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual bool threadLoop(); 96878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala void addOutputTrack(MixerThread* thread); 96978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala void removeOutputTrack(MixerThread* thread); 97078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala uint32_t waitTimeMs() { return mWaitTimeMs; } 97178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala protected: 97278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala virtual uint32_t activeSleepTimeUs(); 97373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 97473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala private: 97573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala bool outputsReady(SortedVector< sp<OutputTrack> > &outputTracks); 97673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala void updateWaitTime(); 97773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 97873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala SortedVector < sp<OutputTrack> > mOutputTracks; 97973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala uint32_t mWaitTimeMs; 98073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala }; 98173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 982609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const; 983a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala MixerThread *checkMixerThread_l(audio_io_handle_t output) const; 984a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala RecordThread *checkRecordThread_l(audio_io_handle_t input) const; 985a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // no range check, AudioFlinger::mLock held 986a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala bool streamMute_l(audio_stream_type_t stream) const 987a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala { return mStreamTypes[stream].mute; } 988a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held 989a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala float streamVolume_l(audio_stream_type_t stream) const 990a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala { return mStreamTypes[stream].volume; } 991a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala void audioConfigChanged_l(int event, audio_io_handle_t ioHandle, void *param2); 992a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 993a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // allocate an audio_io_handle_t, session ID, or effect ID 994a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala uint32_t nextUniqueId(); 995a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 996a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala status_t moveEffectChain_l(int sessionId, 997a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala PlaybackThread *srcThread, 998a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala PlaybackThread *dstThread, 999a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala bool reRegister); 1000a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala PlaybackThread *primaryPlaybackThread_l(); 1001a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala uint32_t primaryOutputDevice_l(); 1002a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 1003a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala friend class AudioBuffer; 1004a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala 1005a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala // server side of the client's IAudioTrack 100682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin class TrackHandle : public android::BnAudioTrack { 100782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin public: 100882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin TrackHandle(const sp<PlaybackThread::Track>& track); 100982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin virtual ~TrackHandle(); 10109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual sp<IMemory> getCblk() const; 10119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual status_t start(pid_t tid); 10129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual void stop(); 10139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual void flush(); 10149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual void mute(bool); 101573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual void pause(); 1016d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He virtual status_t attachAuxEffect(int effectId); 101773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual status_t allocateTimedBuffer(size_t size, 101873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala sp<IMemory>* buffer); 10199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual status_t queueTimedBuffer(const sp<IMemory>& buffer, 102073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala int64_t pts); 102173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual status_t setMediaTimeTransform(const LinearTransform& xform, 10229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala int target); 102373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual status_t onTransact( 10249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 10259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala private: 10269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala const sp<PlaybackThread::Track> mTrack; 10279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala }; 10282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala friend class Client; 1030228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala friend class PlaybackThread::Track; 10319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 103361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala void removeClient_l(pid_t pid); 103461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala void removeNotificationClient(pid_t pid); 103561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 1036a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 10379e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala // record thread 103844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin class RecordThread : public ThreadBase, public AudioBufferProvider 10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1040228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala public: 10419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10423a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // record track 10433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala class RecordTrack : public TrackBase { 10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala RecordTrack(RecordThread *thread, 10469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala const sp<Client>& client, 10479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala uint32_t sampleRate, 10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_format_t format, 10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t channelMask, 10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int frameCount, 10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t flags, 10529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala int sessionId); 10539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual ~RecordTrack(); 10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual status_t start(pid_t tid); 10569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala virtual void stop(); 10579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala bool overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; } 1059609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala bool setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; } 1060609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala 10615a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala void dump(char* buffer, size_t size); 10629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala 10635a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala private: 10645a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala friend class AudioFlinger; 10659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala friend class RecordThread; 106661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 106761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala RecordTrack(const RecordTrack&); 106861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala RecordTrack& operator = (const RecordTrack&); 1069a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala 107044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual status_t getNextBuffer( 10718da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong AudioBufferProvider::Buffer* buffer, 10723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int64_t pts); 10733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 10748da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong bool mOverflow; 10758da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong }; 10768da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 10778da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong 10788da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong RecordThread(const sp<AudioFlinger>& audioFlinger, 10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala AudioStreamIn *input, 10808da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong uint32_t sampleRate, 10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t channels, 10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_io_handle_t id, 108361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala uint32_t device); 108461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual ~RecordThread(); 108561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 1086a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala virtual bool threadLoop(); 108744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin virtual status_t readyToRun(); 10883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual void onFirstRef(); 108930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala 109073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala virtual status_t initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; } 109161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala sp<AudioFlinger::RecordThread::RecordTrack> createRecordTrack_l( 109261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala const sp<AudioFlinger::Client>& client, 109361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala uint32_t sampleRate, 1094a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala audio_format_t format, 109544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin int channelMask, 10968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala int frameCount, 10973a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala uint32_t flags, 10983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int sessionId, 10993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala status_t *status); 1100174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1101d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala status_t start(RecordTrack* recordTrack); 1102d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala status_t start(RecordTrack* recordTrack, pid_t tid); 1103174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala void stop(RecordTrack* recordTrack); 11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 11054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala AudioStreamIn* getInput() const; 11064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala AudioStreamIn* clearInput(); 11074865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala virtual audio_stream_t* stream(); 11084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala 11095f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, 11105f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin int64_t pts); 11115f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 11125f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin virtual bool checkForNewParameters_l(); 11139454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala virtual String8 getParameters(const String8& keys); 11149454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala virtual void audioConfigChanged_l(int event, int param = 0); 11159454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala void readInputParameters(); 11165f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin virtual unsigned int getInputFramesLost(); 11179454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala 11189454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala virtual status_t addEffectChain_l(const sp<EffectChain>& chain); 1119d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual size_t removeEffectChain_l(const sp<EffectChain>& chain); 1120d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual uint32_t hasAudioSession(int sessionId); 1121d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala RecordTrack* track(); 1122d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 1123d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala private: 1124d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala RecordThread(); 1125d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala AudioStreamIn *mInput; 1126d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala RecordTrack* mTrack; 1127d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala sp<RecordTrack> mActiveTrack; 1128d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala Condition mStartStopCond; 1129d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala AudioResampler *mResampler; 1130d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala int32_t *mRsmpOutBuffer; 1131d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala int16_t *mRsmpInBuffer; 1132d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala size_t mRsmpInIndex; 1133d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala size_t mInputBytes; 1134d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala const int mReqChannelCount; 1135d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala const uint32_t mReqSampleRate; 1136d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala ssize_t mBytesRead; 113744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin }; 113844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 113944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // server side of the client's IAudioRecord 1140d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala class RecordHandle : public android::BnAudioRecord { 11415f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin public: 11425f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 11435f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin virtual ~RecordHandle(); 1144d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual sp<IMemory> getCblk() const; 1145d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual status_t start(pid_t tid); 1146d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala virtual void stop(); 114795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala virtual status_t onTransact( 114895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 1149ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala private: 1150ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala const sp<RecordThread::RecordTrack> mRecordTrack; 115195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala }; 115295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 115395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala //--- Audio Effect Management 115495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 115595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // EffectModule and EffectChain classes both have their own mutex to protect 115695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // state changes or resource modifications. Always respect the following order 115795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // if multiple mutexes must be acquired to avoid cross deadlock: 11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule 11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1160174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // The EffectModule class is a wrapper object controlling the effect engine implementation 11612b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // in the effect library. It prevents concurrent calls to process() and command() functions 11622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // from different client threads. It keeps a list of EffectHandle objects corresponding 11634865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala // to all client applications using this effect and notifies applications of effect state, 1164174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // control or parameter changes. It manages the activation state machine to send appropriate 1165174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // reset, enable, disable commands to effect engine and provide volume 1166174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // ramping when effects are activated/deactivated. 11676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by 116861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // the attached track(s) to accumulate their auxiliary channel. 116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala class EffectModule: public RefBase { 117061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala public: 1171a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala EffectModule(ThreadBase *thread, 117244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin const wp<AudioFlinger::EffectChain>& chain, 11738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala effect_descriptor_t *desc, 11743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int id, 11753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala int sessionId); 11763a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala virtual ~EffectModule(); 1177174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1178174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala enum effect_state { 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala IDLE, 11809454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala RESTART, 11819454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala STARTING, 11829454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala ACTIVE, 11839454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala STOPPING, 11849454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala STOPPED, 11852b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala DESTROYED 11862b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala }; 11872b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 11882b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int id() const { return mId; } 11892b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala void process(); 11902b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala void updateState(); 11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t command(uint32_t cmdCode, 119295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala uint32_t cmdSize, 119395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala void *pCmdData, 1194ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala uint32_t *replySize, 1195ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala void *pReplyData); 119695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 119795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala void reset_l(); 119895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala status_t configure(); 119995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala status_t init(); 120095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala effect_state state() const { 120195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala return mState; 1202ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala } 1203ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala uint32_t status() { 120495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala return mStatus; 1205174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 12064865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala int sessionId() const { 1207174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala return mSessionId; 1208174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala } 1209174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala status_t setEnabled(bool enabled); 12106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala bool isEnabled() const; 121161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala bool isProcessEnabled() const; 121261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 1213ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdoch void setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; } 1214a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala int16_t *inBuffer() { return mConfig.inputCfg.buffer.s16; } 121544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; } 1216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala int16_t *outBuffer() { return mConfig.outputCfg.buffer.s16; } 12173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala void setChain(const wp<EffectChain>& chain) { mChain = chain; } 1218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala void setThread(const wp<ThreadBase>& thread) { mThread = thread; } 12192b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala const wp<ThreadBase>& thread() { return mThread; } 1220b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1221b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t addHandle(const sp<EffectHandle>& handle); 1222b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala void disconnect(const wp<EffectHandle>& handle, bool unpinIfLast); 1223b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala size_t removeHandle (const wp<EffectHandle>& handle); 1224b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1225b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala effect_descriptor_t& desc() { return mDescriptor; } 1226b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala wp<EffectChain>& chain() { return mChain; } 1227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1228b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t setDevice(uint32_t device); 1229b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t setVolume(uint32_t *left, uint32_t *right, bool controller); 1230b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t setMode(audio_mode_t mode); 1231b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t start(); 1232b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t stop(); 1233b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala void setSuspended(bool suspended); 1234b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala bool suspended() const; 1235b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1236b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala sp<EffectHandle> controlHandle(); 1237b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1238b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala bool isPinned() const { return mPinned; } 1239b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala void unPin() { mPinned = false; } 1240b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1241b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 1242b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1243b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala protected: 1244b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala friend class EffectHandle; 1245b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala friend class AudioFlinger; 1246b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala bool mPinned; 1247b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1248b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala // Maximum time allocated to effect engines to complete the turn off sequence 1249d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala static const uint32_t MAX_DISABLE_TIME_MS = 10000; 1250b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1251d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala EffectModule(const EffectModule&); 1252dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin EffectModule& operator = (const EffectModule&); 1253b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1254b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t start_l(); 1255b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala status_t stop_l(); 1256b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala 1257b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvalamutable Mutex mLock; // mutex for process, commands and handles list protection 12582b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala wp<ThreadBase> mThread; // parent thread 1259228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala wp<EffectChain> mChain; // parent effect chain 12608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala int mId; // this instance unique ID 12612b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int mSessionId; // audio session ID 12622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala effect_descriptor_t mDescriptor;// effect descriptor received from effect engine 12634865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala effect_config_t mConfig; // input and output audio configuration 12644865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala effect_handle_t mEffectInterface; // Effect module C API 12654865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala status_t mStatus; // initialization status 1266aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin effect_state mState; // current activation state 1267d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala Vector< wp<EffectHandle> > mHandles; // list of client handles 1268da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // First handle in mHandles has highest priority and controls the effect module 1269d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t mMaxDisableWaitCnt; // maximum grace period before forcing an effect off after 1270d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala // sending disable command. 1271d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala uint32_t mDisableWaitCnt; // current process() calls count during disable period. 1272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool mSuspended; // effect is suspended: temporarily disabled by framework 127361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala }; 127461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 127561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // The EffectHandle class implements the IEffect interface. It provides resources 1276a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala // to receive parameter updates, keeps track of effect control 12778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // ownership and state and has a pointer to the EffectModule object it is controlling. 127844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin // There is one EffectHandle object for each application controlling (or using) 12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala // an effect module. 12803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // The EffectHandle is obtained by calling AudioFlinger::createEffect(). 12813a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala class EffectHandle: public android::BnEffect { 12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala EffectHandle(const sp<EffectModule>& effect, 12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const sp<AudioFlinger::Client>& client, 12869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala const sp<IEffectClient>& effectClient, 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t priority); 12888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala virtual ~EffectHandle(); 12898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 129061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // IEffect 1291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala virtual status_t enable(); 129261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual status_t disable(); 1293a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala virtual status_t command(uint32_t cmdCode, 12948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint32_t cmdSize, 129544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin void *pCmdData, 12963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala uint32_t *replySize, 1297ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala void *pReplyData); 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala virtual void disconnect(); 1299ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala private: 13008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala void disconnect(bool unpinIfLast); 130161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala public: 130261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual sp<IMemory> getCblk() const { return mCblkMemory; } 130361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala virtual status_t onTransact(uint32_t code, const Parcel& data, 1304a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala Parcel* reply, uint32_t flags); 130544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 13063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala 13073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala // Give or take control of effect module 1308c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala // - hasControl: true if control is given, false if removed 1309c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala // - signal: true client app should be signaled of change, false otherwise 1310c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala // - enabled: state of the effect when control is passed 1311c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala void setControl(bool hasControl, bool signal, bool enabled); 131236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void commandExecuted(uint32_t cmdCode, 131336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t cmdSize, 131436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void *pCmdData, 131536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t replySize, 131636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void *pReplyData); 131736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void setEnabled(bool enabled); 131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool enabled() const { return mEnabled; } 131936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 132036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Getters 132136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int id() const { return mEffect->id(); } 132236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int priority() const { return mPriority; } 132336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool hasControl() const { return mHasControl; } 132436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<EffectModule> effect() const { return mEffect; } 1325228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala 13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void dump(char* buffer, size_t size); 13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1328228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala protected: 132936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala friend class AudioFlinger; 133036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala friend class EffectModule; 133136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala EffectHandle(const EffectHandle&); 133236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala EffectHandle& operator =(const EffectHandle&); 133336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 133436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<EffectModule> mEffect; // pointer to controlled EffectModule 133536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<IEffectClient> mEffectClient; // callback interface for client notifications 133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala /*const*/ sp<Client> mClient; // client for shared memory allocation, see disconnect() 133736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<IMemory> mCblkMemory; // shared memory for control block 1338c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala effect_param_cblk_t* mCblk; // control block for deferred parameter setting via shared memory 133936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint8_t* mBuffer; // pointer to parameter area in shared memory 134036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int mPriority; // client application priority to control the effect 134136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool mHasControl; // true if this handle is controlling the effect 134236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool mEnabled; // cached enable state: needed when the effect is 134336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // restored after being suspended 134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala }; 134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // the EffectChain class represents a group of effects associated to one audio session. 134736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // There can be any number of EffectChain objects per output mixer thread (PlaybackThread). 134836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // The EffecChain with session ID 0 contains global effects applied to the output mix. 134936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks) 135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding 135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // in the effect process order. When attached to a track (session ID != 0), it also provide it's own 135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // input buffer used by the track as accumulation buffer. 13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala class EffectChain: public RefBase { 135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala public: 135536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala EffectChain(const wp<ThreadBase>& wThread, int sessionId); 135636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala EffectChain(ThreadBase *thread, int sessionId); 135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala virtual ~EffectChain(); 135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 135936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // special key used for an entry in mSuspendedEffects keyed vector 13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // corresponding to a suspend all request. 13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const int kKeyForSuspendAll = 0; 136273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala 136373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala // minimum duration during which we force calling effect process when last track on 136436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // a session is stopped or removed to allow effect tail to be rendered 13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const int kProcessTailDurationMs = 1000; 136636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 136736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void process_l(); 136836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 136936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void lock() { 13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mLock.lock(); 137136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void unlock() { 1373c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala mLock.unlock(); 137436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1375983cf231ab2d176a14595cdae46ff1b0c239af47James Dong 137636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala status_t addEffect_l(const sp<EffectModule>& handle); 137736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala size_t removeEffect_l(const sp<EffectModule>& handle); 137836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 137936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int sessionId() const { return mSessionId; } 138036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void setSessionId(int sessionId) { mSessionId = sessionId; } 138136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 138236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor); 138336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<EffectModule> getEffectFromId_l(int id); 138436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala sp<EffectModule> getEffectFromType_l(const effect_uuid_t *type); 138536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool setVolume_l(uint32_t *left, uint32_t *right); 138636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void setDevice_l(uint32_t device); 1387983cf231ab2d176a14595cdae46ff1b0c239af47James Dong void setMode_l(audio_mode_t mode); 138836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 1389983cf231ab2d176a14595cdae46ff1b0c239af47James Dong void setInBuffer(int16_t *buffer, bool ownsBuffer = false) { 13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mInBuffer = buffer; 139136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mOwnInBuffer = ownsBuffer; 139236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1393983cf231ab2d176a14595cdae46ff1b0c239af47James Dong int16_t *inBuffer() const { 139436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala return mInBuffer; 139536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 139636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala void setOutBuffer(int16_t *buffer) { 139736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala mOutBuffer = buffer; 139836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala } 1399ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin int16_t *outBuffer() const { 14008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala return mOutBuffer; 14018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala } 14028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void incTrackCnt() { android_atomic_inc(&mTrackCnt); } 14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void decTrackCnt() { android_atomic_dec(&mTrackCnt); } 14052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t trackCnt() const { return mTrackCnt;} 14062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); 14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mTailBufferCount = mMaxTailBuffers; } 14098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); } 14108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala int32_t activeTrackCnt() const { return mActiveTrackCnt;} 14118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t strategy() const { return mStrategy; } 14132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void setStrategy(uint32_t strategy) 14142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { mStrategy = strategy; } 14158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // suspend effect of the given type 14178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala void setEffectSuspended_l(const effect_uuid_t *type, 14188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala bool suspend); 14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // suspend all eligible effects 1420d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin void setEffectSuspendedAll_l(bool suspend); 14218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // check if effects should be suspend or restored when a given effect is enable or disabled 14228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect, 1423caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel bool enabled); 14248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t dump(int fd, const Vector<String16>& args); 14268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala protected: 14288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala friend class AudioFlinger; 14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala EffectChain(const EffectChain&); 14308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala EffectChain& operator =(const EffectChain&); 14318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 143236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala class SuspendedEffectDesc : public RefBase { 143336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala public: 1434228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala SuspendedEffectDesc() : mRefCount(0) {} 14358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 14368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala int mRefCount; 14378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala effect_uuid_t mType; 14388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala wp<EffectModule> mEffect; 1439228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala }; 14408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1441228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala // get a list of effect modules to suspend when an effect of the type 14428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // passed is enabled. 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala void getSuspendEligibleEffects(Vector< sp<EffectModule> > &effects); 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // get an effect module if it is currently enable 1446228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala sp<EffectModule> getEffectIfEnabled(const effect_uuid_t *type); 14478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // true if the effect whose descriptor is passed can be suspended 14488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // OEMs can modify the rules implemented in this method to exclude specific effect 14498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala // types or implementations from the suspend/restore mechanism. 145036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala bool isEffectEligibleForSuspend(const effect_descriptor_t& desc); 145136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala 145236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala wp<ThreadBase> mThread; // parent mixer thread 14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Mutex mLock; // mutex protecting effect list 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<sp<EffectModule> > mEffects; // list of effect modules 1455174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala int mSessionId; // audio session ID 145636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int16_t *mInBuffer; // chain input buffer 145736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int16_t *mOutBuffer; // chain output buffer 145836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala volatile int32_t mActiveTrackCnt; // number of active tracks connected 145936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala volatile int32_t mTrackCnt; // number of tracks connected 146036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala int32_t mTailBufferCount; // current effect tail buffer count 14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t mMaxTailBuffers; // maximum effect tail buffers 14622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool mOwnInBuffer; // true if the chain owns its input buffer 1463983cf231ab2d176a14595cdae46ff1b0c239af47James Dong int mVolumeCtrlIdx; // index of insert effect having control over volume 146436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t mLeftVolume; // previous volume on left channel 146536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t mRightVolume; // previous volume on right channel 146636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t mNewLeftVolume; // new volume on left channel 146736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t mNewRightVolume; // new volume on right channel 146836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala uint32_t mStrategy; // strategy for this effect chain 146936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // mSuspendedEffects lists all effect currently suspended in the chain 14708da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong // use effect type UUID timelow field as key. There is no real risk of identical 147136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala // timeLow fields among effect type UUIDs. 147236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala KeyedVector< int, sp<SuspendedEffectDesc> > mSuspendedEffects; 147336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala }; 1474c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala 1475c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala // AudioStreamOut and AudioStreamIn are immutable, so their fields are const. 147673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala // For emphasis, we could also make all pointers to them be "const *", 147761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala // but that would clutter the code unnecessarily. 147861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala 14793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala struct AudioStreamOut { 1480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala audio_hw_device_t* const hwDev; 1481160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala audio_stream_out_t* const stream; 1482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala 1483174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AudioStreamOut(audio_hw_device_t *dev, audio_stream_out_t *out) : 1484174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala hwDev(dev), stream(out) {} 1485174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala }; 1486174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1487174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala struct AudioStreamIn { 1488174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala audio_hw_device_t* const hwDev; 14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_stream_in_t* const stream; 14902b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 14912b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala AudioStreamIn(audio_hw_device_t *dev, audio_stream_in_t *in) : 14922b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala hwDev(dev), stream(in) {} 14932b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala }; 14942b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 14952b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // for mAudioSessionRefs only 14962b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala struct AudioSessionRef { 14972b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala // FIXME rename parameter names when fields get "m" prefix 14982b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala AudioSessionRef(int sessionid_, pid_t pid_) : 1499d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala sessionid(sessionid_), pid(pid_), cnt(1) {} 15002b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala const int sessionid; 15012b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala const pid_t pid; 15022b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int cnt; 15032b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala }; 15042b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 15052b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala friend class RecordThread; 15062b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala friend class PlaybackThread; 15072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enum master_volume_support { 1509174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // MVS_NONE: 1510174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Audio HAL has no support for master volume, either setting or 1511174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // getting. All master volume control must be implemented in SW by the 1512174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // AudioFlinger mixing core. 1513174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala MVS_NONE, 15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1515174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // MVS_SETONLY: 1516174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Audio HAL has support for setting master volume, but not for getting 1517174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // master volume (original HAL design did not include a getter). 1518174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // AudioFlinger needs to keep track of the last set master volume in 1519174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // addition to needing to set an initial, default, master volume at HAL 1520174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // load time. 15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala MVS_SETONLY, 1522174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1523174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // MVS_FULL: 1524174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // Audio HAL has support both for setting and getting master volume. 1525174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // AudioFlinger should send all set and get master volume requests 1526174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // directly to the HAL. 1527174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala MVS_FULL, 1528174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala }; 15294ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala 1530174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mutable Mutex mLock; 1531174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1532174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala DefaultKeyedVector< pid_t, wp<Client> > mClients; // see ~Client() 1533174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1534174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala mutable Mutex mHardwareLock; 1535174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1536174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // These two fields are immutable after onFirstRef(), so no lock needed to access 1537174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala audio_hw_device_t* mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL 1538174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala Vector<audio_hw_device_t*> mAudioHwDevs; 1539174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1540174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // for dump, indicates which hardware operation is currently in progress (but not stream ops) 1541174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala enum hardware_call_state { 1542174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_IDLE = 0, // no operation in progress 1543174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_INIT, // init_check 1544174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_OUTPUT_OPEN, // open_output_stream 1545174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_OUTPUT_CLOSE, // unused 1546174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_INPUT_OPEN, // unused 1547174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_INPUT_CLOSE, // unused 1548174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_STANDBY, // unused 15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala AUDIO_HW_SET_MASTER_VOLUME, // set_master_volume 1550174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_GET_ROUTING, // unused 1551174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_SET_ROUTING, // unused 15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala AUDIO_HW_GET_MODE, // unused 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala AUDIO_HW_SET_MODE, // set_mode 1554174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_GET_MIC_MUTE, // get_mic_mute 1555174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_SET_MIC_MUTE, // set_mic_mute 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala AUDIO_HW_SET_VOICE_VOLUME, // set_voice_volume 1557174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_SET_PARAMETER, // set_parameters 1558174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size 1559174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_GET_MASTER_VOLUME, // get_master_volume 1560174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala AUDIO_HW_GET_PARAMETER, // get_parameters 1561174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala }; 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mutable hardware_call_state mHardwareStatus; // for dump only 1564174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1565174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1566174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> > mPlaybackThreads; 1567174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala stream_type_t mStreamTypes[AUDIO_STREAM_CNT]; 1568174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1569174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // both are protected by mLock 1570174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala float mMasterVolume; 1571174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala float mMasterVolumeSW; 15724ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala master_volume_support mMasterVolumeSupportLvl; 1573174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool mMasterMute; 15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1575174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> > mRecordThreads; 1576174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1577174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala DefaultKeyedVector< pid_t, sp<NotificationClient> > mNotificationClients; 1578174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala volatile int32_t mNextUniqueId; // updated by android_atomic_inc 15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala audio_mode_t mMode; 1580174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala bool mBtNrecIsOff; 1581174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1582174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala // protected by mLock 1583174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala Vector<AudioSessionRef*> mAudioSessionRefs; 1584174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1585174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala float masterVolume_l() const; 1586a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala float masterVolumeSW_l() const { return mMasterVolumeSW; } 1587a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala bool masterMute_l() const { return mMasterMute; } 1588a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala 1589a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaprivate: 1590174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala sp<Client> registerPid_l(pid_t pid); // always returns non-0 1591174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 1592174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala}; 1593174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala 159444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 159544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// ---------------------------------------------------------------------------- 159644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin 15978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}; // namespace android 15988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala 1599174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala#endif // ANDROID_AUDIO_FLINGER_H 1600603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala