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