Accessing pending hw_params in SND_PCM_HOOK_TYPE_HW_PARAMS call back

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;



[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux