SmartAudio/package/allwinner/alsa-ucm-aw/docs/interfaces.md

8.3 KiB

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

/**
 * 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_nameverb_name 不能为 NULL , dev_namemod_name 中 至少有一个不为 NULL

aua_value_get

/**
 * 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_namedev_or_mod_name 可为 NULL , 它们用于决 定 Value 所在的位置

aua_playback_volume_get, aua_capture_volume_get

/**
 * 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);

根据 PlaybackVolumeCaptureVolume 中 ALSA 控件的名字获取对应控件的值

参数 card_name , verb_name , dev_or_mod_name 的使用与 aua_value_get 的相同

aua_playback_volume_set, aua_capture_volume_set

/**
 * 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_getaua_capture_volume_get 相反的函数, 根据 PlaybackVolumeCaptureVolume 中 ALSA 控件的名字设置该控件的值

aua_playback_volume_set_default, aua_capture_volume_set_default

/**
 * 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_setaua_capture_volume_set , 不过会将 ALSA 控件 的值设置为 PlaybackVolumeCaptureVolume 中指定的默认值

aua_playback_volume_min_get, aua_playback_volume_max_get, aua_capture_volume_min_get, aua_capture_volume_max_get

/**
 * 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);

获取 PlaybackVolumeMinPlaybackVolumeMaxCaptureVolumeMinCaptureVolumeMax 中的数值

例子

假设 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 的使用方法如下 (忽略了错误返回值的判断)

/* 执行 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_nameNULL 时, 优先选择 audiocodec 作为默认的 card, 若不存在 audiocodec , 则选择 card 列表中的第一项
  2. verb_nameNULL 时, 前缀 aua_default_play_ 的函数会优先选择 Play 为默认的 verb (前缀 aua_default_capture_ 的函数则会优先选择 Record ), 若不存 在, 则选择 verb 列表中的第一项
  3. dev_namemod_name 均为 NULL 时, 才会去寻找默认的 device 或 modifier, 这两者没有优先选择的名字, 会直接选择列表中的第一项

若这些参数不为 NULL , 则函数的使用效果与通用 API 中的相同

从应用程序的角度而言, 若没有特殊的需求, 可以将全部的这些参数设为 NULL , 让其自 动根据当前系统的配置文件选择合适设备, 保证了代码的可移植性