Allow partial build with selected components

Add --enable-* and --with-pcm-plugins configure options for partial builds.

User can choose the core components (pcm, mixer, rawmidi, hwdep, seq, instr)
via --enable-xxx or --disable-xxx option.  As default, all components are
enabled.

The PCM plugins to build can be selected via --with-pcm-plugins option.
For example, to build only rate and linear plugin, pass
  --with-pcm-plugins=rate,linear
Passing "all" will select all plugins (it's the default value).

The plug plugin will select linear and copy plugins automatically.
The other auto conversions of plug plugin are enabled only when the
corresponding plugin is selected.
This commit is contained in:
Takashi Iwai 2005-11-30 11:38:24 +00:00
parent 79c3d0a1ef
commit db1e39a4e8
8 changed files with 369 additions and 54 deletions

View File

@ -1,4 +1,11 @@
SUBDIRS=doc include src modules aserver alsalisp test utils
SUBDIRS=doc include src modules
if BUILD_PCM_PLUGIN_SHM
SUBDIRS += aserver
endif
if BUILD_MIXER
SUBDIRS += alsalisp
endif
SUBDIRS += test utils
EXTRA_DIST=ChangeLog INSTALL TODO NOTES configure cvscompile libtool depcomp version MEMORY-LEAK
AUTOMAKE_OPTIONS=foreign

View File

@ -196,6 +196,146 @@ if test "$aload" = "yes"; then
AC_DEFINE(SUPPORT_ALOAD, "1", [Support /dev/aload* access for auto-loading])
fi
dnl Build conditions
AC_ARG_ENABLE(mixer,
[ --disable-mixer Disable the mixer component],
[build_mixer="$enableval"], [build_mixer="yes"])
AC_ARG_ENABLE(pcm,
[ --disable-pcm Disable the PCM component],
[build_pcm="$enableval"], [build_pcm="yes"])
AC_ARG_ENABLE(rawmidi,
[ --disable-rawmidi Disable the raw MIDI component],
[build_rawmidi="$enableval"], [build_rawmidi="yes"])
AC_ARG_ENABLE(hwdep,
[ --disable-hwdep Disable the hwdep component],
[build_hwdep="$enableval"], [build_hwdep="yes"])
AC_ARG_ENABLE(seq,
[ --disable-seq Disable the sequencer component],
[build_seq="$enableval"], [build_seq="yes"])
AC_ARG_ENABLE(instr,
[ --disable-instr Disable the instrument component],
[build_instr="$enableval"], [build_instr="yes"])
if test "$build_seq" != "yes"; then
build_instr="no"
fi
AM_CONDITIONAL(BUILD_MIXER, test x$build_mixer = xyes)
AM_CONDITIONAL(BUILD_PCM, test x$build_pcm = xyes)
AM_CONDITIONAL(BUILD_RAWMIDI, test x$build_rawmidi = xyes)
AM_CONDITIONAL(BUILD_HWDEP, test x$build_hwdep = xyes)
AM_CONDITIONAL(BUILD_SEQ, test x$build_seq = xyes)
AM_CONDITIONAL(BUILD_INSTR, test x$build_instr = xyes)
if test "$build_mixer" = "yes"; then
AC_DEFINE([BUILD_MIXER], "1", [Build mixer component])
fi
if test "$build_pcm" = "yes"; then
AC_DEFINE([BUILD_PCM], "1", [Build PCM component])
fi
if test "$build_rawmidi" = "yes"; then
AC_DEFINE([BUILD_RAWMIDI], "1", [Build raw MIDI component])
fi
if test "$build_seq" = "yes"; then
AC_DEFINE([BUILD_SEQ], "1", [Build sequencer component])
fi
if test "$build_instr" = "yes"; then
AC_DEFINE([BUILD_INSTR], "1", [Build instrument component])
fi
dnl PCM Plugins
if test "$build_pcm" = "yes"; then
AC_ARG_WITH(pcm-plugins,
[ --with-pcm-plugins=<list> Build PCM plugins ],
[pcm_plugins="$withval"], [pcm_plugins="all"])
else
pcm_plugins=""
fi
PCM_PLUGIN_LIST="copy linear route mulaw alaw adpcm rate plug multi shm file null share meter hooks lfloat ladspa dmix dshare dsnoop asym iec958 softvol extplug ioplug"
build_pcm_plugin="no"
for t in $PCM_PLUGIN_LIST; do
eval build_pcm_$t="no"
done
pcm_plugins=`echo $pcm_plugins | sed 's/,/ /g'`
for p in $pcm_plugins; do
for t in $PCM_PLUGIN_LIST; do
if test "$p" = "$t" -o "$p" = "all"; then
eval build_pcm_$t="yes"
build_pcm_plugin="yes"
fi
done
done
dnl special dependencies
if test "$build_pcm_plug" = "yes"; then
build_pcm_linear="yes"
build_pcm_copy="yes"
fi
if test "$build_pcm_ioplug" = "yes"; then
build_pcm_extplug="yes"
fi
AM_CONDITIONAL(BUILD_PCM_PLUGIN, test x$build_pcm_plugin = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_COPY, test x$build_pcm_copy = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_LINEAR, test x$build_pcm_linear = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_ROUTE, test x$build_pcm_route = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_MULAW, test x$build_pcm_mulaw = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_ALAW, test x$build_pcm_alaw = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_ADPCM, test x$build_pcm_adpcm = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_RATE, test x$build_pcm_rate = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_PLUG, test x$build_pcm_plug = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_MULTI, test x$build_pcm_multi = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_SHM, test x$build_pcm_shm = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_FILE, test x$build_pcm_file = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_NULL, test x$build_pcm_null = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_SHARE, test x$build_pcm_share = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_METER, test x$build_pcm_meter = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_HOOKS, test x$build_pcm_hooks = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_LFLOAT, test x$build_pcm_lfloat = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_LADSPA, test x$build_pcm_ladspa = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_DMIX, test x$build_pcm_dmix = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_DSHARE, test x$build_pcm_dshare = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_DSNOOP, test x$build_pcm_dsnoop = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_ASYM, test x$build_pcm_asym = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_IEC958, test x$build_pcm_iec958 = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_SOFTVOL, test x$build_pcm_softvol = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_EXTPLUG, test x$build_pcm_extplug = xyes)
AM_CONDITIONAL(BUILD_PCM_PLUGIN_IOPLUG, test x$build_pcm_ioplug = xyes)
dnl Defines for plug plugin
if test "$build_pcm_rate" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_RATE], "1", [Build PCM rate plugin])
fi
if test "$build_pcm_route" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_ROUTE], "1", [Build PCM route plugin])
fi
if test "$build_pcm_lfloat" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_LFLOAT], "1", [Build PCM lfloat plugin])
fi
if test "$build_pcm_adpcm" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_ADPCM], "1", [Build PCM adpcm plugin])
fi
if test "$build_pcm_mulaw" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_MULAW], "1", [Build PCM mulaw plugin])
fi
if test "$build_pcm_alaw" = "yes"; then
AC_DEFINE([BUILD_PCM_PLUGIN_ALAW], "1", [Build PCM alaw plugin])
fi
dnl Create PCM plugin symbol list for static library
rm -f src/pcm/pcm_symbols_list.c
for t in $PCM_PLUGIN_LIST; do
if eval test \$build_pcm_$t = yes; then
echo \&_snd_module_pcm_$t, >> src/pcm/pcm_symbols_list.c
fi
done
dnl Make a symlink for inclusion of alsa/xxx.h
if test ! -L include/alsa ; then
echo "Making a symlink include/alsa"

