AudioFlinger.h revision 53cec22821072719ee02c856e9ac2dda2496c570
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 2d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** 3d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** Copyright 2007, The Android Open Source Project 4d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** 5d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** Licensed under the Apache License, Version 2.0 (the "License"); 6d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** you may not use this file except in compliance with the License. 7d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** You may obtain a copy of the License at 8d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** 9d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** http://www.apache.org/licenses/LICENSE-2.0 10d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** 11d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** Unless required by applicable law or agreed to in writing, software 12d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** distributed under the License is distributed on an "AS IS" BASIS, 13d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** See the License for the specific language governing permissions and 15d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk** limitations under the License. 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/ 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18a84bbe6b59721b1b963d65d270aa98d6513bbb78Eino-Ville Talvala#ifndef ANDROID_AUDIO_FLINGER_H 198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define ANDROID_AUDIO_FLINGER_H 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 21cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#include <stdint.h> 22cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#include <sys/types.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <limits.h> 24cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 25cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#include <common_time/cc_helper.h> 26cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <cutils/compiler.h> 28cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/IAudioFlinger.h> 3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/IAudioFlingerClient.h> 31d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <media/IAudioTrack.h> 32d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <media/IAudioRecord.h> 33d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <media/AudioSystem.h> 349c2a2c26c0d70de97f51063b06a5efc79b327eedAlex Deymo#include <media/AudioTrack.h> 352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 36ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <utils/Atomic.h> 3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Errors.h> 3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/threads.h> 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/SortedVector.h> 4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/TypeHelpers.h> 41cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#include <utils/Vector.h> 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 43b5ca4618a722a21f084fe8bfc1c2992749ccd3f0Nipun Kwatra#include <binder/BinderService.h> 44df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <binder/MemoryDealer.h> 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 46d89821ec5481e0640d84bfe3e29a1254a52ca683Eino-Ville Talvala#include <system/audio.h> 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <hardware/audio.h> 481b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <hardware/audio_policy.h> 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <media/AudioBufferProvider.h> 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/ExtendedAudioBufferProvider.h> 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "FastMixer.h" 5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/nbaio/NBAIO.h> 54d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include "AudioWatchdog.h" 5598a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen 56d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <powermanager/IPowerManager.h> 57b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk 582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <media/nbaio/NBLog.h> 59b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk#include <private/media/AudioTrackShared.h> 6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace android { 622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaclass audio_track_cblk_t; 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass effect_param_cblk_t; 657b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass AudioMixer; 667b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass AudioBuffer; 677b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass AudioResampler; 68ff3e31d2b100d8efd969b358b18e4405c49dd10dIgor Murashkinclass FastMixer; 6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass ServerProxy; 700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh// ---------------------------------------------------------------------------- 720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh// AudioFlinger has a hard-coded upper limit of 2 channels for capture and playback. 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// There is support for > 2 channel tracks down-mixed to 2 channel output via a down-mix effect. 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Adding full support for > 2 channel capture or playback would require more than simply changing 76d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala// this #define. There is an independent hard-coded upper limit in AudioMixer; 77f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala// removing that AudioMixer limit would be necessary but insufficient to support > 2 channels. 78f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala// The macro FCC_2 highlights some (but not all) places where there is are 2-channel assumptions. 79f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala// Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc. 80f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala#define FCC_2 2 // FCC_2 = Fixed Channel Count 2 81f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastatic const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3); 8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define MAX_GAIN 4096.0f 8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define MAX_GAIN_INT 0x1000 865e08d60617fc63c2e41f9069ff89f5c00db2617dEino-Ville Talvala 8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define INCLUDING_FROM_AUDIOFLINGER_H 88b8a805261bf0282e992d3608035e47d05a898710Steve Block 89b8a805261bf0282e992d3608035e47d05a898710Steve Blockclass AudioFlinger : 9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public BinderService<AudioFlinger>, 9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian public BnAudioFlinger 9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{ 9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian friend class BinderService<AudioFlinger>; // for AudioFlinger() 9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 95d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; } 96d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 97d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16>& args); 98d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 99d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // IAudioFlinger interface, in binder opcode order 100d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual sp<IAudioTrack> createTrack( 101d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala audio_stream_type_t streamType, 102d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala uint32_t sampleRate, 103d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala audio_format_t format, 104d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala audio_channel_mask_t channelMask, 105d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala size_t frameCount, 10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian IAudioFlinger::track_flags_t *flags, 10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian const sp<IMemory>& sharedBuffer, 108cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin audio_io_handle_t output, 109cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin pid_t tid, 110cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin int *sessionId, 111cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin String8& name, 112cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin status_t *status); 113cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 114cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual sp<IAudioRecord> openRecord( 115f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala audio_io_handle_t input, 116cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin uint32_t sampleRate, 117f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala audio_format_t format, 118f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala audio_channel_mask_t channelMask, 119f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala size_t frameCount, 120f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala IAudioFlinger::track_flags_t *flags, 121f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala pid_t tid, 122f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala int *sessionId, 123f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala status_t *status); 124f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 125f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual uint32_t sampleRate(audio_io_handle_t output) const; 126f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual int channelCount(audio_io_handle_t output) const; 127f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual audio_format_t format(audio_io_handle_t output) const; 128f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual size_t frameCount(audio_io_handle_t output) const; 129f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual uint32_t latency(audio_io_handle_t output) const; 130f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 131f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual status_t setMasterVolume(float value); 132f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual status_t setMasterMute(bool muted); 133cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 1343068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual float masterVolume() const; 1353068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual bool masterMute() const; 1363068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 1373068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 1383068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_io_handle_t output); 1393068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual status_t setStreamMute(audio_stream_type_t stream, bool muted); 1403068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 1413068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual float streamVolume(audio_stream_type_t stream, 1423068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_io_handle_t output) const; 1433068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual bool streamMute(audio_stream_type_t stream) const; 1443068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 1453068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual status_t setMode(audio_mode_t mode); 146f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 1473068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual status_t setMicMute(bool state); 14888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen virtual bool getMicMute() const; 149f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 1503068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs); 15188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const; 152f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 15388da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen virtual void registerClient(const sp<IAudioFlingerClient>& client); 15488da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen 155f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 1563068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_channel_mask_t channelMask) const; 1573068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 1583068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen virtual audio_io_handle_t openOutput(audio_module_handle_t module, 1593068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_devices_t *pDevices, 1603068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen uint32_t *pSamplingRate, 1613068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_format_t *pFormat, 1623068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_channel_mask_t *pChannelMask, 16388da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen uint32_t *pLatencyMs, 1643068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_output_flags_t flags, 1653068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen const audio_offload_info_t *offloadInfo); 166cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 167cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian audio_io_handle_t output2); 16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 17049c9705a7987b94bd53fddd4834f5f534cf946f7Eino-Ville Talvala virtual status_t closeOutput(audio_io_handle_t output); 17149c9705a7987b94bd53fddd4834f5f534cf946f7Eino-Ville Talvala 172d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual status_t suspendOutput(audio_io_handle_t output); 1732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 174df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block virtual status_t restoreOutput(audio_io_handle_t output); 175bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin 176cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual audio_io_handle_t openInput(audio_module_handle_t module, 1773068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_devices_t *pDevices, 1783068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen uint32_t *pSamplingRate, 179cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk audio_format_t *pFormat, 1808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev audio_channel_mask_t *pChannelMask); 18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev virtual status_t closeInput(audio_io_handle_t input); 1838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 184cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output); 185634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin 1868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev virtual status_t setVoiceVolume(float volume); 18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 18899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames, 18999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audio_io_handle_t output) const; 19099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 19199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk virtual unsigned int getInputFramesLost(audio_io_handle_t ioHandle) const; 19299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 1932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual int newAudioSessionId(); 1949cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala 1959cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala virtual void acquireAudioSessionId(int audioSession); 1969cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala 1979cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala virtual void releaseAudioSessionId(int audioSession); 1982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1999cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala virtual status_t queryNumberEffects(uint32_t *numEffects) const; 2009cbbc837625cced18adabc57d71479044999155dEino-Ville Talvala 2012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const; 2022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 2042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala effect_descriptor_t *descriptor) const; 2052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual sp<IEffect> createEffect( 2072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala effect_descriptor_t *pDesc, 2082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<IEffectClient>& effectClient, 2092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int32_t priority, 210e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh audio_io_handle_t io, 2111527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int sessionId, 2121527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala status_t *status, 2131527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int *id, 2141527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int *enabled); 2151527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput, 2178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev audio_io_handle_t dstOutput); 21888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen 2191527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual audio_module_handle_t loadHwModule(const char *name); 2201527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2211527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual uint32_t getPrimaryOutputSamplingRate(); 2221527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual size_t getPrimaryOutputFrameCount(); 2231527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2241527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual status_t setLowRamDevice(bool isLowRamDevice); 225cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 2261527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual status_t onTransact( 2271527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala uint32_t code, 2282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const Parcel& data, 2291527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala Parcel* reply, 230a84bbe6b59721b1b963d65d270aa98d6513bbb78Eino-Ville Talvala uint32_t flags); 231cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 2321527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // end of IAudioFlinger interface 233bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 2343068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen sp<NBLog::Writer> newWriter_l(size_t size, const char *name); 235d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yeh void unregisterWriter(const sp<NBLog::Writer>& writer); 236d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yehprivate: 237d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yeh static const size_t kLogMemorySize = 10 * 1024; 238d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yeh sp<MemoryDealer> mLogMemoryDealer; // == 0 when NBLog is disabled 239d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yehpublic: 240d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yeh 241d4a653a15767d4de37dbfdee22c2170951c93299Yin-Chia Yeh class SyncEvent; 2422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2431527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ; 2441527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2451527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala class SyncEvent : public RefBase { 2461527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala public: 2471527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala SyncEvent(AudioSystem::sync_event_t type, 2481527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int triggerSession, 249bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala int listenerSession, 2501527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala sync_event_callback_t callBack, 2511527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala void *cookie) 2521527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession), 253bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala mCallback(callBack), mCookie(cookie) 254bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala {} 255bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 256bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala virtual ~SyncEvent() {} 257bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 258bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); } 259bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); } 260bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; } 261bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala AudioSystem::sync_event_t type() const { return mType; } 262bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala int triggerSession() const { return mTriggerSession; } 263bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala int listenerSession() const { return mListenerSession; } 264bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala void *cookie() const { return mCookie; } 265bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 266bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala private: 267bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala const AudioSystem::sync_event_t mType; 268bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala const int mTriggerSession; 269bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala const int mListenerSession; 2702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sync_event_callback_t mCallback; 271bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala void * const mCookie; 272bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala mutable Mutex mLock; 273bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala }; 2741527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2751527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type, 2761527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int triggerSession, 2771527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala int listenerSession, 2781527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala sync_event_callback_t callBack, 2791527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala void *cookie); 280bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 281bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvalaprivate: 282bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala class AudioHwDevice; // fwd declaration for findSuitableHwDev_l 283bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 2848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev audio_mode_t getMode() const { return mMode; } 285cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 2861527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala bool btNrecIsOff() const { return mBtNrecIsOff; } 2871527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2881527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala AudioFlinger() ANDROID_API; 289cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual ~AudioFlinger(); 29098e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin 2911527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // call in any IAudioFlinger method that accesses mPrimaryHardwareDev 2921527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala status_t initCheck() const { return mPrimaryHardwareDev == NULL ? 2931527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala NO_INIT : NO_ERROR; } 2941527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 2951527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // RefBase 2961527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala virtual void onFirstRef(); 297d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 2981527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala AudioHwDevice* findSuitableHwDev_l(audio_module_handle_t module, 2991527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala audio_devices_t devices); 300f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void purgeStaleEffects_l(); 301d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 3021527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // standby delay for MIXER and DUPLICATING playback threads is read from property 3031527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs 3041527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala static nsecs_t mStandbyTimeInNsecs; 3051527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala 3061527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // incremented by 2 when screen state changes, bit 0 == 1 means "off" 3071527f07eb2b2b40f6b8f53a4644e6a400bddb460Eino-Ville Talvala // AudioFlinger::setParameters() updates, other threads read w/o lock 3082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static uint32_t mScreenState; 3092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Internal dump utilities. 3112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static const int kDumpLockRetries = 50; 3122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static const int kDumpLockSleepUs = 20000; 3132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static bool dumpTryLock(Mutex& mutex); 3142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala void dumpPermissionDenial(int fd, const Vector<String16>& args); 3152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala void dumpClients(int fd, const Vector<String16>& args); 3162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala void dumpInternals(int fd, const Vector<String16>& args); 3172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // --- Client --- 3192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala class Client : public RefBase { 3202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala public: 3212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Client(const sp<AudioFlinger>& audioFlinger, pid_t pid); 3222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual ~Client(); 3232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<MemoryDealer> heap() const; 324067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh pid_t pid() const { return mPid; } 325067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<AudioFlinger> audioFlinger() const { return mAudioFlinger; } 326067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 327067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh bool reserveTimedTrack(); 3282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala void releaseTimedTrack(); 3292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala private: 3312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Client(const Client&); 3322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Client& operator = (const Client&); 3332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<AudioFlinger> mAudioFlinger; 3342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<MemoryDealer> mMemoryDealer; 3352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const pid_t mPid; 3362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Mutex mTimedTrackLock; 3382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int mTimedTrackCount; 3392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }; 3402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // --- Notification Client --- 3422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala class NotificationClient : public IBinder::DeathRecipient { 3432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala public: 3442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala NotificationClient(const sp<AudioFlinger>& audioFlinger, 3452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<IAudioFlingerClient>& client, 3462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala pid_t pid); 3472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual ~NotificationClient(); 3482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; } 3502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // IBinder::DeathRecipient 3522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala virtual void binderDied(const wp<IBinder>& who); 3532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala private: 3552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala NotificationClient(const NotificationClient&); 3562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala NotificationClient& operator = (const NotificationClient&); 3572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<AudioFlinger> mAudioFlinger; 3592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const pid_t mPid; 3602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const sp<IAudioFlingerClient> mAudioFlingerClient; 3612823ce0ce6f9d508a07de20912c93cce9165027fRuben Brunk }; 3622823ce0ce6f9d508a07de20912c93cce9165027fRuben Brunk 3632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala class TrackHandle; 364412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala class RecordHandle; 36592c06fceabfa47906aaa7c747dcdd6376ccec358Christopher Wiley class RecordThread; 36692c06fceabfa47906aaa7c747dcdd6376ccec358Christopher Wiley class PlaybackThread; 3672823ce0ce6f9d508a07de20912c93cce9165027fRuben Brunk class MixerThread; 368f4db13db84c40299de4f9997f08d05259bdb8716Eino-Ville Talvala class DirectOutputThread; 369f4db13db84c40299de4f9997f08d05259bdb8716Eino-Ville Talvala class OffloadThread; 370f4db13db84c40299de4f9997f08d05259bdb8716Eino-Ville Talvala class DuplicatingThread; 371f4db13db84c40299de4f9997f08d05259bdb8716Eino-Ville Talvala class AsyncCallbackThread; 37292c06fceabfa47906aaa7c747dcdd6376ccec358Christopher Wiley class Track; 37392c06fceabfa47906aaa7c747dcdd6376ccec358Christopher Wiley class RecordTrack; 3742823ce0ce6f9d508a07de20912c93cce9165027fRuben Brunk class EffectModule; 37592c06fceabfa47906aaa7c747dcdd6376ccec358Christopher Wiley class EffectHandle; 376412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala class EffectChain; 377412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala struct AudioStreamOut; 378412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala struct AudioStreamIn; 379412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala 380412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala struct stream_type_t { 381412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala stream_type_t() 3822823ce0ce6f9d508a07de20912c93cce9165027fRuben Brunk : volume(1.0f), 38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian mute(false) 38465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian { 38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian } 386e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh float volume; 387e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh bool mute; 388cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk }; 389e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh 390d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk // --- PlaybackThread --- 39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 39265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "Threads.h" 393f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 394f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala#include "Effects.h" 395f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 396f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala // server side of the client's IAudioTrack 397f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala class TrackHandle : public android::BnAudioTrack { 398f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala public: 399cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin TrackHandle(const sp<PlaybackThread::Track>& track); 400cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual ~TrackHandle(); 401cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual sp<IMemory> getCblk() const; 402cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual status_t start(); 403f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual void stop(); 404cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual void flush(); 405cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual void pause(); 406cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual status_t attachAuxEffect(int effectId); 407f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual status_t allocateTimedBuffer(size_t size, 408cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk sp<IMemory>* buffer); 409f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual status_t queueTimedBuffer(const sp<IMemory>& buffer, 410cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk int64_t pts); 411cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual status_t setMediaTimeTransform(const LinearTransform& xform, 412cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin int target); 413cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual status_t setParameters(const String8& keyValuePairs); 414f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual status_t getTimestamp(AudioTimestamp& timestamp); 415a8ca9157d21510fbd474bd31748f4fe0d4635dd7Ruben Brunk 416a8ca9157d21510fbd474bd31748f4fe0d4635dd7Ruben Brunk virtual status_t onTransact( 417cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 418cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 419cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk private: 420cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk const sp<PlaybackThread::Track> mTrack; 421cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin }; 422cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 423cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk // server side of the client's IAudioRecord 424f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala class RecordHandle : public android::BnAudioRecord { 425cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin public: 426cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack); 427cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual ~RecordHandle(); 428cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin virtual sp<IMemory> getCblk() const; 429cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual status_t start(int /*AudioSystem::sync_event_t*/ event, int triggerSession); 430cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual void stop(); 431cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk virtual status_t onTransact( 432cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 433d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala private: 434d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<RecordThread::RecordTrack> mRecordTrack; 435cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 436cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin // for use from destructor 437cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin void stop_nonvirtual(); 438cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk }; 439cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 440cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin 441cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const; 442cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk MixerThread *checkMixerThread_l(audio_io_handle_t output) const; 443cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk RecordThread *checkRecordThread_l(audio_io_handle_t input) const; 444cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk // no range check, AudioFlinger::mLock held 445cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk bool streamMute_l(audio_stream_type_t stream) const 446cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk { return mStreamTypes[stream].mute; } 447cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held 448cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk float streamVolume_l(audio_stream_type_t stream) const 449cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk { return mStreamTypes[stream].volume; } 450f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void audioConfigChanged_l(int event, audio_io_handle_t ioHandle, const void *param2); 451a8ca9157d21510fbd474bd31748f4fe0d4635dd7Ruben Brunk 452a8ca9157d21510fbd474bd31748f4fe0d4635dd7Ruben Brunk // allocate an audio_io_handle_t, session ID, or effect ID 453a8ca9157d21510fbd474bd31748f4fe0d4635dd7Ruben Brunk uint32_t nextUniqueId(); 454f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 455cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk status_t moveEffectChain_l(int sessionId, 456cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin PlaybackThread *srcThread, 457cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin PlaybackThread *dstThread, 458cba2c163555cd329f49d40658ea3ee902e94dda3Igor Murashkin bool reRegister); 45988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen // return thread associated with primary hardware device, or NULL 460f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala PlaybackThread *primaryPlaybackThread_l() const; 4613068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audio_devices_t primaryOutputDevice_l() const; 4623068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 4633068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen sp<PlaybackThread> getEffectThread_l(int sessionId, int EffectId); 4643068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 46588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen 466f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala void removeClient_l(pid_t pid); 4673068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen void removeNotificationClient(pid_t pid); 4683068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 4693068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen class AudioHwDevice { 470f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala public: 47188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen enum Flags { 47288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen AHWD_CAN_SET_MASTER_VOLUME = 0x1, 473f6463fc62a09b8aad8e811a9abbe9f4d9f2688f9Chien-Yu Chen AHWD_CAN_SET_MASTER_MUTE = 0x2, 474f6463fc62a09b8aad8e811a9abbe9f4d9f2688f9Chien-Yu Chen }; 47588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen 47688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen AudioHwDevice(const char *moduleName, 47788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen audio_hw_device_t *hwDevice, 4783068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen Flags flags) 4793068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen : mModuleName(strdup(moduleName)) 4803068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen , mHwDevice(hwDevice) 48188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen , mFlags(flags) { } 4823068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); } 483d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala 484d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala bool canSetMasterVolume() const { 4853068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME)); 4863068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen } 4873068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen 488cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk bool canSetMasterMute() const { 48999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE)); 490fe751bea0d3eedd6e817aebf4e457425b82e7117Chien-Yu Chen } 49199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 49299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const char *moduleName() const { return mModuleName; } 49399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audio_hw_device_t *hwDevice() const { return mHwDevice; } 49499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk private: 49599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const char * const mModuleName; 49699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audio_hw_device_t * const mHwDevice; 49799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Flags mFlags; 498f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala }; 49999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 50099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // AudioStreamOut and AudioStreamIn are immutable, so their fields are const. 501f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala // For emphasis, we could also make all pointers to them be "const *", 50299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // but that would clutter the code unnecessarily. 50399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 50499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk struct AudioStreamOut { 50599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk AudioHwDevice* const audioHwDev; 50699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audio_stream_out_t* const stream; 507f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala audio_output_flags_t flags; 50899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 50999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); } 51099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 51199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk AudioStreamOut(AudioHwDevice *dev, audio_stream_out_t *out, audio_output_flags_t flags) : 51299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk audioHwDev(dev), stream(out), flags(flags) {} 51399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk }; 51499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 51599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk struct AudioStreamIn { 51699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk AudioHwDevice* const audioHwDev; 517cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk audio_stream_in_t* const stream; 518cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 519f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); } 520cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 5213068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen AudioStreamIn(AudioHwDevice *dev, audio_stream_in_t *in) : 5223068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen audioHwDev(dev), stream(in) {} 5233068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen }; 524d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 525a84bbe6b59721b1b963d65d270aa98d6513bbb78Eino-Ville Talvala // for mAudioSessionRefs only 526bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala struct AudioSessionRef { 527bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala AudioSessionRef(int sessionid, pid_t pid) : 528d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mSessionid(sessionid), mPid(pid), mCnt(1) {} 529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const int mSessionid; 530bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala const pid_t mPid; 531d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int mCnt; 532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala }; 533bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 534d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mutable Mutex mLock; 535bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala 536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala DefaultKeyedVector< pid_t, wp<Client> > mClients; // see ~Client() 537d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 538bad4358c83c7daaf9eeb8542c15eea4f473c884cEino-Ville Talvala mutable Mutex mHardwareLock; 539d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // NOTE: If both mLock and mHardwareLock mutexes must be held, 54065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // always take mLock before mHardwareLock 54165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 542d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // These two fields are immutable after onFirstRef(), so no lock needed to access 543d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala AudioHwDevice* mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL 544a84bbe6b59721b1b963d65d270aa98d6513bbb78Eino-Ville Talvala DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*> mAudioHwDevs; 5452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 546d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // for dump, indicates which hardware operation is currently in progress (but not stream ops) 547d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala enum hardware_call_state { 5488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev AUDIO_HW_IDLE = 0, // no operation in progress 5498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev AUDIO_HW_INIT, // init_check 55065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AUDIO_HW_OUTPUT_OPEN, // open_output_stream 551d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala AUDIO_HW_OUTPUT_CLOSE, // unused 552d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala AUDIO_HW_INPUT_OPEN, // unused 55365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AUDIO_HW_INPUT_CLOSE, // unused 55465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AUDIO_HW_STANDBY, // unused 5552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_MASTER_VOLUME, // set_master_volume 5562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_ROUTING, // unused 5572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_ROUTING, // unused 5582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_MODE, // unused 5592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_MODE, // set_mode 5602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_MIC_MUTE, // get_mic_mute 5612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_MIC_MUTE, // set_mic_mute 5622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_VOICE_VOLUME, // set_voice_volume 5632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_PARAMETER, // set_parameters 5642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size 5652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_MASTER_VOLUME, // get_master_volume 5662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_PARAMETER, // get_parameters 5672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_SET_MASTER_MUTE, // set_master_mute 5682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala AUDIO_HW_GET_MASTER_MUTE, // get_master_mute 5692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }; 5702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mutable hardware_call_state mHardwareStatus; // for dump only 5722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> > mPlaybackThreads; 5752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala stream_type_t mStreamTypes[AUDIO_STREAM_CNT]; 5769b5a6e9a667f85adeddea787a9f609d9cde84ef4Yin-Chia Yeh 577d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // member variables below are protected by mLock 5782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala float mMasterVolume; 57965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian bool mMasterMute; 58065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // end of variables protected by mLock 581cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 5822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> > mRecordThreads; 5832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DefaultKeyedVector< pid_t, sp<NotificationClient> > mNotificationClients; 585cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk volatile int32_t mNextUniqueId; // updated by android_atomic_inc 586cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk audio_mode_t mMode; 5872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool mBtNrecIsOff; 588cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 589b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk // protected by mLock 5902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Vector<AudioSessionRef*> mAudioSessionRefs; 591f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 592a84bbe6b59721b1b963d65d270aa98d6513bbb78Eino-Ville Talvala float masterVolume_l() const; 5932b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He bool masterMute_l() const; 5942b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He audio_module_handle_t loadHwModule_l(const char *name); 595d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 5962b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session 5972b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // to be created 5982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaprivate: 600d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<Client> registerPid_l(pid_t pid); // always returns non-0 601d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 6022b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // for use from destructor 6032b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He status_t closeOutput_nonvirtual(audio_io_handle_t output); 6042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t closeInput_nonvirtual(audio_io_handle_t input); 605f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala 6062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#ifdef TEE_SINK 6072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // all record threads serially share a common tee sink, which is re-created on format change 6082b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He sp<NBAIO_Sink> mRecordTeeSink; 6092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<NBAIO_Source> mRecordTeeSource; 6102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#endif 6112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalapublic: 6132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#ifdef TEE_SINK 6152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // tee sink, if enabled by property, allows dumpsys to write most recent audio to .wav file 6162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static void dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id = 0); 6172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // whether tee sink is enabled by property 6192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static bool mTeeSinkInputEnabled; 6202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static bool mTeeSinkOutputEnabled; 6212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static bool mTeeSinkTrackEnabled; 6222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // runtime configured size of each tee sink pipe, in frames 6242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static size_t mTeeSinkInputFrames; 6252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static size_t mTeeSinkOutputFrames; 6262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static size_t mTeeSinkTrackFrames; 6272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // compile-time default size of tee sink pipes, in frames 6292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // 0x200000 stereo 16-bit PCM frames = 47.5 seconds at 44.1 kHz, 8 megabytes 6302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static const size_t kTeeSinkInputFramesDefault = 0x200000; 6312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static const size_t kTeeSinkOutputFramesDefault = 0x200000; 6322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala static const size_t kTeeSinkTrackFramesDefault = 0x1000; 6332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#endif 634f05e50eb06d3f70e50fa7f44c1fd32128033b49dZhijun He 635f05e50eb06d3f70e50fa7f44c1fd32128033b49dZhijun He // This method reads from a variable without mLock, but the variable is updated under mLock. So 6362b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // we might read a stale value, or a value that's inconsistent with respect to other variables. 6372b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // In this case, it's safe because the return value isn't used for making an important decision. 6382b59be89dc245b6e2475d9e8b0c5f2392370e71eZhijun He // The reason we don't want to take mLock is because it could block the caller for a long time. 639cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk bool isLowRamDevice() const { return mIsLowRamDevice; } 640cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 641cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunkprivate: 642cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk bool mIsLowRamDevice; 643cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk bool mIsDeviceTypeKnown; 644cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk}; 645cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 646cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#undef INCLUDING_FROM_AUDIOFLINGER_H 647cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 648cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk// ---------------------------------------------------------------------------- 649cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 650cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk}; // namespace android 651cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk 652cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk#endif // ANDROID_AUDIO_FLINGER_H 653cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk