Linux音频编程(一)ALSA介绍 (2)

7)avail_min. 缓冲区空闲区大于该值时,pcm_mmap_write()才往缓冲写数据。这个 值越大,往缓冲区写入数据的次数就越少,面临XRUN的机会就越大。Android samsung tuna 设备在screen_off时增大该值以减小功耗,在screen_on时减小该 值以减小XRUN的机会。

在不同的场景下,合理的参数就是在性能、时延、功耗等之间达到较好的平衡。

8)struct pcm pcm_open(unsigned int card, unsigned int device, unsinged int flags, struct pcm_config config)

2、pcm_open这个接口可以看到,它通过几个参数获得了一个句柄,之后所有的操作都通过这个句柄来完成。这些参数里面,card代表第几块声卡,device就是上面提到的device index,它跟驱动中配置的DAI link的次序有关,flags参数中会指明这个设备是capture类型还是playback类型。通过这3个参数,就可以找到对应的PCM设备文件

3、一个pcm设备包含播 放/录制两个流,每个流有若干个substream.一个substream只能被一个进程占用。其中snd_pcm_substream实现音频的播放或录制。如下: 

struct snd_pcm_substream { 
struct snd_pcm *pcm; 
struct snd_pcm_str *pstr; 
void *private_data; /* copied from pcm->private_data */ 
int number; 
char name[32]; /* substream name */ 
int stream; /* stream (direction) */ /* 录制/播放 */ 
struct pm_qos_request latency_pm_qos_req; /* pm_qos request */ 
size_t buffer_bytes_max; /* limit ring buffer size */ 
struct snd_dma_buffer dma_buffer; 
unsigned int dma_buf_id; 
size_t dma_max; 
/* -- hardware operations -- */ 
const struct snd_pcm_ops *ops; 
/* -- runtime information -- */ 
struct snd_pcm_runtime *runtime; 
/* -- timer section -- */ 
struct snd_timer *timer; /* timer */ 
unsigned timer_running: 1; /* time is running */ 
/* -- next substream -- */ 
struct snd_pcm_substream *next; 
/* -- linked substreams -- */ 
struct list_head link_list; /* linked list member */ 
struct snd_pcm_group self_group; /* fake group for non linked substream (with substream lock inside) */ 
struct snd_pcm_group *group; /* pointer to current group */ 
/* -- assigned files -- */ 
void *file; /* 指向 pcm_file */ 
int ref_count; /* 引用计数,打开 O_APPEND 时有用 */ 
atomic_t mmap_count; /* mmap 的引用计数 */ 
unsigned int f_flags; /* pcm 打开的文件标记 */ 
void (*pcm_release)(struct snd_pcm_substream *); 
struct pid *pid; /* 所在进程的pid,有多个substream时用于选择使用哪个 */ 
/* misc flags */ 
unsigned int hw_opened: 1; /* 若已打开,在释放substream时需要调用close() */ 
}; 

 

四、补充:

alsa驱动的设备文件可在Linux系统中的/dev/snd 里查看。

其中:C0D0代表的是声卡0中的设备0pcmC0D0c最后一个c代表capturepcmC0D0p最后一个p代表playback

controlC0用于声卡的控制,例如通道选择,混音,麦克风的控制等

midiC0D0用于播放midi音频

pcmC0D0c  用于录音的pcm设备

pcmC0D0p 用于播放的pcm设备

seq 音序器

timer 定时器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxfxs.html