From: Takashi Iwai Date: Fri, 18 Jan 2008 12:42:51 +0000 (+0100) Subject: dmix - Enable auto format detection as default X-Git-Tag: v1.0.16rc1~2 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=35d4f9b8d702d027e74573bdeca5fc5e3e2efff8;p=alsa-lib.git 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. --- diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf index 449bdad3..4bf8f07e 100644 --- a/src/conf/alsa.conf +++ b/src/conf/alsa.conf @@ -68,7 +68,7 @@ defaults.pcm.ipc_gid audio defaults.pcm.ipc_perm 0660 defaults.pcm.dmix.max_periods 0 defaults.pcm.dmix.rate 48000 -defaults.pcm.dmix.format S16_LE +defaults.pcm.dmix.format "unchanged" defaults.pcm.dmix.card defaults.pcm.card defaults.pcm.dmix.device defaults.pcm.device defaults.pcm.dsnoop.card defaults.pcm.card 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, ¶ms.format, + SND_PCM_HW_PARAM_FORMAT, SCONF_UNCHANGED, ¶ms.format, SND_PCM_HW_PARAM_RATE, 0, ¶ms.rate, SND_PCM_HW_PARAM_CHANNELS, 0, ¶ms.channels, SND_PCM_HW_PARAM_PERIOD_TIME, 0, ¶ms.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;