* S16_LE + softvol = bad @ 2008-01-17 13:40 Alexander E. Patrakov 2008-01-17 14:00 ` Clemens Ladisch 0 siblings, 1 reply; 9+ messages in thread From: Alexander E. Patrakov @ 2008-01-17 13:40 UTC (permalink / raw) To: alsa-devel Hello developers, some cards (most notably, Intel HD audio) have the PCM control as softvol, and default to S16_LE as a format for dmix. Since softvol is configured to attenuate signal, and not many people set this control to 100% (especially those who have no other volume controls), this effectively leaves less than 16 bits per sample. The card can surely produce sound of better quality in most cases, if one changes defaults.pcm.dmix.format in ~/.asoundrc. However, one should now search a lot of forums in order to know about this setting. Not everyone does this, and not everyone is even able to diagnose the "noisy sound in Linux" problem properly as "too few bits per sample in the default configuration". A much better situation would be if ALSA defaulted to good quality (i.e.: S24_LE or S32_LE on all cards that require softvol and support this sample format). Could you please change the files in /usr/share/alsa/cards accordingly? -- Alexander E. Patrakov ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-17 13:40 S16_LE + softvol = bad Alexander E. Patrakov @ 2008-01-17 14:00 ` Clemens Ladisch 2008-01-17 14:11 ` Takashi Iwai [not found] ` <c072ca310801170612p7d06813ve5269dd82afb6619@mail.gmail.com> 0 siblings, 2 replies; 9+ messages in thread From: Clemens Ladisch @ 2008-01-17 14:00 UTC (permalink / raw) To: Alexander E. Patrakov, alsa-devel Alexander E. Patrakov wrote: > some cards (most notably, Intel HD audio) have the PCM control as softvol, and > default to S16_LE as a format for dmix. HDA-Intel.conf doesn't set a sample format, and when none is set, dmix tries S32 before S16. You get S16 only if the device doesn't support S32. Regards, Clemens ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-17 14:00 ` Clemens Ladisch @ 2008-01-17 14:11 ` Takashi Iwai 2008-01-17 14:23 ` Takashi Iwai [not found] ` <c072ca310801170612p7d06813ve5269dd82afb6619@mail.gmail.com> 1 sibling, 1 reply; 9+ messages in thread From: Takashi Iwai @ 2008-01-17 14:11 UTC (permalink / raw) To: Clemens Ladisch; +Cc: alsa-devel, Alexander E. Patrakov At Thu, 17 Jan 2008 15:00:47 +0100, Clemens Ladisch wrote: > > Alexander E. Patrakov wrote: > > some cards (most notably, Intel HD audio) have the PCM control as softvol, and > > default to S16_LE as a format for dmix. > > HDA-Intel.conf doesn't set a sample format, and when none is set, dmix > tries S32 before S16. You get S16 only if the device doesn't support > S32. The plugin code is written partly in such a way, but the other parts do require the format given explicitly. So, it doesn't work as is. Fixing this wouldn't be hard, I guess, though. Takashi ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-17 14:11 ` Takashi Iwai @ 2008-01-17 14:23 ` Takashi Iwai 2008-01-17 15:01 ` Alexander E. Patrakov 0 siblings, 1 reply; 9+ messages in thread From: Takashi Iwai @ 2008-01-17 14:23 UTC (permalink / raw) To: Clemens Ladisch; +Cc: alsa-devel, Alexander E. Patrakov At Thu, 17 Jan 2008 15:11:18 +0100, I wrote: > > At Thu, 17 Jan 2008 15:00:47 +0100, > Clemens Ladisch wrote: > > > > Alexander E. Patrakov wrote: > > > some cards (most notably, Intel HD audio) have the PCM control as softvol, and > > > default to S16_LE as a format for dmix. > > > > HDA-Intel.conf doesn't set a sample format, and when none is set, dmix > > tries S32 before S16. You get S16 only if the device doesn't support > > S32. > > The plugin code is written partly in such a way, but the other parts > do require the format given explicitly. So, it doesn't work as is. > Fixing this wouldn't be hard, I guess, though. ... and the below is the fix. Give it a try. Takashi diff -r f20b309ff22a src/conf/alsa.conf --- a/src/conf/alsa.conf Tue Jan 15 14:29:34 2008 +0100 +++ b/src/conf/alsa.conf Thu Jan 17 15:18:53 2008 +0100 @@ -68,7 +68,7 @@ defaults.pcm.ipc_perm 0660 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 -r f20b309ff22a src/pcm/pcm_direct.c --- a/src/pcm/pcm_direct.c Tue Jan 15 14:29:34 2008 +0100 +++ b/src/pcm/pcm_direct.c Thu Jan 17 15:18:53 2008 +0100 @@ -874,7 +874,11 @@ int snd_pcm_direct_initialize_slave(snd_ 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 -r f20b309ff22a src/pcm/pcm_dmix.c --- a/src/pcm/pcm_dmix.c Tue Jan 15 14:29:34 2008 +0100 +++ b/src/pcm/pcm_dmix.c Thu Jan 17 15:18:53 2008 +0100 @@ -1267,7 +1267,7 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, 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, 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; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-17 14:23 ` Takashi Iwai @ 2008-01-17 15:01 ` Alexander E. Patrakov 2008-01-18 12:46 ` Takashi Iwai 0 siblings, 1 reply; 9+ messages in thread From: Alexander E. Patrakov @ 2008-01-17 15:01 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel 2008/1/17, Takashi Iwai <tiwai@suse.de>: > ... and the below is the fix. Give it a try. Tested with no explicit defaults.pcm.dmix.format, with explicit S16_LE, and with explicit S32_LE, all with Intel HD audio and the PC speaker (total 6 cases, including one meaningless). In all cases, the code was able to choose the correct format for talking with hardware (i.e., the worst of (a) explicitly specified, if any, and (b) the best hardware-supported one). Thanks for a quick fix! > > > Takashi > > diff -r f20b309ff22a src/conf/alsa.conf > --- a/src/conf/alsa.conf Tue Jan 15 14:29:34 2008 +0100 > +++ b/src/conf/alsa.conf Thu Jan 17 15:18:53 2008 +0100 > @@ -68,7 +68,7 @@ defaults.pcm.ipc_perm 0660 > 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 -r f20b309ff22a src/pcm/pcm_direct.c > --- a/src/pcm/pcm_direct.c Tue Jan 15 14:29:34 2008 +0100 > +++ b/src/pcm/pcm_direct.c Thu Jan 17 15:18:53 2008 +0100 > @@ -874,7 +874,11 @@ int snd_pcm_direct_initialize_slave(snd_ > 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 -r f20b309ff22a src/pcm/pcm_dmix.c > --- a/src/pcm/pcm_dmix.c Tue Jan 15 14:29:34 2008 +0100 > +++ b/src/pcm/pcm_dmix.c Thu Jan 17 15:18:53 2008 +0100 > @@ -1267,7 +1267,7 @@ int _snd_pcm_dmix_open(snd_pcm_t **pcmp, > 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, > 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; > -- Alexander E. Patrakov ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-17 15:01 ` Alexander E. Patrakov @ 2008-01-18 12:46 ` Takashi Iwai 2008-01-23 11:21 ` Alexander E. Patrakov 0 siblings, 1 reply; 9+ messages in thread From: Takashi Iwai @ 2008-01-18 12:46 UTC (permalink / raw) To: Alexander E. Patrakov; +Cc: alsa-devel At Thu, 17 Jan 2008 20:01:09 +0500, Alexander E. Patrakov wrote: > > 2008/1/17, Takashi Iwai <tiwai@suse.de>: > > ... and the below is the fix. Give it a try. > > Tested with no explicit defaults.pcm.dmix.format, with explicit > S16_LE, and with explicit S32_LE, all with Intel HD audio and the PC > speaker (total 6 cases, including one meaningless). In all cases, the > code was able to choose the correct format for talking with hardware > (i.e., the worst of (a) explicitly specified, if any, and (b) the best > hardware-supported one). Thanks for a quick fix! Thanks for checking. I applied it to HG tree now. This might break something on some drivers due to the format changes (requiring larger buffers) although I don't think it won't be much. Let's see. For such devices, we can add S16 in the card config. Takashi ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-18 12:46 ` Takashi Iwai @ 2008-01-23 11:21 ` Alexander E. Patrakov 2008-01-23 11:31 ` Takashi Iwai 0 siblings, 1 reply; 9+ messages in thread From: Alexander E. Patrakov @ 2008-01-23 11:21 UTC (permalink / raw) To: Takashi Iwai; +Cc: alsa-devel Takashi Iwai wrote: > At Thu, 17 Jan 2008 20:01:09 +0500, > Alexander E. Patrakov wrote: >> 2008/1/17, Takashi Iwai <tiwai@suse.de>: >>> ... and the below is the fix. Give it a try. >> Tested with no explicit defaults.pcm.dmix.format, with explicit >> S16_LE, and with explicit S32_LE, all with Intel HD audio and the PC >> speaker (total 6 cases, including one meaningless). In all cases, the >> code was able to choose the correct format for talking with hardware >> (i.e., the worst of (a) explicitly specified, if any, and (b) the best >> hardware-supported one). Thanks for a quick fix! > > Thanks for checking. I applied it to HG tree now. Could you please apply the same tweak (use the best available sample format unless overridden) to dsnoop, too? -- Alexander E. Patrakov ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: S16_LE + softvol = bad 2008-01-23 11:21 ` Alexander E. Patrakov @ 2008-01-23 11:31 ` Takashi Iwai 0 siblings, 0 replies; 9+ messages in thread From: Takashi Iwai @ 2008-01-23 11:31 UTC (permalink / raw) To: Alexander E. Patrakov; +Cc: alsa-devel At Wed, 23 Jan 2008 16:21:46 +0500, Alexander E. Patrakov wrote: > > Takashi Iwai wrote: > > At Thu, 17 Jan 2008 20:01:09 +0500, > > Alexander E. Patrakov wrote: > >> 2008/1/17, Takashi Iwai <tiwai@suse.de>: > >>> ... and the below is the fix. Give it a try. > >> Tested with no explicit defaults.pcm.dmix.format, with explicit > >> S16_LE, and with explicit S32_LE, all with Intel HD audio and the PC > >> speaker (total 6 cases, including one meaningless). In all cases, the > >> code was able to choose the correct format for talking with hardware > >> (i.e., the worst of (a) explicitly specified, if any, and (b) the best > >> hardware-supported one). Thanks for a quick fix! > > > > Thanks for checking. I applied it to HG tree now. > > Could you please apply the same tweak (use the best available sample format > unless overridden) to dsnoop, too? Done. Takashi ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <c072ca310801170612p7d06813ve5269dd82afb6619@mail.gmail.com>]
* Re: S16_LE + softvol = bad [not found] ` <c072ca310801170612p7d06813ve5269dd82afb6619@mail.gmail.com> @ 2008-01-17 14:14 ` Alexander E. Patrakov 0 siblings, 0 replies; 9+ messages in thread From: Alexander E. Patrakov @ 2008-01-17 14:14 UTC (permalink / raw) To: cladisch; +Cc: tiwai, alsa-devel [sorry for a possible duplicate] 2008/1/17, Clemens Ladisch <cladisch@fastmail.net>: > Alexander E. Patrakov wrote: > > some cards (most notably, Intel HD audio) have the PCM control as softvol, and > > default to S16_LE as a format for dmix. > > HDA-Intel.conf doesn't set a sample format, and when none is set, dmix > tries S32 before S16. You get S16 only if the device doesn't support > S32. Sorry, this doesn't appear to be the case here. # with explicit defaults.pcm.dmix.format S32_LE patrakov@home:~$ aplay -vv /usr/share/sounds/alsa/Front_Left.wav Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono Plug PCM: Route conversion PCM (sformat=S32_LE) Transformation table: 0 <- 0 1 <- 0 Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S16_LE subformat : STD channels : 1 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 8192 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 8192 stop_threshold : 8192 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Slave: Soft volume PCM Control: PCM Playback Volume min_dB: -51 max_dB: 0 resolution: 256 Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 32 buffer_size : 8192 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 8192 stop_threshold : 8192 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Slave: Direct Stream Mixing PCM Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 32 buffer_size : 8192 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 8192 stop_threshold : 8192 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Hardware PCM card 0 'HDA Intel' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S32_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 32 buffer_size : 8192 period_size : 1024 period_time : 21333 tick_time : 4000 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 1 stop_threshold : 1073741824 silence_threshold: 0 silence_size : 1073741824 boundary : 1073741824 #+ | 00% # The same without defaults.pcm.dmix.format patrakov@home:~$ aplay -vv /usr/share/sounds/alsa/Front_Left.wav Playing WAVE '/usr/share/sounds/alsa/Front_Left.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono Plug PCM: Route conversion PCM (sformat=S16_LE) Transformation table: 0 <- 0 1 <- 0 Its setup is: stream : PLAYBACK access : RW_INTERLEAVED format : S16_LE subformat : STD channels : 1 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 16384 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 16384 stop_threshold : 16384 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Slave: Soft volume PCM Control: PCM Playback Volume min_dB: -51 max_dB: 0 resolution: 256 Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 16384 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 16384 stop_threshold : 16384 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Slave: Direct Stream Mixing PCM Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 16384 period_size : 1024 period_time : 21333 tick_time : 0 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 16384 stop_threshold : 16384 silence_threshold: 0 silence_size : 0 boundary : 1073741824 Hardware PCM card 0 'HDA Intel' device 0 subdevice 0 Its setup is: stream : PLAYBACK access : MMAP_INTERLEAVED format : S16_LE subformat : STD channels : 2 rate : 48000 exact rate : 48000 (48000/1) msbits : 16 buffer_size : 16384 period_size : 1024 period_time : 21333 tick_time : 4000 tstamp_mode : NONE period_step : 1 sleep_min : 0 avail_min : 1024 xfer_align : 1024 start_threshold : 1 stop_threshold : 1073741824 silence_threshold: 0 silence_size : 1073741824 boundary : 1073741824 # + | 49% This is with libasound2 1.0.15-3 from Debian. -- Alexander E. Patrakov ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-01-23 11:31 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-17 13:40 S16_LE + softvol = bad Alexander E. Patrakov
2008-01-17 14:00 ` Clemens Ladisch
2008-01-17 14:11 ` Takashi Iwai
2008-01-17 14:23 ` Takashi Iwai
2008-01-17 15:01 ` Alexander E. Patrakov
2008-01-18 12:46 ` Takashi Iwai
2008-01-23 11:21 ` Alexander E. Patrakov
2008-01-23 11:31 ` Takashi Iwai
[not found] ` <c072ca310801170612p7d06813ve5269dd82afb6619@mail.gmail.com>
2008-01-17 14:14 ` Alexander E. Patrakov
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.