1 /*
2 **
3 ** Copyright 2014, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 #ifndef ANDROID_ALSA_UTILS_H
19 #define ANDROID_ALSA_UTILS_H
20 
21 #include <fcntl.h>
22 #include <stdint.h>
23 #include <hardware/audio.h>
24 
25 #define kHDMI_ALSADeviceName    "IntelHDMI"
26 
27 #ifdef __cplusplus
28 extern "C"
29 #endif
30 int find_alsa_card_by_name(const char* name);
31 
32 #ifdef __cplusplus
33 #include <utils/Vector.h>
34 #include <utils/Mutex.h>
35 #include <utils/String8.h>
36 
37 namespace android {
38 
39 class HDMIAudioCaps {
40   public:
41     enum AudFormat {
42         kFmtInvalid = 0,
43         kFmtLPCM,
44         kFmtAC3,
45         kFmtMP1,
46         kFmtMP1L3,
47         kFmtMP2,
48         kFmtAACLC,
49         kFmtDTS,
50         kFmtATRAC,
51         kFmtDSD,
52         kFmtEAC3,
53         kFmtDTSHD,
54         kFmtMLP,
55         kFmtDST,
56         kFmtWMAPRO,
57         kFmtRefCxt,
58         kFmtHEAAC,
59         kFmtHEAAC2,
60         kFmtMPGSUR
61     };
62 
63     enum SRMask {
64         kSR_32000 = (1 << 5),
65         kSR_44100 = (1 << 6),
66         kSR_48000 = (1 << 7),
67         kSR_88200 = (1 << 9),
68         kSR_96000 = (1 << 10),
69         kSR_176400 = (1 << 11),
70         kSR_192000 = (1 << 12),
71     };
72 
73     enum BPSMask {
74         kBPS_16bit = (1 << 17),
75         kBPS_20bit = (1 << 18),
76         kBPS_24bit = (1 << 19),
77     };
78 
79     enum SAMask {
80         kSA_FLFR   = (1 <<  0), // Front Left/Right
81         kSA_LFE    = (1 <<  1), // LFE (aka, subwoofer)
82         kSA_FC     = (1 <<  2), // Front Center
83         kSA_RLRR   = (1 <<  3), // Rear Left/Right
84         kSA_RC     = (1 <<  4), // Rear Center
85         kSA_FLCFRC = (1 <<  5), // Front Left/Right Center
86         kSA_RLCRRC = (1 <<  6), // Rear Left/Right Center
87         kSA_FLWFRW = (1 <<  7), // Front Left/Right Wide
88         kSA_FLHFRH = (1 <<  8), // Front Left/Right High
89         kSA_TC     = (1 <<  9), // Top Center (overhead)
90         kSA_FCH    = (1 << 10), // Front Center High
91     };
92 
93     typedef struct {
94         AudFormat fmt;
95         uint32_t  max_ch;
96         uint32_t  sr_bitmask;
97         uint32_t  bps_bitmask;
98         uint32_t  comp_bitrate;
99     } Mode;
100 
101     HDMIAudioCaps();
~HDMIAudioCaps()102     ~HDMIAudioCaps() { reset(); }
103 
104     bool loadCaps(int ALSADeviceID);
105     void reset();
106     void getRatesForAF(String8& rates);
107     void getFmtsForAF(String8& fmts);
108     void getChannelMasksForAF(String8& masks);
109     bool supportsFormat(audio_format_t format,
110                                       uint32_t sampleRate,
111                                       uint32_t channelCount);
112 
basicAudioSupport()113     bool basicAudioSupport() const { return mBasicAudioSupported; }
speakerAllocation()114     uint16_t speakerAllocation() const { return mSpeakerAlloc; }
modeCnt()115     size_t modeCnt() const { return mModes.size(); }
getMode(size_t ndx)116     const Mode& getMode(size_t ndx) const { return mModes[ndx]; }
117 
118     static const char* fmtToString(AudFormat fmt);
119     static uint32_t srMaskToSR(uint32_t mask);
120     static uint32_t bpsMaskToBPS(uint32_t mask);
121     static const char* saMaskToString(uint32_t mask);
122 
123   private:
124     Mutex mLock;
125     bool mBasicAudioSupported;
126     uint16_t mSpeakerAlloc;
127     Vector<Mode> mModes;
128 
129     void reset_l();
130     ssize_t getMaxChModeNdx_l();
131     static bool sanityCheckMode(const Mode& m);
132 };
133 }  // namespace android
134 #endif  // __cplusplus
135 #endif  // ANDROID_ALSA_UTILS_H
136