Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Mar 2003 19:02:28 +0100 (CET)
From:      Ulrich Spoerlein <q@uni.de>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/48927: pcm: setting samplerate below 3400 or above 48700 will result in infinte loop in channel.c:chn_tryspeed()
Message-ID:  <200303041802.h24I2SM1050281@coyote.dnsalias.net>

next in thread | raw e-mail | index | archive | help

>Number:         48927
>Category:       kern
>Synopsis:       pcm: setting samplerate below 3400 or above 48700 will result in infinte loop in channel.c:chn_tryspeed()
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar 04 10:10:02 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Ulrich Spoerlein
>Release:        FreeBSD 4.7-STABLE i386
>Organization:
>Environment:
System: FreeBSD coyote.dnsalias.net 4.7-STABLE FreeBSD 4.7-STABLE #0: Thu Jan 23 14:05:57 CET 2003 root@roadrunner:/usr/obj/usr/src/sys/COYOTE i386

Copyright (c) 1992-2003 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	The Regents of the University of California. All rights reserved.
FreeBSD 4.8-RC #3: Tue Mar  4 18:19:11 CET 2003
    root@roadrunner:/usr/obj/usr/src/sys/ROADRUNNER
Timecounter "i8254"  frequency 1193182 Hz
CPU: Intel Celeron (902.05-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x686  Stepping = 6
  Features=0x383f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE>
real memory  = 402640896 (393204K bytes)
avail memory = 386125824 (377076K bytes)
Preloaded elf kernel "kernel" at 0xc04ee000.
Preloaded elf module "nvidia.ko" at 0xc04ee09c.
link_elf: symbol linux_ioctl_register_handler undefined
VESA: v3.0, 16384k memory, flags:0x1, mode table:0xc0332302 (1000022)
VESA: NVidia
netsmb_dev: loaded
Pentium Pro MTRR support enabled
md0: Malloc disk
Using $PIR table, 6 entries at 0xc00f0d10
apm0: <APM BIOS> on motherboard
apm0: found APM BIOS v1.2, connected at v1.2
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Intel 82443BX (440 BX) host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
agp0: <Intel 82443BX (440 BX) host to PCI bridge> mem 0xe4000000-0xe7ffffff at device 0.0 on pci0
pcib1: <Intel 82443BX (440 BX) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <NVidia model 0110 graphics accelerator> at 0.0 irq 11
isab0: <Intel 82371AB PCI to ISA bridge> at device 4.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX4 ATA33 controller> port 0xd800-0xd80f at device 4.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
pci0: <Intel 82371AB/EB (PIIX4) USB controller> at 4.2 irq 5
intpm0: <Intel 82371AB Power management controller> port 0xe800-0xe80f irq 9 at device 4.3 on pci0
intpm0: I/O mapped e800
intpm0: intr IRQ 9 enabled revision 0
smbus0: <System Management Bus> on intsmb0
smb0: <SMBus general purpose I/O> on smbus0
intpm0: PM I/O mapped e400 
pcm0: <Creative EMU10K1> port 0xd000-0xd01f irq 5 at device 9.0 on pci0
pcm0: <SigmaTel STAC9721/9723 ac97 codec>
bktr0: <BrookTree 878> mem 0xd7000000-0xd7000fff irq 7 at device 11.0 on pci0
iicbb0: <I2C bit-banging driver> on bti2c0
iicbus0: <Philips I2C bus> on iicbb0 master-only
iicsmb0: <I2C to SMB bridge> on iicbus0
smbus1: <System Management Bus> on iicsmb0
smb1: <SMBus general purpose I/O> on smbus1
iicbus1: <Philips I2C bus> on iicbb0 master-only
iicsmb1: <I2C to SMB bridge> on iicbus1
smbus2: <System Management Bus> on iicsmb1
smb2: <SMBus general purpose I/O> on smbus2
smbus3: <System Management Bus> on bti2c0
smb3: <SMBus general purpose I/O> on smbus3
bktr0: Hauppauge Model 44354 C221
bktr0: Detected a MSP3415D-B3 at 0x80
bktr0: Hauppauge WinCast/TV, Philips FR1216 PAL FM tuner, msp3400c stereo, remote control.
pci0: <unknown card> (vendor=0x109e, dev=0x0878) at 11.1 irq 7
xl0: <3Com 3c905B-TX Fast Etherlink XL> port 0xb400-0xb47f mem 0xd4800000-0xd480007f irq 11 at device 12.0 on pci0
xl0: Ethernet address: 00:10:5a:d9:e7:4c
miibus0: <MII bus> on xl0
xlphy0: <3Com internal media interface> on miibus0
xlphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> flags 0x8 irq 12 on atkbdc0
psm0: model IntelliMouse, device ID 3
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f flags 0x8 on isa0
ppc0: SMC-like chipset (ECP-only) in ECP mode
ppc0: FIFO with 16/16/9 bytes threshold
ppbus0: IEEE1284 device found 
Probing for PnP devices on ppbus0:
lpt0: <Printer> on ppbus0
lpt0: Polled port
ppi0: <Parallel I/O> on ppbus0
ad0: 76351MB <SAMSUNG SV8004H> [155127/16/63] at ata0-master UDMA33
acd0: CD-RW <ASUS CRW-4012A> at ata1-master UDMA33
Mounting root from ufs:/dev/ad0s2a
cd0 at ata1 bus 0 target 0 lun 0
cd0: <ASUS CRW-4012A 1.0> Removable CD-ROM SCSI-0 device 
cd0: 33.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
cd9660: Joliet Extension (Level 1)
nvidia0: <GeForce2 MX/MX 400> mem 0xd8000000-0xdfffffff,0xd5000000-0xd5ffffff irq 11 at device 0.0 on pci1


pciconf -vl
pcm0@pci0:9:0:  class=0x040100 card=0x00201102 chip=0x00021102 rev=0x05 hdr=0x00
    vendor   = 'Creative Labs'
    device   = 'EMU10K1 Audio Chipset (SB Live!)'
    class    = multimedia
    subclass = audio
emujoy0@pci0:9:1:       class=0x098000 card=0x00201102 chip=0x70021102 rev=0x05 hdr=0x00
    vendor   = 'Creative Labs'
    device   = 'PCI Gameport Joystick'
    class    = input device


>Description:
While debugging WINE on FreeBSD I noticed that it was unable to _try_ setting
/dev/dsp to 96kHz. It wants to try 96000, 48000, 44100, .. etc, Hz and takes
the first one that got set correctly. Sadly it will enter an infinite loop
while doing this ioctl:

rc = 96000;
ioctl(fd, SNDCTL_DSP_SPEED, &rc)

I then tried which rates would cleanly exit the ioctl(), and which ones would
cause infinite loops. Looks like anything below 3400 and above 48700 will cause
this behaviour. A ktrace/kdump will look like this:

  1982 oss-test CALL  write(0x1,0x804b000,0x1f)
  1982 oss-test GIO   fd 1 wrote 31 bytes
       "setting sampling rate to 48000
       "
  1982 oss-test RET   write 31/0x1f
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl 0
  1982 oss-test CALL  write(0x1,0x804b000,0x1f)
  1982 oss-test GIO   fd 1 wrote 31 bytes
       "setting sampling rate to 96000
       "
  1982 oss-test RET   write 31/0x1f
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  1982 oss-test CALL  ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558)
  1982 oss-test RET   ioctl RESTART
  [....]

