1 /* 2 * Copyright (c) 2022-2023 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 ALSA_LIB_COMMON_H 17 #define ALSA_LIB_COMMON_H 18 19 #include "asoundlib.h" 20 #include "audio_if_lib_common.h" 21 #include "audio_uhdf_log.h" 22 #include "hdf_io_service_if.h" 23 #include "hdf_sbuf.h" 24 #include "osal_mem.h" 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 #define SERVIC_NAME_MAX_LEN 32 31 32 #define MAX_VOLUME 100 33 #define MIN_VOLUME 0 34 #define AUDIO_MIN_CARD_NUM 1 35 #define AUDIO_MAX_CARD_NUM 8 36 #define CARD_ID_LEN_MAX 32 37 #define MAX_CARD_NAME_LEN 64 38 #define MAX_CARD_NUM (4 * (AUDIO_MAX_CARD_NUM)) 39 40 #define AUDIO_ALSALIB_IOCTRL_RESUME 0 41 #define AUDIO_ALSALIB_IOCTRL_PAUSE 1 42 #define AUDIO_ALSALIB_MMAP_MAX 10 43 #define AUDIO_ALSALIB_RETYR 3 44 45 #define ALSA_CTL_NAME_LEN 64 46 #define MIXER_CTL_MAX_NUM 64 47 48 enum SndCardType { 49 SND_CARD_UNKNOWN = -1, 50 SND_CARD_PRIMARY = 0, 51 SND_CARD_HDMI, 52 SND_CARD_USB, 53 SND_CARD_BT, 54 SND_CARD_MAX 55 }; 56 57 struct MixerCtlVolumeName { 58 char name[ALSA_CTL_NAME_LEN]; /* name part of simple element identifier */ 59 }; 60 61 struct DevProcInfo { 62 char cardName[CARD_ID_LEN_MAX]; /* adapter name */ 63 char cid[CARD_ID_LEN_MAX]; /* cardX/id match */ 64 char did[CARD_ID_LEN_MAX]; /* dai id match */ 65 struct MixerCtlVolumeName *ctlRenderNameList; /* Simple mixer control list */ 66 struct MixerCtlVolumeName *ctlCaptureNameList; /* Simple mixer control list */ 67 uint32_t ctlRenderVolNameCount; 68 uint32_t ctlCaptureVolNameCount; 69 }; 70 71 struct AlsaDevInfo { 72 char cardId[MAX_CARD_NAME_LEN + 1]; 73 char pcmInfoId[MAX_CARD_NAME_LEN + 1]; 74 int32_t card; 75 int32_t device; 76 }; 77 78 struct AlsaCardsList { 79 struct AlsaDevInfo alsaDevIns[MAX_CARD_NUM]; 80 }; 81 82 struct AlsaMixerPath { 83 const char *pathName; /* ASCII name of item */ 84 uint32_t numId; /* numeric identifier */ 85 uint32_t item; /* item number */ 86 }; 87 88 struct AlsaMixerElem { 89 snd_mixer_elem_t *elem; /* Simple mixer control */ 90 }; 91 92 struct AudioCardInfo { 93 uint8_t cardStatus; 94 snd_pcm_t *capturePcmHandle; 95 snd_pcm_t *renderPcmHandle; 96 snd_mixer_t *mixer; 97 struct AlsaMixerElem *volElemList; /* Simple mixer control list for primary */ 98 uint32_t volElemCount; /* Simple mixer control list count for primary */ 99 snd_mixer_elem_t *usbCtlVolume; 100 bool renderMmapFlag; 101 bool captureMmapFlag; 102 int32_t renderMuteValue; 103 int32_t captureMuteValue; 104 float tempVolume; 105 uint64_t renderMmapFrames; 106 uint64_t capMmapFrames; 107 uint64_t mmapFrames; 108 char cardName[MAX_CARD_NAME_LEN + 1]; 109 char devName[MAX_CARD_NAME_LEN + 1]; 110 char alsaCardId[MAX_CARD_NAME_LEN + 1]; 111 char ctrlName[MAX_CARD_NAME_LEN + 1]; 112 char alsaPcmInfoId[MAX_CARD_NAME_LEN + 1]; 113 struct AudioPcmHwParams hwRenderParams; 114 struct AudioPcmHwParams hwCaptureParams; 115 struct AlsaMixerPath renderMixerPath; 116 struct AlsaMixerPath captureMixerPath; 117 }; 118 119 struct DevHandle *AudioBindService(const char *name); 120 void AudioCloseService(const struct DevHandle *handle); 121 void InitSound(snd_mixer_t **mixer, char *hwCtlName); 122 int32_t CloseMixerHandle(snd_mixer_t *alsaMixHandle); 123 int32_t InitCardIns(void); 124 struct AudioCardInfo *GetCardIns(const char *cardName); 125 struct AudioCardInfo *AudioGetCardInstance(const char *adapterName); 126 int32_t AudioGetCardInfo(struct AudioCardInfo *cardIns, const char *adapterName, snd_pcm_stream_t stream); 127 int32_t InitMixerCtlElement( 128 const char *adapterName, struct AudioCardInfo *cardIns, snd_mixer_t *mixer, snd_pcm_stream_t stream); 129 void CheckCardStatus(struct AudioCardInfo *cardIns); 130 int32_t CheckParaFormat(struct AudioPcmHwParams hwParams, snd_pcm_format_t *alsaPcmFormat); 131 int32_t DestroyCardList(void); 132 int32_t GetSelCardInfo(struct AudioCardInfo *cardIns, struct AlsaDevInfo *devInsHandle); 133 int32_t MatchSelAdapter(const char *adapterName, struct AudioCardInfo *cardIns); 134 int32_t GetPriMixerCtlElement(struct AudioCardInfo *cardIns, snd_mixer_t *mixer, snd_pcm_stream_t stream); 135 int32_t AudioSetCtrlVolumeRange(struct AudioCardInfo *cardIns, const char *adapterName, snd_pcm_stream_t stream); 136 int32_t CardInfoParseFromConfig(void); 137 int32_t AudioMixerSetCtrlMode(struct AudioCardInfo *cardIns, const char *adapterName, snd_pcm_stream_t stream); 138 int32_t EnableAudioRenderRoute(const struct AudioHwRenderParam *renderData); 139 int32_t EnableAudioCaptureRoute(const struct AudioHwCaptureParam *captureData); 140 #ifdef __cplusplus 141 } 142 #endif 143 #endif /* ALSA_LIB_COMMON_H */ 144