View File

@ -1 +1,3 @@
if BUILD_MIXER
SUBDIRS=mixer
endif

View File

@ -1,4 +1,3 @@
SUBDIRS=control mixer pcm rawmidi timer hwdep seq instr compat conf alisp
EXTRA_DIST=Versions
COMPATNUM=@LIBTOOL_VERSION_INFO@
@ -10,12 +9,35 @@ endif
lib_LTLIBRARIES = libasound.la
libasound_la_SOURCES = conf.c confmisc.c input.c output.c async.c error.c dlmisc.c socket.c shmarea.c userfile.c names.c
libasound_la_LIBADD = control/libcontrol.la \
mixer/libmixer.la \
pcm/libpcm.la \
rawmidi/librawmidi.la timer/libtimer.la \
hwdep/libhwdep.la seq/libseq.la instr/libinstr.la \
compat/libcompat.la alisp/libalisp.la -lm -ldl -lpthread
SUBDIRS=control
libasound_la_LIBADD = control/libcontrol.la
if BUILD_MIXER
SUBDIRS += mixer
libasound_la_LIBADD += mixer/libmixer.la
endif
if BUILD_PCM
SUBDIRS += pcm timer
libasound_la_LIBADD += pcm/libpcm.la timer/libtimer.la
endif
if BUILD_RAWMIDI
SUBDIRS += rawmidi
libasound_la_LIBADD += rawmidi/librawmidi.la
endif
if BUILD_HWDEP
SUBDIRS += hwdep
libasound_la_LIBADD += hwdep/libhwdep.la
endif
if BUILD_SEQ
SUBDIRS += seq
libasound_la_LIBADD += seq/libseq.la
endif
if BUILD_INSTR
SUBDIRS += instr
libasound_la_LIBADD += instr/libinstr.la
endif
SUBDIRS += compat conf alisp
libasound_la_LIBADD += compat/libcompat.la alisp/libalisp.la -lm -ldl -lpthread
libasound_la_LDFLAGS = -version-info $(COMPATNUM)
AM_LDFLAGS = $(VSYMS)

