1/*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef TELEPHONY_AUDIO_PROXY_H
17#define TELEPHONY_AUDIO_PROXY_H
18
19#include <cstdint>
20#include <memory>
21#include <mutex>
22
23#include "audio_manager_proxy.h"
24#include "audio_system_manager.h"
25#include "call_manager_errors.h"
26#include "call_manager_inner_type.h"
27#include "singleton.h"
28
29namespace OHOS {
30namespace Telephony {
31constexpr uint16_t VOLUME_AUDIBLE_DIVISOR = 2;
32
33enum AudioInterruptState {
34    INTERRUPT_STATE_UNKNOWN = 0,
35    INTERRUPT_STATE_DEACTIVATED,
36    INTERRUPT_STATE_ACTIVATED,
37    INTERRUPT_STATE_RINGING,
38};
39
40enum class VibrationType {
41    VIBRATION_RINGTONE = 0,
42};
43
44class AudioDeviceChangeCallback : public AudioStandard::AudioManagerDeviceChangeCallback {
45    void OnDeviceChange(const AudioStandard::DeviceChangeAction &deviceChangeAction) override;
46};
47
48class AudioPreferDeviceChangeCallback : public AudioStandard::AudioPreferredOutputDeviceChangeCallback {
49public:
50    void OnPreferredOutputDeviceUpdated(const std::vector<sptr<AudioStandard::AudioDeviceDescriptor>> &desc) override;
51
52private:
53    bool IsDistributedDeviceSelected(const std::vector<sptr<AudioStandard::AudioDeviceDescriptor>> &desc);
54    bool SetBluetoothDevice(AudioDevice &device, const std::vector<sptr<AudioStandard::AudioDeviceDescriptor>> &desc);
55};
56
57class AudioMicStateChangeCallback : public AudioStandard::AudioManagerMicStateChangeCallback {
58public:
59    void OnMicStateUpdated(const AudioStandard::MicStateChangeEvent &micStateChangeEvent) override;
60};
61
62class AudioProxy : public std::enable_shared_from_this<AudioProxy> {
63    DECLARE_DELAYED_SINGLETON(AudioProxy)
64public:
65    bool SetAudioScene(AudioStandard::AudioScene audioScene);
66    int32_t ActivateAudioInterrupt(const AudioStandard::AudioInterrupt &audioInterrupt);
67    int32_t DeactivateAudioInterrupt(const AudioStandard::AudioInterrupt &audioInterrupt);
68    int32_t DeactivateAudioInterrupt();
69    void SetVolumeAudible();
70    bool IsMicrophoneMute();
71    int32_t StartVibrator();
72    int32_t StopVibrator();
73    bool SetMicrophoneMute(bool mute);
74    bool SetEarpieceDevActive();
75    bool SetSpeakerDevActive(bool isActive);
76    bool SetBluetoothDevActive();
77    bool SetWiredHeadsetDevActive();
78    AudioStandard::AudioRingerMode GetRingerMode() const;
79    int32_t GetVolume(AudioStandard::AudioVolumeType audioVolumeType);
80    int32_t SetVolume(AudioStandard::AudioVolumeType audioVolumeType, int32_t volume);
81    int32_t SetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType);
82    bool IsStreamActive(AudioStandard::AudioVolumeType audioVolumeType);
83    bool IsStreamMute(AudioStandard::AudioVolumeType audioVolumeType);
84    int32_t GetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType);
85    int32_t GetMinVolume(AudioStandard::AudioVolumeType audioVolumeType);
86    int32_t SetAudioDeviceChangeCallback();
87    std::string GetDefaultTonePath() const;
88    std::string GetDefaultDtmfPath() const;
89    int32_t UnsetDeviceChangeCallback();
90    void SetWiredHeadsetState(bool isConnected);
91    int32_t GetPreferredOutputAudioDevice(AudioDevice &device);
92    int32_t SetAudioPreferDeviceChangeCallback();
93    int32_t UnsetAudioPreferDeviceChangeCallback();
94    int32_t SetAudioMicStateChangeCallback();
95    int32_t UnsetAudioMicStateChangeCallback();
96
97private:
98    const std::string defaultTonePath_ = "/system/etc/telephony/tones/tone.wav";
99    const std::string defaultDtmfPath_ = "/system/etc/telephony/dtmfs/dtmf.wav";
100    std::shared_ptr<AudioStandard::AudioManagerDeviceChangeCallback> deviceCallback_;
101    std::shared_ptr<AudioStandard::AudioPreferredOutputDeviceChangeCallback> preferredDeviceCallback_;
102    std::shared_ptr<AudioStandard::AudioManagerMicStateChangeCallback> audioMicStateChangeCallback_;
103    bool isWiredHeadsetConnected_ = false;
104};
105} // namespace Telephony
106} // namespace OHOS
107#endif // TELEPHONY_AUDIO_PROXY_H
108