
/* 对pcm设备节点的操作 */struct pcm *pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config);int pcm_close(struct pcm *pcm);int pcm_is_ready(struct pcm *pcm);/* 获取pcm设备的能力 */struct pcm_params *pcm_params_get(unsigned int card, unsigned int device, unsigned int flags);void pcm_params_free(struct pcm_params *pcm_params);unsigned int pcm_params_get_min(struct pcm_params *pcm_params, enum pcm_param param);unsigned int pcm_params_get_max(struct pcm_params *pcm_params, enum pcm_param param);/* 配置pcm设备capture和playback的规格 */int pcm_get_config(struct pcm *pcm, struct pcm_config *config);int pcm_set_config(struct pcm *pcm, struct pcm_config *config);/* 返回调用tinyalsa最后的错误信息 */const char *pcm_get_error(struct pcm *pcm);/* 设置pcm设备采集和播放的位数,位数越高越接近真实声音 */unsigned int pcm_format_to_bits(enum pcm_format format);/* pcm设备的内置缓冲之间大小、帧数、时间的转换 */unsigned int pcm_get_buffer_size(struct pcm *pcm);unsigned int pcm_frames_to_bytes(struct pcm *pcm, unsigned int frames);unsigned int pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes);unsigned int pcm_get_latency(struct pcm *pcm); // in ms/* 返回下一帧的有效帧指针和该帧时间戳,时间戳有CLOCK_MONOTONIC和CLOCK_REALTIME可选,里面使用的是CLOCK_REALTIME *//* 我认为应该需要两个时间戳,一个用于播放的时间戳(CLOCK_MONOTONIC)不受系统时间的影响,一个用于记录当前音频采集的时间戳(CLOCK_REALTIME) */int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, struct timespec *tstamp);/* 通过FIFO把数据写入硬件用于playback或者从硬件中读取capture数据 */int pcm_write(struct pcm *pcm, const void *data, unsigned int count);int pcm_read(struct pcm *pcm, void *data, unsigned int count);/* 这是一个可选的和hardware通信的方式。 */int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count);int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count);int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset, unsigned int *frames);int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames);int pcm_start(struct pcm *pcm);int pcm_stop(struct pcm *pcm);int pcm_wait(struct pcm *pcm, int timeout);int pcm_set_avail_min(struct pcm *pcm, int avail_min);
/* 对mixer设备的操作 */struct mixer *mixer_open(unsigned int card);void mixer_close(struct mixer *mixer);/* 获取mixer设备信息name */const char *mixer_get_name(struct mixer *mixer);/* 获取mixer设备的控制句柄 struct mixer_ctl */unsigned int mixer_get_num_ctls(struct mixer *mixer);struct mixer_ctl *mixer_get_ctl(struct mixer *mixer, unsigned int id);struct mixer_ctl *mixer_get_ctl_by_name(struct mixer *mixer, const char *name);/* 取mixer设备的控制信息 */const char *mixer_ctl_get_name(struct mixer_ctl *ctl);enum mixer_ctl_type mixer_ctl_get_type(struct mixer_ctl *ctl);const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl);unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl);unsigned int mixer_ctl_get_num_enums(struct mixer_ctl *ctl);const char *mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id);/* Some sound cards update their controls due to external events,* such as HDMI EDID byte data changing when an HDMI cable is* connected. This API allows the count of elements to be updated.*/void mixer_ctl_update(struct mixer_ctl *ctl);/* 设置和获取可控制的信息,方式有比例、数组、范围、固定值 *//* id通过mixer_get_num_ctls获得 */int mixer_ctl_get_percent(struct mixer_ctl *ctl, unsigned int id);int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent);int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id);int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count);int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count);int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string);int mixer_ctl_get_range_min(struct mixer_ctl *ctl);int mixer_ctl_get_range_max(struct mixer_ctl *ctl);
原文地址:http://blog.csdn.net/momo0853/article/details/45876813