110548295023bee99108e418499aff09fe578211eMikhail Naganov/*
210548295023bee99108e418499aff09fe578211eMikhail Naganov * Copyright (C) 2016 The Android Open Source Project
310548295023bee99108e418499aff09fe578211eMikhail Naganov *
410548295023bee99108e418499aff09fe578211eMikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License");
510548295023bee99108e418499aff09fe578211eMikhail Naganov * you may not use this file except in compliance with the License.
610548295023bee99108e418499aff09fe578211eMikhail Naganov * You may obtain a copy of the License at
710548295023bee99108e418499aff09fe578211eMikhail Naganov *
810548295023bee99108e418499aff09fe578211eMikhail Naganov *      http://www.apache.org/licenses/LICENSE-2.0
910548295023bee99108e418499aff09fe578211eMikhail Naganov *
1010548295023bee99108e418499aff09fe578211eMikhail Naganov * Unless required by applicable law or agreed to in writing, software
1110548295023bee99108e418499aff09fe578211eMikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS,
1210548295023bee99108e418499aff09fe578211eMikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1310548295023bee99108e418499aff09fe578211eMikhail Naganov * See the License for the specific language governing permissions and
1410548295023bee99108e418499aff09fe578211eMikhail Naganov * limitations under the License.
1510548295023bee99108e418499aff09fe578211eMikhail Naganov */
1610548295023bee99108e418499aff09fe578211eMikhail Naganov
17e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocard#include <common/all-versions/IncludeGuard.h>
1810548295023bee99108e418499aff09fe578211eMikhail Naganov
1910548295023bee99108e418499aff09fe578211eMikhail Naganov#include <memory>
2010548295023bee99108e418499aff09fe578211eMikhail Naganov
2110548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hardware/audio.h>
2282cb03632c15976838407c231fd85804de9bf84cKevin Rocard#include <media/AudioParameter.h>
2310548295023bee99108e418499aff09fe578211eMikhail Naganov
2410548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hidl/Status.h>
2510548295023bee99108e418499aff09fe578211eMikhail Naganov
2610548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hidl/MQDescriptor.h>
2710548295023bee99108e418499aff09fe578211eMikhail Naganov
285ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#include <VersionUtils.h>
295ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
3010548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android {
3110548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware {
3210548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio {
33e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardnamespace AUDIO_HAL_VERSION {
3410548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation {
3510548295023bee99108e418499aff09fe578211eMikhail Naganov
36e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioConfig;
37e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioHwSync;
38e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioInputFlag;
39e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioOutputFlag;
40e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPatchHandle;
41e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPort;
42e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioPortConfig;
43e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::AudioSource;
445ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::implementation::AudioInputFlagBitfield;
455ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocardusing ::android::hardware::audio::common::AUDIO_HAL_VERSION::implementation::
465ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    AudioOutputFlagBitfield;
47e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::DeviceAddress;
48e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::IDevice;
49e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::IStreamIn;
50e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::IStreamOut;
51e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::ParameterValue;
52e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::Result;
5310548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::Return;
5410548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::Void;
5510548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::hidl_vec;
5610548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::hidl_string;
5710548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::sp;
5810548295023bee99108e418499aff09fe578211eMikhail Naganov
595ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#ifdef AUDIO_HAL_VERSION_4_0
605ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::SourceMetadata;
615ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocardusing ::android::hardware::audio::AUDIO_HAL_VERSION::SinkMetadata;
625ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#endif
635ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
6486685f56da0941027406d1ffba67bd4272faa526Mikhail Naganovstruct Device : public IDevice, public ParametersUtil {
65f811acf049b785ccce05a9fca9e01aa2031ab357Mikhail Naganov    explicit Device(audio_hw_device_t* device);
6610548295023bee99108e418499aff09fe578211eMikhail Naganov
67e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocard    // Methods from ::android::hardware::audio::AUDIO_HAL_VERSION::IDevice follow.
6882cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> initCheck() override;
6982cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setMasterVolume(float volume) override;
7082cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getMasterVolume(getMasterVolume_cb _hidl_cb) override;
7182cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setMicMute(bool mute) override;
7282cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getMicMute(getMicMute_cb _hidl_cb) override;
7382cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setMasterMute(bool mute) override;
7482cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getMasterMute(getMasterMute_cb _hidl_cb) override;
7582cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getInputBufferSize(const AudioConfig& config,
7682cb03632c15976838407c231fd85804de9bf84cKevin Rocard                                    getInputBufferSize_cb _hidl_cb) override;
775ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
785ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    // V2 openInputStream is called by V4 input stream thus present in both versions
795ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
805ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 const AudioConfig& config, AudioInputFlagBitfield flags,
815ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 AudioSource source, openInputStream_cb _hidl_cb);
825ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#ifdef AUDIO_HAL_VERSION_2_0
8382cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
845ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                  const AudioConfig& config, AudioOutputFlagBitfield flags,
855ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                  openOutputStream_cb _hidl_cb) override;
865ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#elif defined(AUDIO_HAL_VERSION_4_0)
875ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> openOutputStream(int32_t ioHandle, const DeviceAddress& device,
885ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                  const AudioConfig& config, AudioOutputFlagBitfield flags,
895ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                  const SourceMetadata& sourceMetadata,
9082cb03632c15976838407c231fd85804de9bf84cKevin Rocard                                  openOutputStream_cb _hidl_cb) override;
9182cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> openInputStream(int32_t ioHandle, const DeviceAddress& device,
925ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 const AudioConfig& config, AudioInputFlagBitfield flags,
935ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 const SinkMetadata& sinkMetadata,
945ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 openInputStream_cb _hidl_cb) override;
955ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#endif
965ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
9782cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<bool> supportsAudioPatches() override;
9882cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> createAudioPatch(const hidl_vec<AudioPortConfig>& sources,
9982cb03632c15976838407c231fd85804de9bf84cKevin Rocard                                  const hidl_vec<AudioPortConfig>& sinks,
10082cb03632c15976838407c231fd85804de9bf84cKevin Rocard                                  createAudioPatch_cb _hidl_cb) override;
10182cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> releaseAudioPatch(int32_t patch) override;
10282cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) override;
10382cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setAudioPortConfig(const AudioPortConfig& config) override;
1045ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
10582cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setScreenState(bool turnedOn) override;
1065ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
1075ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#ifdef AUDIO_HAL_VERSION_2_0
1085ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<AudioHwSync> getHwAvSync() override;
10982cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> getParameters(const hidl_vec<hidl_string>& keys,
11082cb03632c15976838407c231fd85804de9bf84cKevin Rocard                               getParameters_cb _hidl_cb) override;
11182cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<Result> setParameters(const hidl_vec<ParameterValue>& parameters) override;
11282cb03632c15976838407c231fd85804de9bf84cKevin Rocard    Return<void> debugDump(const hidl_handle& fd) override;
1135ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#elif defined(AUDIO_HAL_VERSION_4_0)
1145ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> getHwAvSync(getHwAvSync_cb _hidl_cb) override;
1155ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> getParameters(const hidl_vec<ParameterValue>& context,
1165ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                               const hidl_vec<hidl_string>& keys,
1175ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                               getParameters_cb _hidl_cb) override;
1185ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<Result> setParameters(const hidl_vec<ParameterValue>& context,
1195ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard                                 const hidl_vec<ParameterValue>& parameters) override;
1205ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> getMicrophones(getMicrophones_cb _hidl_cb) override;
1215ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<Result> setConnectedState(const DeviceAddress& address, bool connected) override;
1225ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard#endif
1235ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard
1245ec293316e7ea1f768161695a113e50b0ea41d45Kevin Rocard    Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
12510548295023bee99108e418499aff09fe578211eMikhail Naganov
12610548295023bee99108e418499aff09fe578211eMikhail Naganov    // Utility methods for extending interfaces.
12710548295023bee99108e418499aff09fe578211eMikhail Naganov    Result analyzeStatus(const char* funcName, int status);
128936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov    void closeInputStream(audio_stream_in_t* stream);
129936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov    void closeOutputStream(audio_stream_out_t* stream);
13010548295023bee99108e418499aff09fe578211eMikhail Naganov    audio_hw_device_t* device() const { return mDevice; }
13186685f56da0941027406d1ffba67bd4272faa526Mikhail Naganov
13282cb03632c15976838407c231fd85804de9bf84cKevin Rocard   private:
13382cb03632c15976838407c231fd85804de9bf84cKevin Rocard    audio_hw_device_t* mDevice;
13410548295023bee99108e418499aff09fe578211eMikhail Naganov
13510548295023bee99108e418499aff09fe578211eMikhail Naganov    virtual ~Device();
13610548295023bee99108e418499aff09fe578211eMikhail Naganov
13786685f56da0941027406d1ffba67bd4272faa526Mikhail Naganov    // Methods from ParametersUtil.
13886685f56da0941027406d1ffba67bd4272faa526Mikhail Naganov    char* halGetParameters(const char* keys) override;
13986685f56da0941027406d1ffba67bd4272faa526Mikhail Naganov    int halSetParameters(const char* keysAndValues) override;
140f811acf049b785ccce05a9fca9e01aa2031ab357Mikhail Naganov
141f811acf049b785ccce05a9fca9e01aa2031ab357Mikhail Naganov    uint32_t version() const { return mDevice->common.version; }
14210548295023bee99108e418499aff09fe578211eMikhail Naganov};
14310548295023bee99108e418499aff09fe578211eMikhail Naganov
14410548295023bee99108e418499aff09fe578211eMikhail Naganov}  // namespace implementation
145e9e4e16564c2949960bf9dd3ab49c9dee2273f3cKevin Rocard}  // namespace AUDIO_HAL_VERSION
14610548295023bee99108e418499aff09fe578211eMikhail Naganov}  // namespace audio
14710548295023bee99108e418499aff09fe578211eMikhail Naganov}  // namespace hardware
14810548295023bee99108e418499aff09fe578211eMikhail Naganov}  // namespace android
149