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