Subject: Complex Sound Card
To: None <tech-kern@netbsd.org>
From: Rene Hexel <rh@idle.trapdoor.vip.at>
List: tech-kern
Date: 08/09/1999 19:26:21
  I am currently considering writing a NetBSD audio driver for the Terratec
EWS 64XL audio card.  This card consists of several interconnected units that
are grouped around a DSP chip with 64 independent audio channels, 1 external
MIDI interface, a MIDI synthesizer, etc.  The other units consist of a couple
of mixers, a Windows Sound System compatible CoDec, an additional MIDI
interface, a MOD interface, and some digital I/O circuits.

  My biggest problem at the moment (apart from getting decent documentation
for that board) is that this card registers as several different PnP devices,
namely:

  wss0 at isapnp0 port 0x534/4,0x388/4,0x220/16 irq 5 drq 1,0
  wss0: AudioSystem EWS64 CoDec: CS4236/CS4236B
  audio0 at wss0: full duplex
  joy0 at isapnp0 port 0x201/1
  joy0: AudioSystem EWS64 Game Port
  joy0: joystick not connected
  isapnp0: <AudioSystem EWS64, CSCA810, , CTRL> port 0x538/8 not configured
  isapnp0: <AudioSystem EWS64, CSCA803, , MIDI-2> port 0x340/2 not configured
  isapnp0: <AudioSystem EWS64, CSC9407, , Synth> port 0x330/4 not configured
  isapnp0: <AudioSystem EWS64, CSCA805, , Digital CTRL> port 0x100/1 not configured

  Now, here are my questions:

  * what is the recommended way of supporting multiple audio channels?  The
    only possibility I currently see is

    audio1 at ...
    audio2 at ...
    audio3 at ...
    etc.

    With the current numbering scheme (minor device numbers) this limits the
    maximum number of possible channels to 16.  Is there any other (better)
    way of handling this?

  * The mixer device(s) are "above" the audio devices, i.e., they control
    the volume of all audio devices.  There are currently two ways of
    handling this:

    - add the mixer as another, fake, "audioN" device (yuck!), further
      reducing the number of available 'real' audio channels, or

    - let the mixer device seek out the existing audio devices and extend
      their /dev/mixer capabilities.  In this case, what is the recommended
      practice for one device to find another device on the same physical
      board?

  * What about card-specific features, like uploading the firmware (which,
    unfortunately, is proprietary), uploading MIDI sound sets, etc.?  Should
    they be handled through private ioctls, standard ioctls (which?), or an
    additional device like /dev/ews?

  Any recommendations to do TRT would be welcome ...

  Cheers
      ,
   Rene