(I included the call with 48000 to make the normal behaviuor clear)

truss looks similiar:

setting sampling rate to 48000
write(1,0x804b000,31)                            = 31 (0x1f)
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             = 0 (0x0)
setting sampling rate to 96000
write(1,0x804b000,31)                            = 31 (0x1f)
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             ERR#54 'Connection reset by peer'
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             ERR#54 'Connection reset by peer'
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             ERR#54 'Connection reset by peer'
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             ERR#54 'Connection reset by peer'
ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524)             ERR#54 'Connection reset by peer'
[...]

I then turned on debugging printf() in the pcm-driver. Here is the output with
rates between 8000 - 48000Hz

/kernel: pcm0: <Creative EMU10K1> port 0xd000-0xd01f irq 5 at device 9.0 on pci0
/kernel: pcm0: <SigmaTel STAC9721/9723 ac97 codec>
/kernel: want format 8
/kernel: not mapped, feederflags 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: defaulting to (1024, 128)
/kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62
/kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: defaulting to (1024, 128)
/kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62
/kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62
/kernel: setspeed done, r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: defaulting to (1024, 128)
/kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62
/kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62
/kernel: SNDCTL_DSP_SETFRAGMENT 0x0020000b
/kernel: SNDCTL_DSP_SETFRAGMENT 32 frags, 2048 sz
/kernel: chn_setblocksize(32, 2048)
/kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 3
/kernel: chn_setblocksize: hard blksz requested 256 (maxsize 4096), got 256, irqhz == 31
/kernel: want format 16
/kernel: not mapped, feederflags 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 2, spd 8000, irqhz == 7
/kernel: chn_setblocksize: hard blksz requested 512 (maxsize 4096), got 512, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: want format 268435472
/kernel: not mapped, feederflags 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 11025, try speed 11025, got speed 11025
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 11025, irqhz == 21
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 21
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 16000, try speed 16000, got speed 16000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 16000, irqhz == 31
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 22050, try speed 22050, got speed 22050
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 22050, irqhz == 43
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 43
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 24000, try speed 24000, got speed 24000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 24000, irqhz == 46
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 46
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 32000, try speed 32000, got speed 32000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 32000, irqhz == 62
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 62
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 44100, try speed 44100, got speed 44100
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 44100, irqhz == 86
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 86
/kernel: setspeed done, r = 0
/kernel: chn_flush c->flags 0x00013000
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: defaulting to (32, 4096)
/kernel: chn_setblocksize: soft bps 4, spd 44100, irqhz == 43
/kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 86