View File

@ -5,14 +5,97 @@ EXTRA_LTLIBRARIES = libpcm.la
libpcm_la_SOURCES = atomic.c mask.c interval.c \
pcm.c pcm_params.c pcm_simple.c \
pcm_hw.c pcm_generic.c pcm_plugin.c pcm_copy.c pcm_linear.c \
pcm_route.c pcm_mulaw.c pcm_alaw.c pcm_adpcm.c \
pcm_rate.c pcm_plug.c pcm_misc.c pcm_mmap.c pcm_multi.c \
pcm_shm.c pcm_file.c pcm_null.c pcm_share.c \
pcm_meter.c pcm_hooks.c pcm_lfloat.c pcm_ladspa.c \
pcm_direct.c pcm_dmix.c pcm_dsnoop.c pcm_dshare.c \
pcm_asym.c pcm_iec958.c pcm_softvol.c pcm_symbols.c \
pcm_ioplug.c pcm_extplug.c
pcm_hw.c pcm_misc.c pcm_mmap.c pcm_symbols.c
if BUILD_PCM_PLUGIN
libpcm_la_SOURCES += pcm_generic.c pcm_plugin.c
endif
if BUILD_PCM_PLUGIN_COPY
libpcm_la_SOURCES += pcm_copy.c
endif
if BUILD_PCM_PLUGIN_LINEAR
libpcm_la_SOURCES += pcm_linear.c
endif
if BUILD_PCM_PLUGIN_ROUTE
libpcm_la_SOURCES += pcm_route.c
endif
if BUILD_PCM_PLUGIN_MULAW
libpcm_la_SOURCES += pcm_mulaw.c
endif
if BUILD_PCM_PLUGIN_ALAW
libpcm_la_SOURCES += pcm_alaw.c
endif
if BUILD_PCM_PLUGIN_ADPCM
libpcm_la_SOURCES += pcm_adpcm.c
endif
if BUILD_PCM_PLUGIN_RATE
libpcm_la_SOURCES += pcm_rate.c
endif
if BUILD_PCM_PLUGIN_PLUG
libpcm_la_SOURCES += pcm_plug.c
endif
if BUILD_PCM_PLUGIN_MULTI
libpcm_la_SOURCES += pcm_multi.c
endif
if BUILD_PCM_PLUGIN_SHM
libpcm_la_SOURCES += pcm_shm.c
endif
if BUILD_PCM_PLUGIN_FILE
libpcm_la_SOURCES += pcm_file.c
endif
if BUILD_PCM_PLUGIN_NULL
libpcm_la_SOURCES += pcm_null.c
endif
if BUILD_PCM_PLUGIN_SHARE
libpcm_la_SOURCES += pcm_share.c
endif
if BUILD_PCM_PLUGIN_METER
libpcm_la_SOURCES += pcm_meter.c
endif
if BUILD_PCM_PLUGIN_HOOKS
libpcm_la_SOURCES += pcm_hooks.c
endif
if BUILD_PCM_PLUGIN_LFLOAT
libpcm_la_SOURCES += pcm_lfloat.c
endif
if BUILD_PCM_PLUGIN_LADSPA
libpcm_la_SOURCES += pcm_ladspa.c
endif
if BUILD_PCM_PLUGIN_DMIX
libpcm_la_SOURCES += pcm_dmix.c
endif
if BUILD_PCM_PLUGIN_DSHARE
libpcm_la_SOURCES += pcm_dshare.c
endif
if BUILD_PCM_PLUGIN_DSNOOP
libpcm_la_SOURCES += pcm_dsnoop.c
endif
if BUILD_PCM_PLUGIN_DMIX
libpcm_la_SOURCES += pcm_direct.c
else
if BUILD_PCM_PLUGIN_DSHARE
libpcm_la_SOURCES += pcm_direct.c
else
if BUILD_PCM_PLUGIN_DSNOOP
libpcm_la_SOURCES += pcm_direct.c
endif
endif
endif
if BUILD_PCM_PLUGIN_ASYM
libpcm_la_SOURCES += pcm_asym.c
endif
if BUILD_PCM_PLUGIN_IEC958
libpcm_la_SOURCES += pcm_iec958.c
endif
if BUILD_PCM_PLUGIN_SOFTVOL
libpcm_la_SOURCES += pcm_softvol.c
endif
if BUILD_PCM_PLUGIN_EXTPLUG
libpcm_la_SOURCES += pcm_extplug.c
endif
if BUILD_PCM_PLUGIN_IOPLUG
libpcm_la_SOURCES += pcm_ioplug.c
endif
EXTRA_DIST = pcm_dmix_i386.c pcm_dmix_x86_64.c pcm_dmix_generic.c

