Refer to http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/ch05s06.html#pcm-i...
hw_free callback
static int snd_xxx_hw_free(struct snd_pcm_substream *substream);
This is called to release the resources allocated via *hw_params*. For example, releasing the buffer via snd_pcm_lib_malloc_pages() is done by calling the following: snd_pcm_lib_free_pages(substream);
This function is always called before the close callback is called. Also, the callback may be called multiple times, too. Keep track whether the resource was already released. Nearly all the examples in those ALSA tutorials in the web sites have the code
if ((err = snd_pcm_hw_params (playback_handle, hw_params)) < 0) { fprintf (stderr, "cannot set parameters (%s)\n", snd_strerror (err)); exit (1); } snd_pcm_hw_params_free (hw_params);
This seem to violate "This function is always called before the close callback is called."
and those hardware mixing sound cards (e.g cs46xx , au88x0, ... ) use snd_xxx_hw_free() to deallocate the hardware mixing path in the DSP.
There are a number of audio package (e.g. gstreamer , wine , .... ) call snd_pcm_hw_params_free immediately after snd_pcm_hw_params()
Is this a bug of snd_pcm_hw_params_free() not change the state of the PCM stream ?
or
snd_pcm_prepare() did not check the buffer is already released ?