And here comes the interessting part:

/kernel: pcm0: <Creative EMU10K1> port 0xd000-0xd01f irq 5 at device 9.0 on pci0
/kernel: pcm0: <SigmaTel STAC9721/9723 ac97 codec>
/kernel: , feederflags 10
      ^^^^^
      stack corruption?

/kernel: find feeder type 4, got 0xc25a60e0
/kernel: added feeder 0xc25a60e0, output 10000010
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 96000, irqhz == 187
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187
/kernel: feedrate = 0xc268b400
/kernel: feeder_set(FEEDRATE_SRC, 96000) = -1
/kernel: setspeed done, r = -1
/kernel: Failed to set speed 96000 falling back to 8000
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 96000, try speed 48000, got speed 48000
/kernel: not mapped, feederflags 10
/kernel: find feeder type 4, got 0xc25a60e0
/kernel: added feeder 0xc25a60e0, output 10000010
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: sof, feederflags 10
/kernel: find feeder type 4, got 0xc25a60e0
/kernel: added feeder 0xc25a60e0, output 10000010
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 96000, irqhz == 187
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187
/kernel: feedrate = 0xc268b400
/kernel: feeder_set(FEEDRATE_SRC, 96000) = -1
/kernel: setspeed done, r = -1
/kernel: Failed to set speed 96000 falling back to 8000
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31
/kernel: setspeed done, r = 0
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 96000, try speed 48000, got speed 48000
/kernel: not mapped, feederflags 10
/kernel: find feeder type 4, got 0xc25a60e0
/kernel: added feeder 0xc25a60e0, output 10000010
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: ze: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187
        ^^^^
	stack corruption?
/kernel: feedrate = 0xc268b400
/kernel: feeder_set(FEEDRATE_SRC, 96000) = -1
/kernel: setspeed done, r = -1
/kernel: Failed to set speed 96000 falling back to 8000
/kernel: setspeed, channel pcm0:play:0
/kernel: want speed 8000, try speed 8000, got speed 8000
/kernel: not mapped, feederflags 0
/kernel: r = 0
/kernel: chn_setblocksize(0, 0)
/kernel: chn_setblocksize: updating (32, 2048)
/kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15
/kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31
/kernel: setspeed done, r = 0
[endless loop]

The obvious difference to the working example is feederflags=10 (and not 0) and
it will enter the code in sys/dev/sound/pcm/channel.c at around line 830. There
are several if (r) goto out; but I'm not sure which one the working example
takes and which one causes the endless loop (I guess it has to do something
with the return value in r.

Any help is greatly appreciated, because I can't stop people from probing my
hardware for 96kHz capability.

>How-To-Repeat:
Compile oss-test.c and see if it can set 96000 correctly. If it runs without
problems, try the commented for/rc lines (these work for me, but setting i to
anyhting below 3400 or above 48600 will lock /dev/dsp and eat up 100% CPU.

>Fix:
-CURRENT doesn't have the problem. A friend of mine, running 4.7-STABLE SMP
with a SB PCI 512 doesn't have this problem too.

--- oss-test.c begins here ---
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/soundcard.h>
#include <err.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

int main()
{
	int fd, rc, i, bytesok = 0;
	audio_buf_info info;
	int frags;
	int rates[] = {96000, 48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
	void *p;

	fd = open("/dev/dsp", O_WRONLY | O_DIRECT);
	if (fd == -1)
		err(1, "can't open audio device");
	frags = 0x0020000B;	/* 64K buffer (32 * 2^11) */
	if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frags) == -1)
		err(1, "can't set fragments");
	if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) == -1)
		err(1, "can't get info about i/o space");
	rc = AFMT_S16_LE;
	if (ioctl(fd, SNDCTL_DSP_SAMPLESIZE, &rc) == -1)
		err(1, "can't set 16bit sample size");
	rc = 1;
	if (ioctl(fd, SNDCTL_DSP_STEREO, &rc) == -1)
		err(1, "can't set stereo mode");
	for (i=8; i > -1; i--) {
		rc = rates[i];
//	for (i=3500; i < 48600; i += 100) {
//		rc = i;
		printf("setting sampling rate to %d\n", rc);
		if (ioctl(fd, SNDCTL_DSP_SPEED, &rc) == -1)
			err(1, "can't set sample rate to %d", rc);
	} 

	printf("done\n");
	exit (0);
}
--- oss-test.c ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200303041802.h24I2SM1050281>