View File

@ -172,12 +172,27 @@ static snd_pcm_format_t linear_preferred_formats[] = {
#endif
};
static snd_pcm_format_t nonlinear_preferred_formats[] = {
SND_PCM_FORMAT_MU_LAW,
SND_PCM_FORMAT_A_LAW,
SND_PCM_FORMAT_IMA_ADPCM,
};
#if defined(BUILD_PCM_PLUGIN_MULAW) || \
defined(BUILD_PCM_PLUGIN_ALAW) || \
defined(BUILD_PCM_PLUGIN_ADPCM)
#define BUILD_PCM_NONLINEAR
#endif
#ifdef BUILD_PCM_NONLINEAR
static snd_pcm_format_t nonlinear_preferred_formats[] = {
#ifdef BUILD_PCM_PLUGIN_MULAW
SND_PCM_FORMAT_MU_LAW,
#endif
#ifdef BUILD_PCM_PLUGIN_ALAW
SND_PCM_FORMAT_A_LAW,
#endif
#ifdef BUILD_PCM_PLUGIN_ADPCM
SND_PCM_FORMAT_IMA_ADPCM,
#endif
};
#endif
#ifdef BUILD_PCM_PLUGIN_LFLOAT
static snd_pcm_format_t float_preferred_formats[] = {
#ifdef SND_LITTLE_ENDIAN
SND_PCM_FORMAT_FLOAT_LE,
@ -191,6 +206,7 @@ static snd_pcm_format_t float_preferred_formats[] = {
SND_PCM_FORMAT_FLOAT64_LE,
#endif
};
#endif
static char linear_format_widths[32] = {
0, 0, 0, 0, 0, 0, 0, 1,
@ -226,16 +242,28 @@ static snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format, const
int w, w1, u, e;
snd_pcm_format_t f;
snd_pcm_format_mask_t lin = { SND_PCM_FMTBIT_LINEAR };
snd_pcm_format_mask_t fl = { SND_PCM_FMTBIT_FLOAT };
snd_pcm_format_mask_t fl = {
#ifdef BUILD_PCM_PLUGIN_LFLOAT
SND_PCM_FMTBIT_FLOAT
#else
{ 0 }
#endif
};
if (snd_pcm_format_mask_test(format_mask, format))
return format;
if (!snd_pcm_format_mask_test(&lin, format) &&
!snd_pcm_format_mask_test(&fl, format)) {
unsigned int i;
switch (format) {
#ifdef BUILD_PCM_PLUGIN_MULAW
case SND_PCM_FORMAT_MU_LAW:
#endif
#ifdef BUILD_PCM_PLUGIN_ALAW
case SND_PCM_FORMAT_A_LAW:
#endif
#ifdef BUILD_PCM_PLUGIN_ADPCM
case SND_PCM_FORMAT_IMA_ADPCM:
#endif
for (i = 0; i < sizeof(linear_preferred_formats) / sizeof(linear_preferred_formats[0]); ++i) {
snd_pcm_format_t f = linear_preferred_formats[i];
if (snd_pcm_format_mask_test(format_mask, f))
@ -250,14 +278,17 @@ static snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format, const
snd_mask_intersect(&lin, format_mask);
snd_mask_intersect(&fl, format_mask);
if (snd_mask_empty(&lin) && snd_mask_empty(&fl)) {
#ifdef BUILD_PCM_NONLINEAR
unsigned int i;
for (i = 0; i < sizeof(nonlinear_preferred_formats) / sizeof(nonlinear_preferred_formats[0]); ++i) {
snd_pcm_format_t f = nonlinear_preferred_formats[i];
if (snd_pcm_format_mask_test(format_mask, f))
return f;
}
#endif
return SND_PCM_FORMAT_UNKNOWN;
}
#ifdef BUILD_PCM_PLUGIN_LFLOAT
if (snd_pcm_format_float(format)) {
if (snd_pcm_format_mask_test(&fl, format)) {
unsigned int i;
@ -270,13 +301,17 @@ static snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format, const
w = 32;
u = 0;
e = snd_pcm_format_big_endian(format);
} else if (snd_mask_empty(&lin)) {
} else
#endif
if (snd_mask_empty(&lin)) {
#ifdef BUILD_PCM_PLUGIN_LFLOAT
unsigned int i;
for (i = 0; i < sizeof(float_preferred_formats) / sizeof(float_preferred_formats[0]); ++i) {
snd_pcm_format_t f = float_preferred_formats[i];
if (snd_pcm_format_mask_test(format_mask, f))
return f;
}
#endif
return SND_PCM_FORMAT_UNKNOWN;
} else {
w = snd_pcm_format_width(format);
@ -320,6 +355,7 @@ typedef struct {
} snd_pcm_plug_params_t;
#endif
#ifdef BUILD_PCM_PLUGIN_RATE
static int snd_pcm_plug_change_rate(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;
@ -336,7 +372,9 @@ static int snd_pcm_plug_change_rate(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_plu
slv->format = clt->format;
return 1;
}
#endif
#ifdef BUILD_PCM_PLUGIN_ROUTE
static int snd_pcm_plug_change_channels(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;
@ -437,6 +475,7 @@ static int snd_pcm_plug_change_channels(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm
slv->format = clt->format;
return 1;
}
#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)
{
@ -446,30 +485,47 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
int (*f)(snd_pcm_t **_pcm, const char *name, snd_pcm_format_t sformat, snd_pcm_t *slave, int close_slave);
if (snd_pcm_format_linear(slv->format)) {
/* Conversion is done in another plugin */
if (clt->format == slv->format ||
clt->rate != slv->rate ||
clt->channels != slv->channels)
return 0;
if (clt->format == slv->format) {
#ifdef BUILD_PCM_PLUGIN_RATE
if (clt->rate != slv->rate)
return 0;
#endif
#ifdef BUILD_PCM_PLUGIN_ROUTE
if (clt->channels != slv->channels)
return 0;
#endif
}
cfmt = clt->format;
switch (clt->format) {
#ifdef BUILD_PCM_PLUGIN_MULAW
case SND_PCM_FORMAT_MU_LAW:
f = snd_pcm_mulaw_open;
break;
#endif
#ifdef BUILD_PCM_PLUGIN_ALAW
case SND_PCM_FORMAT_A_LAW:
f = snd_pcm_alaw_open;
break;
#endif
#ifdef BUILD_PCM_PLUGIN_ADPCM
case SND_PCM_FORMAT_IMA_ADPCM:
f = snd_pcm_adpcm_open;
break;
#endif
default:
if (snd_pcm_format_float(clt->format)) {
#ifdef BUILD_PCM_PLUGIN_LFLOAT
if (snd_pcm_format_float(clt->format))
f = snd_pcm_lfloat_open;
} else {
else
#endif
{
assert(snd_pcm_format_linear(clt->format));
f = snd_pcm_linear_open;
}
break;
}
#ifdef BUILD_PCM_PLUGIN_LFLOAT
} else if (snd_pcm_format_float(slv->format)) {
/* Conversion is done in another plugin */
if (clt->format == slv->format &&
@ -483,6 +539,8 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
assert(0); /* TODO */
return -EINVAL;
}
#endif
#ifdef BUILD_PCM_NONLINEAR
} else {
/* No conversion is needed */
if (clt->format == slv->format &&
@ -490,15 +548,21 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
clt->channels == clt->channels)
return 0;
switch (slv->format) {
#ifdef BUILD_PCM_PLUGIN_MULAW
case SND_PCM_FORMAT_MU_LAW:
f = snd_pcm_mulaw_open;
break;
#endif
#ifdef BUILD_PCM_PLUGIN_ALAW
case SND_PCM_FORMAT_A_LAW:
f = snd_pcm_alaw_open;
break;
#endif
#ifdef BUILD_PCM_PLUGIN_ADPCM
case SND_PCM_FORMAT_IMA_ADPCM:
f = snd_pcm_adpcm_open;
break;
#endif
default:
assert(0);
return -EINVAL;
@ -507,6 +571,7 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
cfmt = clt->format;
else
cfmt = SND_PCM_FORMAT_S16;
#endif /* NONLINEAR */
}
err = f(new, NULL, slv->format, plug->gen.slave, plug->gen.slave != plug->req_slave);
if (err < 0)
@ -536,9 +601,15 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
snd_pcm_plug_t *plug = pcm->private_data;
static int (*funcs[])(snd_pcm_t *_pcm, snd_pcm_t **new, snd_pcm_plug_params_t *s, snd_pcm_plug_params_t *d) = {
snd_pcm_plug_change_format,
#ifdef BUILD_PCM_PLUGIN_ROUTE
snd_pcm_plug_change_channels,
#endif
#ifdef BUILD_PCM_PLUGIN_RATE
snd_pcm_plug_change_rate,
#endif
#ifdef BUILD_PCM_PLUGIN_ROUTE
snd_pcm_plug_change_channels,
#endif
snd_pcm_plug_change_format,
snd_pcm_plug_change_access
};
@ -551,7 +622,8 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
client->access != p.access) {
snd_pcm_t *new;
int err;
assert(k < sizeof(funcs)/sizeof(*funcs));
if (k >= sizeof(funcs)/sizeof(*funcs))
return -EINVAL;
err = funcs[k](pcm, &new, client, &p);
if (err < 0) {
snd_pcm_plug_clear(pcm);
@ -564,6 +636,7 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
}
k++;
}
#ifdef BUILD_PCM_PLUGIN_ROUTE
/* it's exception, user specified ttable, but no reduction/expand */
if (plug->ttable && !plug->ttable_ok) {
snd_pcm_t *new;
@ -580,6 +653,7 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm,
pcm->fast_ops = new->fast_ops;
pcm->fast_op_arg = new->fast_op_arg;
}
#endif
return 0;
}
@ -1079,6 +1153,7 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name,
slave = n;
continue;
}
#ifdef BUILD_PCM_PLUGIN_ROUTE
if (strcmp(id, "ttable") == 0) {
route_policy = PLUG_ROUTE_POLICY_NONE;
if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) {
@ -1106,6 +1181,7 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name,
route_policy = PLUG_ROUTE_POLICY_DUP;
continue;
}
#endif
SNDERR("Unknown field %s", id);
return -EINVAL;
}
@ -1119,6 +1195,7 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name,
SND_PCM_HW_PARAM_RATE, SCONF_UNCHANGED, &srate);
if (err < 0)
return err;
#ifdef BUILD_PCM_PLUGIN_ROUTE
if (tt) {
err = snd_pcm_route_determine_ttable(tt, &csize, &ssize);
if (err < 0) {
@ -1136,6 +1213,7 @@ int _snd_pcm_plug_open(snd_pcm_t **pcmp, const char *name,
return err;
}
}
#endif
err = snd_pcm_open_slave(&spcm, root, sconf, stream, mode);
snd_config_delete(sconf);

View File

@ -46,32 +46,12 @@ extern const char *_snd_module_pcm_dshare;
extern const char *_snd_module_pcm_asym;
extern const char *_snd_module_pcm_iec958;
extern const char *_snd_module_pcm_softvol;
extern const char *_snd_module_pcm_extplug;
extern const char *_snd_module_pcm_ioplug;
static const char **snd_pcm_open_objects[] = {
&_snd_module_pcm_adpcm,
&_snd_module_pcm_alaw,
&_snd_module_pcm_copy,
&_snd_module_pcm_file,
&_snd_module_pcm_hooks,
&_snd_module_pcm_hw,
&_snd_module_pcm_linear,
&_snd_module_pcm_meter,
&_snd_module_pcm_mulaw,
&_snd_module_pcm_multi,
&_snd_module_pcm_null,
&_snd_module_pcm_plug,
&_snd_module_pcm_rate,
&_snd_module_pcm_route,
&_snd_module_pcm_share,
&_snd_module_pcm_shm,
&_snd_module_pcm_lfloat,
&_snd_module_pcm_ladspa,
&_snd_module_pcm_dmix,
&_snd_module_pcm_dsnoop,
&_snd_module_pcm_dshare,
&_snd_module_pcm_asym,
&_snd_module_pcm_iec958,
&_snd_module_pcm_softvol
#include "pcm_symbols_list.c"
};
void *snd_pcm_open_symbols(void)

View File

@ -1,6 +1,9 @@
EXTRA_LTLIBRARIES=librawmidi.la
librawmidi_la_SOURCES = rawmidi.c rawmidi_hw.c rawmidi_symbols.c rawmidi_virt.c
librawmidi_la_SOURCES = rawmidi.c rawmidi_hw.c rawmidi_symbols.c
if BUILD_SEQ
librawmidi_la_SOURCES += rawmidi_virt.c
endif
noinst_HEADERS = rawmidi_local.h
all: librawmidi.la