Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  snd-pcsp: silent misleading warning
  snd-pcsp: depend on CONFIG_EXPERIMENTAL
  snd-pcsp: put back the compatibility code for the older alsa-libs
  snd-pcsp: adjust help texts to frighten users
This commit is contained in:
Linus Torvalds 2008-05-19 09:24:49 -07:00
commit 83e0c24a38
3 changed files with 30 additions and 13 deletions

View file

@ -28,11 +28,6 @@ config SOUND
and read <file:Documentation/sound/oss/README.modules>; the module and read <file:Documentation/sound/oss/README.modules>; the module
will be called soundcore. 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 <ftp://ftp.infradead.org/pub/pcsp/>.
source "sound/oss/dmasound/Kconfig" source "sound/oss/dmasound/Kconfig"
if !M68K if !M68K

View file

@ -5,9 +5,10 @@ menu "Generic devices"
config SND_PCSP config SND_PCSP
tristate "PC-Speaker support" tristate "PC-Speaker support (READ HELP!)"
depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS
depends on INPUT depends on INPUT
depends on EXPERIMENTAL
depends on SND depends on SND
select SND_PCM select SND_PCM
help help
@ -18,11 +19,21 @@ config SND_PCSP
You can compile this as a module which will be called 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 only want your pc-speaker to beep.
You don't need this driver if you have a tablet piezo beeper You don't need this driver if you have a tablet piezo beeper
in your PC instead of the real speaker. 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 config SND_MPU401_UART
tristate tristate

View file

@ -18,6 +18,8 @@ module_param(nforce_wa, bool, 0444);
MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround " MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround "
"(expect bad sound)"); "(expect bad sound)");
#define DMIX_WANTS_S16 1
static void pcsp_start_timer(unsigned long dummy) static void pcsp_start_timer(unsigned long dummy)
{ {
hrtimer_start(&pcsp_chip.timer, ktime_set(0, 0), HRTIMER_MODE_REL); 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 long flags;
unsigned char timer_cnt, val; unsigned char timer_cnt, val;
int periods_elapsed; int fmt_size, periods_elapsed;
u64 ns; u64 ns;
size_t period_bytes, buffer_bytes; size_t period_bytes, buffer_bytes;
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
@ -92,8 +94,11 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
goto exit_nr_unlock2; goto exit_nr_unlock2;
runtime = substream->runtime; runtime = substream->runtime;
/* assume it is u8 mono */ fmt_size = snd_pcm_format_physical_width(runtime->format) >> 3;
val = runtime->dma_area[chip->playback_ptr]; /* 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; timer_cnt = val * CUR_DIV() / 256;
if (timer_cnt && chip->enable) { if (timer_cnt && chip->enable) {
@ -111,12 +116,14 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
period_bytes = snd_pcm_lib_period_bytes(substream); period_bytes = snd_pcm_lib_period_bytes(substream);
buffer_bytes = snd_pcm_lib_buffer_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; periods_elapsed = chip->playback_ptr - chip->period_ptr;
if (periods_elapsed < 0) { 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", "(%zi %zi %zi)\n",
chip->playback_ptr, period_bytes, buffer_bytes); chip->playback_ptr, period_bytes, buffer_bytes);
#endif
periods_elapsed += buffer_bytes; periods_elapsed += buffer_bytes;
} }
periods_elapsed /= period_bytes; periods_elapsed /= period_bytes;
@ -270,7 +277,11 @@ static struct snd_pcm_hardware snd_pcsp_playback = {
.info = (SNDRV_PCM_INFO_INTERLEAVED | .info = (SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_HALF_DUPLEX | SNDRV_PCM_INFO_HALF_DUPLEX |
SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID), 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, .rates = SNDRV_PCM_RATE_KNOT,
.rate_min = PCSP_DEFAULT_SRATE, .rate_min = PCSP_DEFAULT_SRATE,
.rate_max = PCSP_DEFAULT_SRATE, .rate_max = PCSP_DEFAULT_SRATE,