From 3ccee69019d3b23f02204f4c2cb3085f436da252 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Fri, 16 May 2008 12:10:03 +0200 Subject: [PATCH 1/4] snd-pcsp: adjust help texts to frighten users Added the warning text to the help of snd-pcsp about the possible problem with this driver so that user can know of the problem in advance. Also, removed the obsoleted text about ancient pc-speaker patch in CONFIG_SOUND help. Signed-off-by: Stas Sergeev Signed-off-by: Takashi Iwai --- sound/Kconfig | 5 ----- sound/drivers/Kconfig | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/sound/Kconfig b/sound/Kconfig index b2a2db47aff5..4247406160e7 100644 --- a/sound/Kconfig +++ b/sound/Kconfig @@ -28,11 +28,6 @@ config SOUND and read ; the module will be called soundcore. - I'm told that even without a sound card, you can make your computer - say more than an occasional beep, by programming the PC speaker. - Kernel patches and supporting utilities to do that are in the pcsp - package, available at . - source "sound/oss/dmasound/Kconfig" if !M68K diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 379bcb074463..d7ff28809867 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig @@ -5,7 +5,7 @@ menu "Generic devices" config SND_PCSP - tristate "PC-Speaker support" + tristate "PC-Speaker support (READ HELP!)" depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS depends on INPUT depends on SND @@ -18,11 +18,21 @@ config SND_PCSP You can compile this as a module which will be called snd-pcsp. + WARNING: if you already have a soundcard, enabling this + driver may lead to a problem. Namely, it may get loaded + before the other sound driver of yours, making the + pc-speaker a default sound device. Which is likely not + what you want. To make this driver play nicely with other + sound driver, you can add this into your /etc/modprobe.conf: + options snd-pcsp index=2 + You don't need this driver if you only want your pc-speaker to beep. You don't need this driver if you have a tablet piezo beeper in your PC instead of the real speaker. - It should not hurt to say Y or M here in all other cases. + Say N if you have a sound card. + Say M if you don't. + Say Y only if you really know what you do. config SND_MPU401_UART tristate From 4dfd79546dfed83bf756f5c912f686ebac187c16 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sat, 17 May 2008 08:44:41 +0200 Subject: [PATCH 2/4] snd-pcsp: put back the compatibility code for the older alsa-libs The attached patch adds back the compatibility code, allowing the driver to work with older alsa-libs. The removal was premature, it breaks the real-life configs. Signed-off-by: Stas Sergeev Signed-off-by: Takashi Iwai --- sound/drivers/pcsp/pcsp_lib.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/sound/drivers/pcsp/pcsp_lib.c b/sound/drivers/pcsp/pcsp_lib.c index ac6238e93513..54253e9b4b02 100644 --- a/sound/drivers/pcsp/pcsp_lib.c +++ b/sound/drivers/pcsp/pcsp_lib.c @@ -18,6 +18,8 @@ module_param(nforce_wa, bool, 0444); MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround " "(expect bad sound)"); +#define DMIX_WANTS_S16 1 + static void pcsp_start_timer(unsigned long dummy) { hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL); @@ -47,7 +49,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) { unsigned long flags; unsigned char timer_cnt, val; - int periods_elapsed; + int fmt_size, periods_elapsed; u64 ns; size_t period_bytes, buffer_bytes; struct snd_pcm_substream *substream; @@ -92,8 +94,11 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) goto exit_nr_unlock2; runtime = substream->runtime; - /* assume it is u8 mono */ - val = runtime->dma_area[chip->playback_ptr]; + fmt_size = snd_pcm_format_physical_width(runtime->format) >> 3; + /* assume it is mono! */ + val = runtime->dma_area[chip->playback_ptr + fmt_size - 1]; + if (snd_pcm_format_signed(runtime->format)) + val ^= 0x80; timer_cnt = val * CUR_DIV() / 256; if (timer_cnt && chip->enable) { @@ -111,7 +116,7 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) period_bytes = snd_pcm_lib_period_bytes(substream); buffer_bytes = snd_pcm_lib_buffer_bytes(substream); - chip->playback_ptr += PCSP_INDEX_INC(); + chip->playback_ptr += PCSP_INDEX_INC() * fmt_size; periods_elapsed = chip->playback_ptr - chip->period_ptr; if (periods_elapsed < 0) { printk(KERN_WARNING "PCSP: playback_ptr inconsistent " @@ -270,7 +275,11 @@ static struct snd_pcm_hardware snd_pcsp_playback = { .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_HALF_DUPLEX | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID), - .formats = SNDRV_PCM_FMTBIT_U8, + .formats = (SNDRV_PCM_FMTBIT_U8 +#if DMIX_WANTS_S16 + | SNDRV_PCM_FMTBIT_S16_LE +#endif + ), .rates = SNDRV_PCM_RATE_KNOT, .rate_min = PCSP_DEFAULT_SRATE, .rate_max = PCSP_DEFAULT_SRATE, From 2bc536a235382f2a14fbbefd4fa9cd6089c9d0d0 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sat, 17 May 2008 08:46:55 +0200 Subject: [PATCH 3/4] snd-pcsp: depend on CONFIG_EXPERIMENTAL Considering all the feedbacks I got, depending snd-pcsp on CONFIG_EXPERIMENTAL looks like the only safe way to get out of all the troubles at one go. :) Signed-off-by: Stas Sergeev Signed-off-by: Takashi Iwai --- sound/drivers/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index d7ff28809867..602b58e3b55d 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig @@ -8,6 +8,7 @@ config SND_PCSP tristate "PC-Speaker support (READ HELP!)" depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS depends on INPUT + depends on EXPERIMENTAL depends on SND select SND_PCM help From 42ece6c1f8162cd782b44dc4863679e888531df5 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sun, 18 May 2008 18:30:03 +0200 Subject: [PATCH 4/4] snd-pcsp: silent misleading warning It appears that alsa allows a sound buffer with size not evenly devided by the period size. This triggers a warning in snd-pcsp and floods the log. As a quick fix, the warning should be disabled. Signed-off-by: Stas Sergeev Signed-off-by: Takashi Iwai --- sound/drivers/pcsp/pcsp_lib.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sound/drivers/pcsp/pcsp_lib.c b/sound/drivers/pcsp/pcsp_lib.c index 54253e9b4b02..7ad4a1534b2b 100644 --- a/sound/drivers/pcsp/pcsp_lib.c +++ b/sound/drivers/pcsp/pcsp_lib.c @@ -119,9 +119,11 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle) chip->playback_ptr += PCSP_INDEX_INC() * fmt_size; periods_elapsed = chip->playback_ptr - chip->period_ptr; if (periods_elapsed < 0) { - printk(KERN_WARNING "PCSP: playback_ptr inconsistent " +#if PCSP_DEBUG + printk(KERN_INFO "PCSP: buffer_bytes mod period_bytes != 0 ? " "(%zi %zi %zi)\n", chip->playback_ptr, period_bytes, buffer_bytes); +#endif periods_elapsed += buffer_bytes; } periods_elapsed /= period_bytes;