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_SOUNDCARD_H 17 #define ALSA_SOUNDCARD_H 18 19 #include "audio_common.h" 20 #include "audio_if_lib_common.h" 21 #include "hdf_io_service_if.h" 22 #include "asoundlib.h" 23 #include "osal_mem.h" 24 #include "osal_time.h" 25 #include "hdf_sbuf.h" 26 #include "audio_uhdf_log.h" 27 #include "securec.h" 28 #include "local.h" 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #define SERVIC_NAME_MAX_LEN 32 35 #define MAX_VOLUME 100 36 #define MIN_VOLUME 0 37 #define AUDIO_MIN_CARD_NUM 1 38 #define AUDIO_MAX_CARD_NUM 8 39 #define CARD_ID_LEN_MAX 32 40 #define MAX_CARD_NAME_LEN 64 41 #define MAX_CARD_NUM (4 * (AUDIO_MAX_CARD_NUM)) 42 #define MAX_CTL_NAME_LEN 64 43 #define MAX_CTL_VALUE_LEN 32 44 #define AUDIO_ALSALIB_IOCTRL_RESUME 0 45 #define AUDIO_ALSALIB_IOCTRL_PAUSE 1 46 #define AUDIO_ALSALIB_MMAP_MAX 10 47 #define AUDIO_ALSALIB_RETYR 3 48 #define ALSA_CTL_NAME_LEN 64 49 #define MIXER_CTL_MAX_NUM 64 50 51 enum SndCardType { 52 SND_CARD_UNKNOWN = -1, 53 SND_CARD_PRIMARY = 0, 54 SND_CARD_HDMI, 55 SND_CARD_USB, 56 SND_CARD_BT, 57 SND_CARD_MAX 58 }; 59 60 enum SndIfaceType { 61 IFACE_CARD = 0, 62 IFACE_MIXER, 63 IFACE_PCM, 64 IFACE_RAWMIDI, 65 IFACE_TIMER, 66 IFACE_SEQUENCER 67 }; 68 69 struct AlsaMixerCtlElement { 70 unsigned int numid; 71 enum SndIfaceType iface; 72 char *name; 73 char *value; 74 unsigned int index; 75 unsigned int device; 76 unsigned int subdevice; 77 }; 78 79 struct AlsaSoundCard { 80 /* 81 save alsa soundcard base info and hardware params 82 */ 83 enum SndCardType cardType; 84 char adapterName[MAX_CARD_NAME_LEN + 1]; //save adapterName 85 char devName[MAX_CARD_NAME_LEN + 1]; //device name hw:x 86 char alsaCardId[MAX_CARD_NAME_LEN + 1]; 87 char ctrlName[MAX_CARD_NAME_LEN + 1]; 88 struct AudioPcmHwParams hwParams; 89 90 /* 91 alsa soundcard driver handle 92 */ 93 snd_pcm_t *pcmHandle; 94 snd_mixer_t *mixerHandle; 95 96 /* 97 alsa soundcard public variable 98 */ 99 uint8_t cardStatus; 100 bool canPause; 101 bool pauseState; 102 int32_t muteValue; 103 bool mmapFlag; 104 uint64_t mmapFrames; 105 }; 106 107 struct DevHandle *AudioBindService(const char *name); 108 void AudioCloseService(const struct DevHandle *handle); 109 struct HdfIoService *HdfIoServiceBindName(const char *serviceName); 110 111 int32_t SndMatchSelAdapter(struct AlsaSoundCard *cardIns, const char *adapterName); 112 int32_t SndConverAlsaPcmFormat(const struct AudioPcmHwParams *hwParams, 113 snd_pcm_format_t *alsaPcmFormat); 114 int32_t SndSaveCardListInfo(snd_pcm_stream_t stream); 115 bool SndisBusy(struct AlsaSoundCard *cardIns); 116 int32_t SndOpenMixer(struct AlsaSoundCard *cardIns); 117 int32_t SndPcmPrepare(struct AlsaSoundCard *cardIns); 118 snd_pcm_state_t SndGetRunState(struct AlsaSoundCard *cardIns); 119 void SndCloseHandle(struct AlsaSoundCard *cardIns); 120 121 void SndElementItemInit(struct AlsaMixerCtlElement *m); 122 int32_t SndElementReadInt(struct AlsaSoundCard *cardIns, 123 const struct AlsaMixerCtlElement *ctlElem, long *value); 124 int32_t SndElementReadEnum(struct AlsaSoundCard *cardIns, 125 const struct AlsaMixerCtlElement *ctlElem, unsigned int *item); 126 int32_t SndElementReadRange(struct AlsaSoundCard *cardIns, 127 const struct AlsaMixerCtlElement *ctlElem, long *mix, long *max); 128 int32_t SndElementReadSwitch(struct AlsaSoundCard *cardIns, 129 const struct AlsaMixerCtlElement *ctlElem, bool *on); 130 int32_t SndElementWriteInt(struct AlsaSoundCard *cardIns, 131 const struct AlsaMixerCtlElement *ctlElem, long value); 132 int32_t SndElementWriteEnum(struct AlsaSoundCard *cardIns, 133 const struct AlsaMixerCtlElement *ctlElem, unsigned int item); 134 int32_t SndElementWriteSwitch(struct AlsaSoundCard *cardIns, 135 const struct AlsaMixerCtlElement *ctlElem, bool on); 136 int32_t SndElementWrite(struct AlsaSoundCard *cardIns, 137 const struct AlsaMixerCtlElement *ctlElem); 138 int32_t SndElementGroupWrite(struct AlsaSoundCard *cardIns, 139 const struct AlsaMixerCtlElement* elemGroup, int32_t groupSize); 140 int32_t SndTraversalMixerElement(struct AlsaSoundCard *cardIns, 141 bool (*callback)(void *data, snd_ctl_elem_id_t *elem_id), void *data); 142 143 #ifdef __cplusplus 144 } 145 #endif 146 147 #endif /* ALSA_SOUNDCARD_H */