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 ALSA_LIB_COMMON_H 17 #define ALSA_LIB_COMMON_H 18 19 #include "asoundlib.h" 20 #include "hdf_io_service_if.h" 21 #include "hdf_sbuf.h" 22 #include "osal_mem.h" 23 #include "audio_uhdf_log.h" 24 #include "audio_if_lib_common.h" 25 26 #define SERVIC_NAME_MAX_LEN 32 27 28 #define MAX_VOLUME 100 29 #define MIN_VOLUME 0 30 #define AUDIO_MIN_CARD_NUM 1 31 #define AUDIO_MAX_CARD_NUM 8 32 #define CARD_ID_LEN_MAX 32 33 #define MAX_CARD_NAME_LEN 64 34 #define MAX_CARD_NUM (4 * (AUDIO_MAX_CARD_NUM)) 35 36 #define AUDIO_ALSALIB_IOCTRL_RESUME 0 37 #define AUDIO_ALSALIB_IOCTRL_PAUSE 1 38 #define AUDIO_ALSALIB_MMAP_MAX 10 39 #define AUDIO_ALSALIB_RETYR 3 40 41 enum SndRKPlayPathItem { 42 SND_OUT_CARD_OFF, /* close play path */ 43 SND_OUT_CARD_RCV, /* speaker */ 44 SND_OUT_CARD_SPK, /* speaker */ 45 SND_OUT_CARD_HP, /* headphone */ 46 SND_OUT_CARD_HP_NO_MIC, /* headphone */ 47 SND_OUT_CARD_BT, /* bluetooth (Don't set!!!) */ 48 SND_OUT_CARD_SPK_HP, /* speaker and headphone */ 49 SND_OUT_CARD_RING_SPK, /* speaker */ 50 SND_OUT_CARD_RING_HP, /* headphone */ 51 SND_OUT_CARD_RING_HP_NO_MIC, /* headphone */ 52 SND_OUT_CARD_RING_SPK_HP /* speaker and headphone */ 53 }; 54 55 enum SndRKCapPathItem { 56 SND_IN_CARD_MIC_OFF, /* close capture path */ 57 SND_IN_CARD_MAIN_MIC, /* main mic */ 58 SND_IN_CARD_HANDS_FREE_MIC, /* hands free mic */ 59 SND_IN_CARD_BT_SCO_MIC /* bluetooth sco mic (Don't set!!!) */ 60 }; 61 62 enum SndRKCtrlNumId { 63 SND_PLAY_PATH = 1, /* play path */ 64 SND_CAP_MIC_PATH, /* capture path */ 65 SND_DACL_PLAY_VOL, /* play left volume path */ 66 SND_DACR_PLAY_VOL, /* play right volume path */ 67 SND_DACL_CAP_VOL, /* capture left volume path */ 68 SND_DACR_CAP_VOL /* capture right volume path */ 69 }; 70 71 enum SndCardType { 72 SND_CARD_UNKNOWN = -1, 73 SND_CARD_PRIMARY = 0, 74 SND_CARD_HDMI, 75 SND_CARD_USB, 76 SND_CARD_BT, 77 SND_CARD_MAX 78 }; 79 80 struct DevProcInfo { 81 char cardName[CARD_ID_LEN_MAX]; 82 char cid[CARD_ID_LEN_MAX]; /* cardX/id match */ 83 char did[CARD_ID_LEN_MAX]; /* dai id match */ 84 }; 85 86 struct AlsaDevInfo { 87 char cardId[MAX_CARD_NAME_LEN + 1]; 88 char pcmInfoId[MAX_CARD_NAME_LEN + 1]; 89 int32_t card; 90 int32_t device; 91 }; 92 93 struct AudioCardInfo { 94 uint8_t cardStatus; 95 snd_pcm_t *capturePcmHandle; 96 snd_pcm_t *renderPcmHandle; 97 snd_mixer_t *mixer; 98 snd_mixer_elem_t *ctrlLeftVolume; 99 snd_mixer_elem_t *ctrlRightVolume; 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 struct AlsaDevInfo alsaDevIns[MAX_CARD_NUM]; 113 struct AudioPcmHwParams hwRenderParams; 114 struct AudioPcmHwParams hwCaptureParams; 115 }; 116 117 struct HdfIoService *HdfIoServiceBindName(const char *serviceName); 118 void InitSound(snd_mixer_t **mixer, char *hwCtlName); 119 int32_t CloseMixerHandle(snd_mixer_t *alsaMixHandle); 120 int32_t InitCardIns(void); 121 struct AudioCardInfo *GetCardIns(const char *cardName); 122 struct AudioCardInfo *AudioGetCardInfo(const char *adapterName, snd_pcm_stream_t stream); 123 void CheckCardStatus(struct AudioCardInfo *cardIns); 124 int32_t CheckParaFormat(struct AudioPcmHwParams hwParams, snd_pcm_format_t *alsaPcmFormat); 125 int32_t DestroyCardList(void); 126 int32_t GetSelCardInfo(struct AudioCardInfo *cardIns, struct AlsaDevInfo *devInsHandle); 127 int32_t MatchSelAdapter(const char *adapterName, struct AudioCardInfo *cardIns); 128 int32_t GetPriMixerCtlElement(struct AudioCardInfo *cardIns, snd_mixer_elem_t *pcmElement); 129 int32_t AudioMixerSetCtrlMode( 130 struct AudioCardInfo *cardIns, const char *adapterName, const char *mixerCtrlName, int numId, int item); 131 snd_mixer_elem_t *AudioUsbFindElement(snd_mixer_t *mixer); 132 int32_t CardInfoParseFromConfig(void); 133 134 #endif /* ALSA_LIB_COMMON_H */ 135