Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Jul 2004 18:50:41 -0700
From:      4Front Technologies <dev@opensound.com>
To:        freebsd-hackers@FreeBSD.ORG
Subject:   FreeBSD open() questions
Message-ID:  <40F1EE71.6000704@opensound.com>

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

We are trying to implement multi-open() in our OSS drivers for FreeBSD. The idea 
is that all apps keep opening /dev/dsp and internally OSS finds the next 
available device (/dev/dspNN+1) and returns that device's minor number back to 
the open routine. What happens is that every read/write/close/ioctl call now
uses the new minor number.

This works in Solaris and Linux.

In Solaris the open routine has an extra parameter that permits giving a new 
device number that will be used in subsequent read/write/etc calls. Changing 
this field doesn't affect the way how open works.

In Linux struct file has a private field that the driver can use as it likes. We 
simply store the major/minor number in this field. In the read/write/ioctl/etc 
routines we read the device number from this field instead of using inode->dev.

BSD doesn't have such mechanisms. The dev_t parameter is a "global" one and the 
same structure is shared by all applications having the same device file opened. 
If you change anything in this structure then it will affect the other 
applications that had opened the same file. Every time one application tries to 
open /dev/dsp the changes will affect also the applications that are already 
running (they will jump to use the new device).

I've taken a look at dev_clone and EVENT_HANDLER stuff in FreeBSD's pcm drivers 
but essentially this works by creating a new device and adding it via 
devfs_create if you access /dev/dsp. But in our case we have already added all 
the devices so using dev_clone doesn't work (or atleast I've not been able to 
get it to do what we want)

We already have all the devices configured during our Module Load. So all we 
really want to do is if you open /dev/dsp, OSS's device manager will look for a 
free device and return that device's minor number and from now on all 
read/write/ioctl/close routines will use that device number.

Does anybody have any suggestions on how to get such features working in both 
FreeBSD 4x and 5x? Should we be looking at /dev/tty (because you can keep 
opening /dev/tty and it kind of behaves the same way OSS's open works in Solaris 
or Linux.

BTW, we also want to work with the BSD audio guys to implement the upcoming OSS 
V4.0 mixer extensions that will allow you to add mixer extensions to devices 
that aren't your standard AC97 or ISA devices. So if anyone wants to extend 
FreeBSD's OSS api, by all means contact us and we'll work with you to implement 
this.


best regards
Dev Mazumdar

PS: Please respond directly to me as I'm not subscribed to the freebsd-hackers 
list.
-----------------------------------------------------------
4Front Technologies
4035 Lafayette Place, Unit F, Culver City, CA 90232, USA.
Tel: (310) 202 8530		URL: www.opensound.com
Fax: (310) 202 0496 		Email: info@opensound.com
-----------------------------------------------------------



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