[alsa-devel] snd_pcm_hw_params_free() immediately after snd_pcm_hw_params() ???

Raymond Yau superquad.vortex2 at gmail.com
Thu Jan 21 05:32:20 CET 2010


Refer to
http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/ch05s06.html#pcm-interface-operators-hw-free-callback

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 ?


More information about the Alsa-devel mailing list