At Wed, 19 Sep 2007 16:17:55 -0700, Sheng (Sean) Liu wrote:
Hello everyone,
I am using ALSA to capture sound from a micrphone. I need to know when the capture device starts. In Paul Davis' Tutorial, he mentioned two approaches. But, I have questions on each of them.
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.
My question: what does he means on " If set to zero"? Does anyone know which parameter of which API should be set to zero?
It's about start_threshold for sw_params, corresponding to snd_pcm_sw_params_set_start_threshold().
- 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.
My question: Is there anything to be done before calling snd_pcm_start in the case of capturing stream? If there is, what are they?
snd_pcm_hw_params(), and optionally, snd_pcm_sw_params().
The former is for the mandatory hardware settings, such as, access mode, format, channels, sample rate, buffer size, period size, etc. Once after snd_pcm_hw_params() is called and the device is set up, it's ready to go. In addition, you can do more fine tuning of some parameters such as start_threshold in the above via snd_pcm_sw_params(). This is an optional action.
Once after snd_pcm_hw_params() is done, you can start the stream via snd_pcm_start() explicitly for the capture stream. For the playback stream, usually the automatic start via a proper start_threshold is used.
Well, a graphical diagram would be good to explain such a thing. We can put it to Wiki. Any taker, please?
Takashi