1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <common/all-versions/IncludeGuard.h>
18
19#include <memory>
20
21#include <hardware/audio.h>
22#include <media/AudioParameter.h>
23
24#include <hidl/Status.h>
25
26#include <hidl/MQDescriptor.h>
27
28#include <VersionUtils.h>
29
30namespace android {
31namespace hardware {
32namespace audio {
33namespace AUDIO_HAL_VERSION {
34namespace implementation {
35
36using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioConfig;
37using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioHwSync;
38using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioInputFlag;
39using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioOutputFlag;
40using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPatchHandle;
41using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPort;
42using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPortConfig;
43using ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioSource;
44using ::android::hardware::audio::common::AUDIO_HAL_VERSION::implementation::AudioInputFlagBitfield;
45using ::android::hardware::audio::common::AUDIO_HAL_VERSION::implementation::
46    AudioOutputFlagBitfield;
47using ::android::hardware::audio::AUDIO_HAL_VERSION::DeviceAddress;
48using ::android::hardware::audio::AUDIO_HAL_VERSION::IDevice;
49using ::android::hardware::audio::AUDIO_HAL_VERSION::IStreamIn;
50using ::android::hardware::audio::AUDIO_HAL_VERSION::IStreamOut;
51using ::android::hardware::audio::AUDIO_HAL_VERSION::ParameterValue;
52using ::android::hardware::audio::AUDIO_HAL_VERSION::Result;
53using ::android::hardware::Return;
54using ::android::hardware::Void;
55using ::android::hardware::hidl_vec;
56using ::android::hardware::hidl_string;
57using ::android::sp;
58
59#ifdef AUDIO_HAL_VERSION_4_0
60using ::android::hardware::audio::AUDIO_HAL_VERSION::SourceMetadata;
61using ::android::hardware::audio::AUDIO_HAL_VERSION::SinkMetadata;
62#endif
63
64struct Device : public IDevice, public ParametersUtil {
65    explicit Device(audio_hw_device_t* device);
66
67    // Methods from ::android::hardware::audio::AUDIO_HAL_VERSION::IDevice follow.
68    Return<Result> initCheck() override;
69    Return<Result> setMasterVolume(float volume) override;
70    Return<void> getMasterVolume(getMasterVolume_cb _hidl_cb) override;
71    Return<Result> setMicMute(bool mute) override;
72    Return<void> getMicMute(getMicMute_cb _hidl_cb) override;
73    Return<Result> setMasterMute(bool mute) override;
74    Return<void> getMasterMute(getMasterMute_cb _hidl_cb) override;
75    Return<void> getInputBufferSize(const AudioConfig& config,
76                                    getInputBufferSize_cb _hidl_cb) override;
77
78    // V2 openInputStream is called by V4 input stream thus present in both versions
79    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
80                                 const AudioConfig& config, AudioInputFlagBitfield flags,
81                                 AudioSource source, openInputStream_cb _hidl_cb);
82#ifdef AUDIO_HAL_VERSION_2_0
83    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
84                                  const AudioConfig& config, AudioOutputFlagBitfield flags,
85                                  openOutputStream_cb _hidl_cb) override;
86#elif defined(AUDIO_HAL_VERSION_4_0)
87    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
88                                  const AudioConfig& config, AudioOutputFlagBitfield flags,
89                                  const SourceMetadata& sourceMetadata,
90                                  openOutputStream_cb _hidl_cb) override;
91    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
92                                 const AudioConfig& config, AudioInputFlagBitfield flags,
93                                 const SinkMetadata& sinkMetadata,
94                                 openInputStream_cb _hidl_cb) override;
95#endif
96
97    Return<bool> supportsAudioPatches() override;
98    Return<void> createAudioPatch(const hidl_vec<AudioPortConfig>& sources,
99                                  const hidl_vec<AudioPortConfig>& sinks,
100                                  createAudioPatch_cb _hidl_cb) override;
101    Return<Result> releaseAudioPatch(int32_t patch) override;
102    Return<void> getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) override;
103    Return<Result> setAudioPortConfig(const AudioPortConfig& config) override;
104
105    Return<Result> setScreenState(bool turnedOn) override;
106
107#ifdef AUDIO_HAL_VERSION_2_0
108    Return<AudioHwSync> getHwAvSync() override;
109    Return<void> getParameters(const hidl_vec<hidl_string>& keys,
110                               getParameters_cb _hidl_cb) override;
111    Return<Result> setParameters(const hidl_vec<ParameterValue>& parameters) override;
112    Return<void> debugDump(const hidl_handle& fd) override;
113#elif defined(AUDIO_HAL_VERSION_4_0)
114    Return<void> getHwAvSync(getHwAvSync_cb _hidl_cb) override;
115    Return<void> getParameters(const hidl_vec<ParameterValue>& context,
116                               const hidl_vec<hidl_string>& keys,
117                               getParameters_cb _hidl_cb) override;
118    Return<Result> setParameters(const hidl_vec<ParameterValue>& context,
119                                 const hidl_vec<ParameterValue>& parameters) override;
120    Return<void> getMicrophones(getMicrophones_cb _hidl_cb) override;
121    Return<Result> setConnectedState(const DeviceAddress& address, bool connected) override;
122#endif
123
124    Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
125
126    // Utility methods for extending interfaces.
127    Result analyzeStatus(const char* funcName, int status);
128    void closeInputStream(audio_stream_in_t* stream);
129    void closeOutputStream(audio_stream_out_t* stream);
130    audio_hw_device_t* device() const { return mDevice; }
131
132   private:
133    audio_hw_device_t* mDevice;
134
135    virtual ~Device();
136
137    // Methods from ParametersUtil.
138    char* halGetParameters(const char* keys) override;
139    int halSetParameters(const char* keysAndValues) override;
140
141    uint32_t version() const { return mDevice->common.version; }
142};
143
144}  // namespace implementation
145}  // namespace AUDIO_HAL_VERSION
146}  // namespace audio
147}  // namespace hardware
148}  // namespace android
149