summaryrefslogtreecommitdiff
path: root/src/pcm
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2008-01-18 13:42:51 +0100
committerTakashi Iwai <tiwai@suse.de>2008-01-18 13:42:51 +0100
commit35d4f9b8d702d027e74573bdeca5fc5e3e2efff8 (patch)
tree5707e2142edd740119ba6a8fadbec17d3bc508d3 /src/pcm
parent91fc64cefb427bce0ac49f7acd2f3cf2d68ebb4b (diff)
downloadalsa-lib-35d4f9b8d702d027e74573bdeca5fc5e3e2efff8.tar.gz
dmix - Enable auto format detection as default
The direct plugins have the automatic format-detection feature but it wasn't enabled properly in the interface. Now you can pass the format "unchanged" to make the plugin detect a proper format. This will change the default format of some drivers, such as, HD-audio.
Diffstat (limited to 'src/pcm')
-rw-r--r--src/pcm/pcm_direct.c6
-rw-r--r--src/pcm/pcm_dmix.c8
2 files changed, 10 insertions, 4 deletions
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
index 75d540d4..a884b120 100644
--- a/src/pcm/pcm_direct.c
+++ b/src/pcm/pcm_direct.c
@@ -874,7 +874,11 @@ int snd_pcm_direct_initialize_slave(snd_pcm_direct_t *dmix, snd_pcm_t *spcm, str
return ret;
}
}
- ret = snd_pcm_hw_params_set_format(spcm, hw_params, params->format);
+ if (params->format == SND_PCM_FORMAT_UNKNOWN)
+ ret = -EINVAL;
+ else
+ ret = snd_pcm_hw_params_set_format(spcm, hw_params,
+ params->format);
if (ret < 0) {
static const snd_pcm_format_t dmix_formats[] = {
SND_PCM_FORMAT_S32,
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index e54cf922..4d21e9ba 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -1267,7 +1267,7 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
params.periods = 3;
err = snd_pcm_slave_conf(root, dopen.slave, &sconf, 8,
- SND_PCM_HW_PARAM_FORMAT, 0, &params.format,
+ SND_PCM_HW_PARAM_FORMAT, SCONF_UNCHANGED, &params.format,
SND_PCM_HW_PARAM_RATE, 0, &params.rate,
SND_PCM_HW_PARAM_CHANNELS, 0, &params.channels,
SND_PCM_HW_PARAM_PERIOD_TIME, 0, &params.period_time,
@@ -1282,8 +1282,10 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
if (psize == -1 && params.period_time == -1)
params.period_time = 125000; /* 0.125 seconds */
- /* sorry, limited features */
- if (! (dmix_supported_format & (1ULL << params.format))) {
+ if (params.format == -2)
+ params.format = SND_PCM_FORMAT_UNKNOWN;
+ else if (!(dmix_supported_format & (1ULL << params.format))) {
+ /* sorry, limited features */
SNDERR("Unsupported format");
snd_config_delete(sconf);
return -EINVAL;