mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2026-03-22 05:33:43 -04:00
pcm: plug - add automatic conversion for iec958 subframe samples
As Pavel noted, a possibility to automatically convert standard linear samples to iec958 subframe format would be handy for latest Raspberry HDMI driver. Link: https://lore.kernel.org/alsa-devel/81b0be0a-5ab7-db91-21cb-0c59a55291e9@ivitera.com/ Suggested-by: Pavel Hofman <pavel.hofman@ivitera.com> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
2a736a0d25
commit
d8ce72f256
3 changed files with 46 additions and 1 deletions
|
|
@ -642,6 +642,9 @@ fi
|
||||||
if test "$build_pcm_alaw" = "yes"; then
|
if test "$build_pcm_alaw" = "yes"; then
|
||||||
AC_DEFINE([BUILD_PCM_PLUGIN_ALAW], "1", [Build PCM alaw plugin])
|
AC_DEFINE([BUILD_PCM_PLUGIN_ALAW], "1", [Build PCM alaw plugin])
|
||||||
fi
|
fi
|
||||||
|
if test "$build_pcm_iec958" = "yes"; then
|
||||||
|
AC_DEFINE([BUILD_PCM_PLUGIN_IEC958], "1", [Build PCM iec958 plugin])
|
||||||
|
fi
|
||||||
if test "$build_pcm_mmap_emul" = "yes"; then
|
if test "$build_pcm_mmap_emul" = "yes"; then
|
||||||
AC_DEFINE([BUILD_PCM_PLUGIN_MMAP_EMUL], "1", [Build PCM mmap-emul plugin])
|
AC_DEFINE([BUILD_PCM_PLUGIN_MMAP_EMUL], "1", [Build PCM mmap-emul plugin])
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,19 @@ int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name,
|
||||||
snd_config_t *root, snd_config_t *conf,
|
snd_config_t *root, snd_config_t *conf,
|
||||||
snd_pcm_stream_t stream, int mode);
|
snd_pcm_stream_t stream, int mode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IEC958 subframe conversion plugin
|
||||||
|
*/
|
||||||
|
int snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
|
||||||
|
snd_pcm_format_t sformat, snd_pcm_t *slave,
|
||||||
|
int close_slave,
|
||||||
|
const unsigned char *status_bits,
|
||||||
|
const unsigned char *preamble_vals,
|
||||||
|
int hdmi_mode);
|
||||||
|
int _snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
|
||||||
|
snd_config_t *root, snd_config_t *conf,
|
||||||
|
snd_pcm_stream_t stream, int mode);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Route plugin for linear formats
|
* Route plugin for linear formats
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,8 @@ static const snd_pcm_format_t linear_preferred_formats[] = {
|
||||||
|
|
||||||
#if defined(BUILD_PCM_PLUGIN_MULAW) || \
|
#if defined(BUILD_PCM_PLUGIN_MULAW) || \
|
||||||
defined(BUILD_PCM_PLUGIN_ALAW) || \
|
defined(BUILD_PCM_PLUGIN_ALAW) || \
|
||||||
defined(BUILD_PCM_PLUGIN_ADPCM)
|
defined(BUILD_PCM_PLUGIN_ADPCM) || \
|
||||||
|
defined(BUILD_PCM_PLUGIN_IEC958)
|
||||||
#define BUILD_PCM_NONLINEAR
|
#define BUILD_PCM_NONLINEAR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -201,6 +202,10 @@ static const snd_pcm_format_t nonlinear_preferred_formats[] = {
|
||||||
#ifdef BUILD_PCM_PLUGIN_ADPCM
|
#ifdef BUILD_PCM_PLUGIN_ADPCM
|
||||||
SND_PCM_FORMAT_IMA_ADPCM,
|
SND_PCM_FORMAT_IMA_ADPCM,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BUILD_PCM_PLUGIN_IEC958
|
||||||
|
SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
|
||||||
|
SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -490,6 +495,18 @@ static int snd_pcm_plug_change_channels(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BUILD_PCM_PLUGIN_IEC958
|
||||||
|
static int iec958_open(snd_pcm_t **pcmp, const char *name,
|
||||||
|
snd_pcm_format_t sformat, snd_pcm_t *slave,
|
||||||
|
int close_slave)
|
||||||
|
{
|
||||||
|
unsigned char preamble_vals[3] = {
|
||||||
|
0x08, 0x02, 0x04 /* Z, X, Y */
|
||||||
|
};
|
||||||
|
return snd_pcm_iec958_open(pcmp, name, sformat, slave, close_slave, NULL, preamble_vals, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_plug_params_t *clt, snd_pcm_plug_params_t *slv)
|
static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_plug_params_t *clt, snd_pcm_plug_params_t *slv)
|
||||||
{
|
{
|
||||||
snd_pcm_plug_t *plug = pcm->private_data;
|
snd_pcm_plug_t *plug = pcm->private_data;
|
||||||
|
|
@ -526,6 +543,12 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
|
||||||
case SND_PCM_FORMAT_IMA_ADPCM:
|
case SND_PCM_FORMAT_IMA_ADPCM:
|
||||||
f = snd_pcm_adpcm_open;
|
f = snd_pcm_adpcm_open;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef BUILD_PCM_PLUGIN_IEC958
|
||||||
|
case SND_PCM_FORMAT_IEC958_SUBFRAME_LE:
|
||||||
|
case SND_PCM_FORMAT_IEC958_SUBFRAME_BE:
|
||||||
|
f = iec958_open;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
#ifdef BUILD_PCM_PLUGIN_LFLOAT
|
#ifdef BUILD_PCM_PLUGIN_LFLOAT
|
||||||
|
|
@ -566,6 +589,12 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
|
||||||
case SND_PCM_FORMAT_IMA_ADPCM:
|
case SND_PCM_FORMAT_IMA_ADPCM:
|
||||||
f = snd_pcm_adpcm_open;
|
f = snd_pcm_adpcm_open;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef BUILD_PCM_PLUGIN_IEC958
|
||||||
|
case SND_PCM_FORMAT_IEC958_SUBFRAME_LE:
|
||||||
|
case SND_PCM_FORMAT_IEC958_SUBFRAME_BE:
|
||||||
|
f = iec958_open;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue