Subject: kern/9087: audio mmap(2) interface not entirely clear
To: None <gnats-bugs@gnats.netbsd.org>
From: None <dave@dtsp.co.nz>
List: netbsd-bugs
Date: 12/30/1999 20:45:46
>Number:         9087
>Category:       kern
>Synopsis:       audio mmap(2) interface not entirely clear
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Dec 30 20:45:00 1999
>Last-Modified:
>Originator:     Dave Sainty
>Organization:
Dynamic Technology Services and Products Ltd (NZ)
>Release:        Recent current
>Environment:
System: NetBSD tequila.dave.dtsp.co.nz 1.4P NetBSD 1.4P (TEQUILA) #0: Thu Dec 30 01:04:54 NZDT 1999 dave@tequila.dave.dtsp.co.nz:/vol/tequila/userB/u2/NetBSD-current/src/sys/arch/i386/compile/TEQUILA i386


>Description:
	This problem appears in the eso (ESS Solo-1) driver, but I think may
	be in others also.

	The problem is: What size is the buffered mmap()'d area?

	According to audio(4), this area should be the full buffer size.  But
	this does not appear to be enforced, and indeed it appears that
	sys/dev/audio.c will intruct the driver to start playing with a
	possibly smaller buffer at open time.

	In the eso driver this is particularly apparent because the output
	buffer size is 65535 bytes, generally not divisible by the fragment
	size.  The mmap()'ed area is actually the buffer size rounded down to
	the last fragment boundary.  But I think the problem may be triggered
	in other drivers by using appropriate fragment sizes.

	"eap" and "sv" have apparently cut-and-pasted code for mappage().
	Even isa/sbdsp.c looks like its mappage() is too simplistic.

>How-To-Repeat:
	Play quake2 with an ESS Solo-1 card :)

	Any application that follows audio(4) and assumes the buffer size will
	be the buffer_size may lose (unless the set the fragment
	appropriately, but what if the buffer size is prime!? :)

>Fix:
	Well, it needs to be confirmed exactly what the interface should
	be...

	The problem can be fixed in each driver, or possibly fixed in audio.c
	by reissuing a trigger_output() at mmap() time if required.  The
	latter may be simpler, but may have unfortunate side effects in that
	the trigger_output() interface includes a block size that may not
	divide the buffer size evenly (which may surprise some drivers).

	If mappage() is to be fixed, it should be documented in audio(9).
	Probably it should be fleshed out in audio(9) anyway, so it's clear.
>Audit-Trail:
>Unformatted: