1 /*
2  * Copyright (c) 2022 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 AV_SESSION_AUDIO_ADAPTER_H
17 #define AV_SESSION_AUDIO_ADAPTER_H
18 
19 #include <functional>
20 #include <memory>
21 #include <mutex>
22 #include "audio_stream_manager.h"
23 #include "audio_info.h"
24 
25 namespace OHOS::AVSession {
26 using AudioRendererChangeInfos = std::vector<std::unique_ptr<AudioStandard::AudioRendererChangeInfo>>;
27 using DeviceChangeAction = AudioStandard::DeviceChangeAction;
28 class AudioAdapter : public AudioStandard::AudioRendererStateChangeCallback,
29                      public AudioStandard::AudioManagerDeviceChangeCallback,
30                      public std::enable_shared_from_this<AudioAdapter> {
31 public:
32     using StateListener = std::function<void(const AudioRendererChangeInfos& infos)>;
33     using DeviceChangeListener = std::function<void(const DeviceChangeAction& deviceChangeAction)>;
34     static AudioAdapter& GetInstance();
35 
36     AudioAdapter();
37     ~AudioAdapter() override;
38 
39     void Init();
40 
41     void AddStreamRendererStateListener(const StateListener& listener);
42 
43     void AddDeviceChangeListener(const DeviceChangeListener& listener);
44 
45     int32_t PauseAudioStream(int32_t uid);
46 
47     int32_t PauseAudioStream(int32_t uid, AudioStandard::StreamUsage usage);
48 
49     void OnRendererStateChange(const AudioRendererChangeInfos& infos) override;
50 
51     void OnDeviceChange(const DeviceChangeAction& deviceChangeAction) override;
52 
53     bool GetRendererRunning(int32_t uid);
54 
55 private:
56     static std::shared_ptr<AudioAdapter> instance_;
57     static std::once_flag onceFlag_;
58     std::vector<StateListener> listeners_;
59     std::vector<DeviceChangeListener> deviceChangeListeners_;
60 };
61 }
62 #endif // AV_SESSION_AUDIO_ADAPTER_H
63