pcm: implement snd_pcm_hw_params_get_sync() and obsolete snd_pcm_info_get_sync()

Use the new clock source mechanism to get information about
similar PCM clock sources for PCM streams.

Link: https://lore.kernel.org/linux-sound/20240625172836.589380-1-perex@perex.cz/
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2024-08-20 15:33:45 +02:00
parent 9b6dfb3eb6
commit b154d9145f
3 changed files with 32 additions and 5 deletions

View file

@ -508,6 +508,9 @@ typedef union _snd_pcm_sync_id {
unsigned int id32[4]; unsigned int id32[4];
} snd_pcm_sync_id_t; } snd_pcm_sync_id_t;
/** synchronization ID size (see snd_pcm_hw_params_get_sync) */
#define SND_PCM_HW_PARAMS_SYNC_SIZE 16
/** Infinite wait for snd_pcm_wait() */ /** Infinite wait for snd_pcm_wait() */
#define SND_PCM_WAIT_INFINITE (-1) #define SND_PCM_WAIT_INFINITE (-1)
/** Wait for next i/o in snd_pcm_wait() */ /** Wait for next i/o in snd_pcm_wait() */
@ -747,6 +750,7 @@ int snd_pcm_hw_params_get_rate_numden(const snd_pcm_hw_params_t *params,
unsigned int *rate_den); unsigned int *rate_den);
int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params); int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params);
int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params); int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params);
const unsigned char * snd_pcm_hw_params_get_sync(const snd_pcm_hw_params_t *params);
#if 0 #if 0
typedef struct _snd_pcm_hw_strategy snd_pcm_hw_strategy_t; typedef struct _snd_pcm_hw_strategy snd_pcm_hw_strategy_t;

View file

@ -426,7 +426,8 @@ struct snd_pcm_hw_params {
unsigned int rate_num; /* R: rate numerator */ unsigned int rate_num; /* R: rate numerator */
unsigned int rate_den; /* R: rate denominator */ unsigned int rate_den; /* R: rate denominator */
snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */ snd_pcm_uframes_t fifo_size; /* R: chip FIFO size in frames */
unsigned char reserved[64]; /* reserved for future */ unsigned char sync[16]; /* R: synchronization ID (perfect sync - one clock source) */
unsigned char reserved[48]; /* reserved for future */
}; };
enum { enum {

View file

@ -494,8 +494,8 @@ software parameter.
There are two functions allowing link multiple streams together. In the There are two functions allowing link multiple streams together. In the
case, the linking means that all operations are synchronized. Because the case, the linking means that all operations are synchronized. Because the
drivers cannot guarantee the synchronization (sample resolution) on hardware drivers cannot guarantee the synchronization (sample resolution) on hardware
lacking this feature, the #snd_pcm_info_get_sync() function lacking this feature, the #snd_pcm_hw_params_get_sync() function
returns synchronization ID - #snd_pcm_sync_id_t, which is equal returns 16-byte synchronization ID, which is equal
for hardware synchronized streams. When the #snd_pcm_link() for hardware synchronized streams. When the #snd_pcm_link()
function is called, all operations managing the stream state for these two function is called, all operations managing the stream state for these two
streams are joined. The opposite function is #snd_pcm_unlink(). streams are joined. The opposite function is #snd_pcm_unlink().
@ -3948,6 +3948,25 @@ int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params)
return params->fifo_size; return params->fifo_size;
} }
/**
* \brief Get hardware synchronization ID from a PCM info container
* \param params Configuration space
* \return 16-byte synchronization ID (use #SND_PCM_HW_PARAMS_SYNC_SIZE)
*
* This synchronization ID determines the similar clocks for the
* PCM stream between multiple devices (including different cards).
* "All zeros" means "not set". The contents of the ID can be used
* only for a comparison with the contents of another ID returned
* from this function. Applications should not do a comparison with
* hard-coded values, because the implementation generating such
* synchronization IDs may be changed in future.
*/
const unsigned char *snd_pcm_hw_params_get_sync(const snd_pcm_hw_params_t *params)
{
assert(params);
return params->sync;
}
/** /**
* \brief Fill params with a full configuration space for a PCM * \brief Fill params with a full configuration space for a PCM
* \param pcm PCM handle * \param pcm PCM handle
@ -7332,7 +7351,7 @@ unsigned int snd_pcm_info_get_subdevices_avail(const snd_pcm_info_t *obj)
} }
/** /**
* \brief Get hardware synchronization ID from a PCM info container * \brief (DEPRECATED) Get hardware synchronization ID from a PCM info container
* \param obj PCM info container * \param obj PCM info container
* \return hardware synchronization ID * \return hardware synchronization ID
*/ */
@ -7340,9 +7359,12 @@ snd_pcm_sync_id_t snd_pcm_info_get_sync(const snd_pcm_info_t *obj)
{ {
snd_pcm_sync_id_t res; snd_pcm_sync_id_t res;
assert(obj); assert(obj);
memcpy(&res, &obj->sync, sizeof(res)); bzero(&res, sizeof(res));
return res; return res;
} }
#ifndef DOC_HIDDEN
link_warning(snd_pcm_info_get_sync, "Warning: snd_pcm_info_get_sync is deprecated, consider to use snd_pcm_hw_params_get_sync");
#endif
/** /**
* \brief Set wanted device inside a PCM info container (see #snd_ctl_pcm_info) * \brief Set wanted device inside a PCM info container (see #snd_ctl_pcm_info)