ALSA lib基本概念
1.channel
通道,即我们熟知的声道数。左/右声道,5.1channel等等
2.sample
A sample is a single value that describes the amplitude of the audio signal at a single point in time, on a single channel.
sample即一次采样,通常的sample bit指的是一个channnel上,一次采样的bit数(常见的sample bit 8/16/24/32bits)
3.frame
When we talk about working with digital audio, we often want to talk about the data that represents all channels at a single point in time. This is a collection of samples, one per channel, and is generally called a "frame". When we talk about the passage of time in terms of frames, its roughly equivalent to what people when they measure in terms of samples, but is more accurate; more importantly, when we're talking about the amount of data needed to represent all the channels at a point in time, its the only unit that makes sense.
一个frame是一次采样时所有channel上的sample bit.即frame = channels * (sample bit).
4.peroid
A period is the number of frames in between each hardware interrupt.
每当hardware buffer 中有peroid size个frame的空间时,硬件就产生中断,来通知alsa driver来往硬件写数据。
5.buffer size
This determines how large the hardware buffer is.
hardware buffer size 是由多个peroid组成。buffer size = peroid size * peroids。
6.Data access and layout
interleaveda: data layout arrangement where the samples of each channel that will be played at the same time follow each other sequentially. See "non-interleaved"
non-interleaveda: data layout where the samples for a single channel follow each other sequentially; samples for another channel are either in another buffer or another part of this buffer. Contrast with "interleaved"
在一个period以内(interleaved和non-interleaved是在一个period里面排),数据是按照channel1排完了再排channel2呢,还是一个frame一个frame的来排(frame在alsa里指的是一次采样时间内,两个channel的数据放一块儿就是一个frame)上图是interleaved。
7.Hardware parameter
These are parameters that directly affect the hardware of the audio interface.
Hardware parameter是作用于声卡硬件的,包括sample rate, sample format, interupt intervals, data access and layout, buffer size.
8.Software parameter
These are parameters that control the operation of the device driver rather than the hardware itself. Most programs that use the ALSA Audio API will not need to set any of these; a few will need set a subset of them.
software parameter 是作用于alsa core的。通常用来控制When to start the device, what to do about xruns, Available minimum space/data for wakeup,Transfer chunk size.
8.1 When to start the device
When you open the audio interface, ALSA ensures that it is not active - no data is being moved to or from its external connectors. Presumably, at some point you want this data transfer to begin. There are several options for how to make this happen.
The control point here the start threshold, which defines the number of frames of space/data necessary to start the device automatically. If set to some value other than zero for playback, it is necessary to prefill the playback buffer before the device will start. If set to zero, the first data written to the device (or first attempt to read from a capture stream) will start the device.
You can also start the device explicitly using snd_pcm_start
, but this requires buffer prefilling in the case of the playback stream. If you attempt to start the stream without doing this, you will get -EPIPE as a return code, indicating that there is no data waiting to deliver to the playback hardware buffer.
我们可以通过API snd_pcm_sw_params_set_start_threshold来设置什么时候开始启动声卡。对于playback,假设第设置start threshold 为320,那么就是说,当用户调用writei,写入的数据,将暂时存在alsa驱动空间里,当这个数据量达到 320帧时,alsa驱动才开始将数据写入hardware buffer,并启动DA转换。
8.2What to do about xruns
If an xrun occurs, the device driver may, if requested, take certain steps to handle it. Options include stopping the device, or silencing all or part of the hardware buffer used for playback.
the stop threshold
if the number of frames of data/space available meets or exceeds this value, the driver will stop the interface.
the silence threshold
if the number of frames of space available for a playback stream meets or exceeds this value, the driver will fill part of the playback hardware buffer with silence.
silence size
when the silence threshold level is met, this determines how many frames of silence are written into the playback hardware buffer
xrun指的是,声卡period一到,引发一个中断,告诉alsa驱动,要填入数据,或读走数据,但是,问题在于alsa的读取和写入操作必须用户调用writei和readi才会发生的,它不会去缓存数据。如果上层没有用户调用writei和readi,那么就会产生 overrun(录制时,数据都满了,还没被alsa驱动读走)和underrun(需要数据来播放,alsa驱动却不写入数据),统称为xrun。
当xrun发生时,可以在空余空间超过stop threshold时,stop audio interface.
也可以通过设置silence threshold,当空余空间超过silence threshold时,就hardware buffer 写入silence.
8.3 Available minimum space/data for wakeup
Programs that use poll(2)
or select(2)
to determine when audio data may be transferred to/from the interface may set this to control at what point relative to the state of the hardware buffer, they wish to be woken up.
这个software parameters仅用在interrupt-driven模式。这个模式是alsa驱动层的,不是硬件interrupt。它的意思是,用户使用 snd_pcm_wait()时,这个实际封装的是系统的poll调用,表示用户在等待,那么在等待什么呢?对于playback来讲,就是等待下面的声卡的hardware buffer里有一定数量的空间,可以放入新的数据了,对于record来讲,就是等待下面声卡新采集的数据达到了一定数量了。这个一定数量,就是用 snd_pcm_sw_params_set_avail_min来设置,单位是frame。
8.4 Transfer chunk size
this determines the number of frames used when transferring data to/from the device hardware buffer.
ALSA lib cross compile:
http://blog.sina.com.cn/s/blog_7d7e9d0f0101lqlp.html