Accessing pending hw_params in SND_PCM_HOOK_TYPE_HW_PARAMS call back
alsa at scripple.org
alsa at scripple.org
Tue Oct 13 22:59:27 CEST 2020
Hello,
I'll try again with a more specific question.
Is there a way one can access the hw_params that cause the
SND_PCM_HOOK_TYPE_HW_PARAMS call back to be called inside the call back
function?
The hook only provides access to the snd_pcm_t object, but all the
public calls to get hw_params fail because it's not in a prepared state yet.
If there isn't a way to get them now could we please add the ability
with a patch like the one below?
With this patch a call to snd_pcm_hook_get_hw_params provides access to
the pending hw_params structure and the pending parameters can be
accessed with standard calls like snd_pcm_hw_params_get_channels.
Hopefully I'm just missing how to get them without the patch, but if not
they really should be made accessible.
diff --git a/alsa-lib-1.1.8/include/pcm.h b/pcm.h
index 5b07823..0cf5dca 100644
--- a/alsa-lib-1.1.8/include/pcm.h
+++ b/pcm.h
@@ -1181,6 +1181,7 @@ typedef struct _snd_pcm_hook snd_pcm_hook_t;
/** PCM hook callback function */
typedef int (*snd_pcm_hook_func_t)(snd_pcm_hook_t *hook);
snd_pcm_t *snd_pcm_hook_get_pcm(snd_pcm_hook_t *hook);
+snd_pcm_hw_params_t *snd_pcm_hook_get_hw_params(snd_pcm_hook_t *hook);
void *snd_pcm_hook_get_private(snd_pcm_hook_t *hook);
void snd_pcm_hook_set_private(snd_pcm_hook_t *hook, void *private_data);
int snd_pcm_hook_add(snd_pcm_hook_t **hookp, snd_pcm_t *pcm,
diff --git a/alsa-lib-1.1.8/src/pcm/pcm_hooks.c b/pcm_hooks.c
index 4416d36..f56c3af 100644
--- a/alsa-lib-1.1.8/src/pcm/pcm_hooks.c
+++ b/pcm_hooks.c
@@ -38,6 +38,7 @@ const char *_snd_module_pcm_hooks = "";
#ifndef DOC_HIDDEN
struct _snd_pcm_hook {
snd_pcm_t *pcm;
+ snd_pcm_hw_params_t *params;
snd_pcm_hook_func_t func;
void *private_data;
struct list_head list;
@@ -117,6 +118,7 @@ static int snd_pcm_hooks_hw_params(snd_pcm_t *pcm,
snd_pcm_hw_params_t *params)
return err;
list_for_each_safe(pos, next,
&h->hooks[SND_PCM_HOOK_TYPE_HW_PARAMS]) {
snd_pcm_hook_t *hook = list_entry(pos, snd_pcm_hook_t,
list);
+ hook->params = params;
err = hook->func(hook);
if (err < 0)
return err;
@@ -563,6 +565,17 @@ snd_pcm_t *snd_pcm_hook_get_pcm(snd_pcm_hook_t *hook)
return hook->pcm;
}
+/**
+ * \brief Get hw_params handle for a PCM hook
+ * \param hook PCM hook handle
+ * \return hw_params handle
+ */
+snd_pcm_hw_params_t *snd_pcm_hook_get_hw_params(snd_pcm_hook_t *hook)
+{
+ assert(hook);
+ return hook->params;
+}
+
/**
* \brief Get callback function private data for a PCM hook
* \param hook PCM hook handle
@@ -609,6 +622,7 @@ int snd_pcm_hook_add(snd_pcm_hook_t **hookp,
snd_pcm_t *pcm,
if (!h)
return -ENOMEM;
h->pcm = pcm;
+ h->params = NULL;
h->func = func;
h->private_data = private_data;
hooks = pcm->private_data;
More information about the Alsa-devel
mailing list