# Interfaces 此文档介绍了 alsa-ucm-aw-lib 提供的 C 语言 API (前缀 "aua" 是 "ALSA UCM AW" 的首字母缩写) ## 使用方法 在应用程序代码中包含头文件 `alsa-ucm-aw.h` , 在编译时加上链接参数 `-lalsa-ucm-aw` ## API ### 通用 API #### aua_use_case_enable, aua_use_case_disable ```c /** * Run the EnableSequence/DisableSequence of a use case * @param card_name: sound card name * @param verb_name: verb name * @param dev_name: device name * @param mod_name: modifier name * @return: 0 on success, otherwise on error */ int aua_use_case_enable(const char *card_name, const char *verb_name, const char *dev_name, const char *mod_name); int aua_use_case_disable(const char *card_name, const char *verb_name, const char *dev_name, const char *mod_name); ``` 用于执行配置文件中的某个 `EnableSequence` / `DisableSequence` 参数中的 `card_name` 和 `verb_name` 不能为 `NULL` , `dev_name` 和 `mod_name` 中 至少有一个不为 `NULL` #### aua_value_get ```c /** * Get the "Value" defined in UCM configurations * @param value_name: value name (e.g. PlaybackPCM, PlaybackVolume, CapturePCM, etc.) * @param card_name: sound card name * @param verb_name: verb name * @param dev_or_mod_name: device or modifier name * @return: the string of "Value" on success; NULL on errer * * Note: * The returned string is dynamically allocated. It needs be deallocated * with free(). */ char *aua_value_get(const char *value_name, const char *card_name, const char *verb_name, const char *dev_or_mod_name); ``` 用于获取 UCM 配置文件中的某个 *Value* 的值 参数中的 `card_name` , `verb_name` 和 `dev_or_mod_name` 可为 `NULL` , 它们用于决 定 *Value* 所在的位置 #### aua_playback_volume_get, aua_capture_volume_get ```c /** * Get the volume according to the ALSA control defined in "PlaybackVolume" / * "CaptureVolume" in UCM configurations * @param card_name: (in) sound card name * @param verb_name: (in) verb name * @param dev_or_mod_name: (in) device or modifier name * @param volume: (out) the volume value got * @return: 0 on success, otherwise on error */ int aua_playback_volume_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); int aua_capture_volume_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); ``` 根据 `PlaybackVolume` 或 `CaptureVolume` 中 ALSA 控件的名字获取对应控件的值 参数 `card_name` , `verb_name` , `dev_or_mod_name` 的使用与 `aua_value_get` 的相同 #### aua_playback_volume_set, aua_capture_volume_set ```c /** * Set the volume according to the ALSA control defined in "PlaybackVolume" / * "CaptureVolume" in UCM configurations * @param card_name: sound card name * @param verb_name: verb name * @param dev_or_mod_name: device or modifier name * @param volume: the volume value to set * @return: 0 on success, otherwise on error */ int aua_playback_volume_set(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int volume); int aua_capture_volume_set(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int volume); ``` 与 `aua_playback_volume_get` 和 `aua_capture_volume_get` 相反的函数, 根据 `PlaybackVolume` 或 `CaptureVolume` 中 ALSA 控件的名字设置该控件的值 #### aua_playback_volume_set_default, aua_capture_volume_set_default ```c /** * Set the volume according to the ALSA control and its default value defined in * "PlaybackVolume"/"CaptureVolume" in UCM configurations * @param card_name: sound card name * @param verb_name: verb name * @param dev_or_mod_name: device or modifier name * @return: 0 on success, otherwise on error */ int aua_playback_volume_set_default(const char *card_name, const char *verb_name, const char *dev_or_mod_name); int aua_capture_volume_set_default(const char *card_name, const char *verb_name, const char *dev_or_mod_name); ``` 类似于 `aua_playback_volume_set` 和 `aua_capture_volume_set` , 不过会将 ALSA 控件 的值设置为 `PlaybackVolume` 或 `CaptureVolume` 中指定的默认值 #### aua_playback_volume_min_get, aua_playback_volume_max_get, aua_capture_volume_min_get, aua_capture_volume_max_get ```c /** * Get the min/max volume according to "PlaybackVolumeMin"/"PlaybackVolumeMax"/ * "CaptureVolumeMin"/"CaptureVolumeMax" in UCM configurations * @param card_name: sound card name * @param verb_name: verb name * @param dev_or_mod_name: device or modifier name * @param volume: (out) the volume value got * @return: 0 on success, otherwise on error */ int aua_playback_volume_min_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); int aua_playback_volume_max_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); int aua_capture_volume_min_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); int aua_capture_volume_max_get(const char *card_name, const char *verb_name, const char *dev_or_mod_name, int *volume); ``` 获取 `PlaybackVolumeMin` 或 `PlaybackVolumeMax` 或 `CaptureVolumeMin` 或 `CaptureVolumeMax` 中的数值 #### 例子 假设 card *audiocodec* 的 verb *Play* 中有如下的 device *Headphone* 的定义: ``` SectionDevice."Headphone" { EnableSequence [ cdev "hw:demo" cset "name='Headphone Switch' 1" ] DisableSequence [ cdev "hw:foobar" cset "name='Headphone Switch' 0" ] Value { PlaybackVolume "name='Headphone Volume' 40" PlaybackVolumeMin "0" PlaybackVolumeMax "63" } } ``` 当前系统中控件 name='Headphone Volume' 的实际值为 35 则上述 API 的使用方法如下 (忽略了错误返回值的判断) ```c /* 执行 EnableSequence 的内容 */ err = aua_use_case_enable("audiocodec", "Play", "Headphone", NULL); /* 字符串 str 的值为 "name='Headphone Volume' 40" (使用完后需释放 str: free(str))*/ str = aua_value_get("PlaybackVolume", "audiocodec", "Play", "Headphone"); /* 返回成功后变量 vol 的值为 35*/ err = aua_playback_volume_get("audiocodec", "Play", "Headphone", &vol); /* 返回成功后系统中控件 name='Headphone Volume' 的值为 45 */ err = aua_playback_volume_set("audiocodec", "Play", "Headphone", 45); /* 返回成功后系统中控件 name='Headphone Volume' 的值为 40 */ err = aua_playback_volume_set_default("audiocodec", "Play", "Headphone"); /* 返回成功后变量 vol_min 的值为 0, vol_max 的值为 63 */ err = aua_playback_volume_min_get("audiocodec", "Play", "Headphone", &vol_min); err = aua_playback_volume_max_get("audiocodec", "Play", "Headphone", &vol_max); ``` ### 默认使用案例 API 函数名均以 `aua_default_play_` 和 `aua_default_record_` 为前缀, 使用方法与通用 API 类似, 但它们的参数 `card_name` , `verb_name` , `dev_name` , `mod_name` 允许为 `NULL` , 此时它们会自动在当前系统的配置文件中按照以下策略寻找默认的 card, verb, device 或 modifier: 1. 当 `card_name` 为 `NULL` 时, 优先选择 `audiocodec` 作为默认的 card, 若不存在 `audiocodec` , 则选择 card 列表中的第一项 2. 当 `verb_name` 为 `NULL` 时, 前缀 `aua_default_play_` 的函数会优先选择 `Play` 为默认的 verb (前缀 `aua_default_capture_` 的函数则会优先选择 `Record` ), 若不存 在, 则选择 verb 列表中的第一项 3. 当 `dev_name` 和 `mod_name` 均为 `NULL` 时, 才会去寻找默认的 device 或 modifier, 这两者没有优先选择的名字, 会直接选择列表中的第一项 若这些参数不为 `NULL` , 则函数的使用效果与通用 API 中的相同 从应用程序的角度而言, 若没有特殊的需求, 可以将全部的这些参数设为 `NULL` , 让其自 动根据当前系统的配置文件选择合适设备, 保证了代码的可移植性