Hi,

On Debian GNU/Hurd 0.9 (hurd 1:0.9.git20230520-7, gnumach
1.8+git20230410-1), there is no native audio surface.  /hurd/ ships
74 translator binaries and none match audio|snd|dsp|sound|mixer|oss|alsa;
/dev/ has no audio nodes; /servers/ enumerates 13 entries and none
are audio; gnumach boot enumerates no audio hardware in dmesg.

User impact: no application that opens an audio device works on
Hurd, everything from aplay through pulseaudio's real-hardware sinks.
The pragmatic workaround is apt install pulseaudio, which installs
cleanly on hurd-amd64 from debian-ports sid/main and exercises null
sinks / module-pipe-source paths, but cannot reach hardware because
nothing under it does.

This RFC asks for design feedback on three remediation levels
before any patch attempt.

Level (a): apt-installed pulseaudio path

  Shipped today, lives in userland.  Userland code that drives pactl
  works unchanged once the user has pulseaudio running.  No upstream
  change needed.  A future Debian apt-image flavor that bundles
  pulseaudio would make this zero-config.

Level (b): native /hurd/audio translator

  v2.x scope.  A new /hurd/audio translator binary structurally
  parallel to /hurd/pfinet and /hurd/streamio, attached to /dev/dsp
  (and friends) via settrans.  Client opens the device node and
  reads/writes PCM with ioctls for format / rate / channel selection.
  OSS API (SNDCTL_DSP_*) is the lowest-common-denominator target;
  it is well-documented and matches the file-IO + ioctl shape the
  Hurd device interface already serves for other translators.

  The hard part is the driver layer.  gnumach has no AC97 / HDA /
  SB16 driver enumeration today.  Options:
    - Port a NetBSD audio driver via the rumpkernel path
      (rumpdisk / rumpnet are the precedent on hurd-amd64; a
      rumpaudio translator would be a natural sibling).
    - Write a native gnumach driver against the QEMU intel-hda
      or ac97 device first to get a known-good target before any
      real-hardware bring-up.

  Userland comparison points: libpulse, libcanberra, sndio.  sndio
  in particular is small enough to inform the IPC shape.

  Integration: settrans /dev/dsp /hurd/audio at boot, exposed
  through /servers/socket/audio (or similar) for daemon-style
  clients.

  Estimation: large.  Full new-translator work plus a new gnumach
  driver subsystem.  Multi-month even with the rumpkernel shortcut.

Level (c): Mach-RPC sound server

  v2.x+ scope.  Parallel to pulseaudio's daemon model: a Hurd-native
  sound server holds the device, clients talk to it over Mach RPC
  for volume / sink switching / per-app routing.  Builds on top of
  level (b)'s translator.  I would not recommend starting at (c);
  level (b) is the prerequisite and pulseaudio (level a) already
  covers the multi-client / per-app-volume use case once installed.

Reproduction (canonical Debian GNU/Hurd 0.9):

  1. Boot the canonical image.
  2. ls /hurd/ | grep -iE 'audio|snd|dsp|sound|mixer|oss|alsa'
     -> prints nothing.
  3. ls /dev/dsp /dev/audio /dev/mixer /dev/snd /dev/sound
     -> ENOENT on every path.
  4. ls /servers/  -> 13 names, none audio.
  5. dmesg | grep -iE 'audio|snd|sound|dsp|oss|alsa'
     -> no matches.
  6. dpkg -L hurd | grep -iE 'audio|snd|sound|dsp|oss|alsa'
     -> no matches.
  7. For the pulseaudio workaround:
     apt install pulseaudio && pulseaudio --start
       && pactl list short sinks
     -> succeeds with a null sink; no hardware reachable.

Looking for design feedback on rumpaudio-vs-native, OSS-vs-ALSA-style
API, and settrans path under /dev/ vs /servers/ before any
implementation work.

I'm also filing in parallel the debian-hurd packaging side of the
same gap (bundle pulseaudio in the live-image task) on
[email protected].

Alternative filing channel: https://savannah.gnu.org/bugs/?group=hurd

Thanks,
Borja Tarraso
[email protected]

Reply via email to