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 A2DP_SBC_PARAM_CTRL_H
17 #define A2DP_SBC_PARAM_CTRL_H
18 
19 #include <cstdint>
20 
21 #include "a2dp_codec_config.h"
22 #include "a2dp_codec_constant.h"
23 #include "a2dp_codec_wrapper.h"
24 
25 namespace OHOS {
26 namespace bluetooth {
27 class A2dpCodecConfigSbcBase : public A2dpCodecConfig {
28 public:
29     bool SetCodecConfig(const uint8_t *peerCodeInfo, uint8_t *resultCodecInfo) override;
30     bool SetPeerCodecCapabilities(const uint8_t *peerCapabilities) override;
31 
32 protected:
A2dpCodecConfigSbcBase(A2dpCodecIndex codecIndex,A2dpCodecPriority codecPriority,bool isSource)33     A2dpCodecConfigSbcBase(A2dpCodecIndex codecIndex, A2dpCodecPriority codecPriority, bool isSource)
34         : A2dpCodecConfig(codecIndex, codecPriority), isSource_(isSource)
35     {}
36     ~A2dpCodecConfigSbcBase() override = default;
37     void SetSampleRateUser(uint32_t sampFreq, A2dpSBCCapability &resultCap);
38     void SetSampleRateSelectableCapa(uint32_t sampFreq);
39     void SetSampleRateCommonCapa(uint32_t sampFreq);
40     bool SetSampleRateAudioConfig(uint32_t sampFreq, A2dpSBCCapability &resultCap);
41     bool SetSampleRateBestMatch(uint32_t sampFreq, A2dpSBCCapability &resultCap);
42     bool SetSampleRateDefaultConfig(uint32_t sampFreq, A2dpSBCCapability &resultCap);
43     bool SetSampleRate(
44         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
45     void SetBitsPerSampleUser();
46     void SetBitsPerSampleSelectableCapa(const A2dpSBCCapability &localCapability);
47     void SetBitsPerSampleCommonCapa();
48     bool SetBitsPerSampleAudioConfig(A2dpSBCCapability &resultCap);
49     bool SetBitsPerSampleBestMatch(A2dpSBCCapability &resultCap);
50     bool SetBitsPerSampleDefaultConfig(A2dpSBCCapability &resultCap);
51     bool SetBitsPerSample(const A2dpSBCCapability &localCapability, A2dpSBCCapability &resultCap);
52     void SetChannelModeUser(uint8_t chMode, A2dpSBCCapability &resultCap);
53     void SetChannelModeSelectableCapa(uint8_t chMode);
54     void SetChannelModeCommonCapa(uint8_t chMode);
55     bool SetChannelModeAudioConfig(uint8_t chMode, A2dpSBCCapability &resultCap);
56     bool SetChannelModeBestMatch(uint8_t chMode, A2dpSBCCapability &resultCap);
57     bool SetChannelModeDefaultConfig(uint8_t chMode, A2dpSBCCapability &resultCap);
58     bool SetChannelMode(
59         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
60     bool SetBlockLength(
61         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
62     bool SetSubBands(
63         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
64     bool SetAllocationMethod(
65         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
66     bool SetBitPool(
67         const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability, A2dpSBCCapability &resultCap);
68     bool SetCodecSpecific(void);
69     bool ResetCodecConfig(void);
70 
71     void SetSampleFrameCapa(const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability);
72     void SetBitsPerSampleCapa(const A2dpSBCCapability &localCapability);
73     void SetChannelModeCapa(const A2dpSBCCapability &localCapability, A2dpSBCCapability peerCapability);
74     bool ResetCodecCapability(void);
75     bool isSource_;  // True if local is Source
76 };
77 
78 class A2dpCodecConfigSbcSource : public A2dpCodecConfigSbcBase {
79 public:
80     explicit A2dpCodecConfigSbcSource(A2dpCodecPriority codecPriority);
81     ~A2dpCodecConfigSbcSource() override = default;
82     bool Initialize();
83     uint64_t EncoderIntervalMs() const;
84     int GetEffectiveMtu() const;
85 };
86 
87 class A2dpCodecConfigSbcSink : public A2dpCodecConfigSbcBase {
88 public:
89     explicit A2dpCodecConfigSbcSink(A2dpCodecPriority codecPriority);
90     ~A2dpCodecConfigSbcSink() override = default;
91 
92     bool Init();
93     uint64_t EncoderIntervalMs() const;
94     int GetEffectiveMtu() const;
95 };
96 
97 uint8_t ParseInfoSbc(A2dpSBCCapability *sbcCap, const uint8_t *codecInfo);
98 bool IsSbcConfigChanged(const uint8_t *lastCodecInfo, const uint8_t *newCodecInfo);
99 uint8_t BuildSbcInfo(A2dpSBCCapability *sbcCap, uint8_t *codecInfo);
100 int GetMinBitpoolSbc(const uint8_t *codecInfo);
101 int GetMaxBitpoolSbc(const uint8_t *codecInfo);
102 int GetSampleRateSbc(const uint8_t *codecInfo);
103 int GetTrackChannelModeSbc(const uint8_t *codecInfo);
104 int GetTrackChannelCountSbc(const uint8_t *codecInfo);
105 int GetNumberOfSubbandsSbc(const uint8_t *codecInfo);
106 int GetNumberOfBlocksSbc(const uint8_t *codecInfo);
107 int GetAllocationMethodCodeSbc(const uint8_t *codecInfo);
108 }  // namespace bluetooth
109 }  // namespace OHOS
110 #endif  // !A2DP_SBC_PARAM_CTRL_H