[alsa-devel] snd_pcm_hw_params_free() immediately after snd_pcm_hw_params() ???
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 ?
At Thu, 21 Jan 2010 12:32:20 +0800, Raymond Yau wrote:
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 ?
Confusingly, snd_pcm_hw_params_free() and snd_pcm_hw_free() are different.
The former is just to free the malloced snd_pcm_hw_params struct while the latter corresponds to snd_xxx_hw_free().
Takashi
2010/1/21 Takashi Iwai tiwai@suse.de
Confusingly, snd_pcm_hw_params_free() and snd_pcm_hw_free() are different.
The former is just to free the malloced snd_pcm_hw_params struct while the latter corresponds to snd_xxx_hw_free().
Takashi
Is there any flags in substream which can indicate snd_xxx_hw_params() was called at first time since snd_xxx_hw_params() were called many times during OSS emulation (probing the supported rates , channels , .... ) ?
participants (2)
-
Raymond Yau
-
Takashi Iwai