Dmix plugin does not update state when sound card is removed.

GitHub issues - opened github at alsa-project.org
Sun May 23 20:29:33 CEST 2021


alsa-project/alsa-lib issue #137 was opened from MHoyer12345678:

Playing sound using snd_pcm_writei in a dmix setup might result in an infinite loop when sound card is removed.

**Setup:**

- dmix setup
- pcm dmix device opened non blocking
- snd_pcm_writei used with poll (POLLERR is not evaluated)

**Trigger:**
- usb sound card is removed (e.g. by  "echo 0 > /sys/bus/usb/x-x/authorized")

**Observation:**
- snd_pcm_writei returns -EAGAIN on each call
- snd_pcm_state report state RUNNING

**Expected:**
- snd_pcm_writei returns -ENODEV (as happening in case a pure hw configuration is used without dmix plugin)
- snd_pcm_state report state DISCONNECTED (as happening in case a pure hw configuration is used without dmix plugin)

**Root Cause:**
- snd_pcm_writei calls snd_pcm_write_areas
- snd_pcm_write_areas requests state of dmix pcm device (state = __snd_pcm_state(pcm);)
- dmix implementation of snd_pcm_state requests state from slave hw device (state = snd_pcm_state(dmix->spcm);)
- hw implementation of snd_pcm_state executes an ioctl (query_status -> sync_ptr1)
- the ioctl call fails with -ENODEV (after the device has been  removed)
- pcm_hw returns -ENODEV as state
- dmix implementation of snd_pcm_state ends in default section of the switch block
- this leads to the unchanged dmix->state returned
- this way, the -ENODEV from the slave device is finally ignored in dmix plugin

**Potential Fix:**
- Add the following three lines to snd_pcm_hw_state in pcm_hw.c after query_status_data 

```
//disconnected HW is reported via a failed IOCTL return -ENODEV
if (err == -ENODEV)
	return SND_PCM_STATE_DISCONNECTED;
```
- The fix takes -ENODEV as trigger to return state DISCONNECTED

Hope this helps ...

Issue URL     : https://github.com/alsa-project/alsa-lib/issues/137
Repository URL: https://github.com/alsa-project/alsa-lib


More information about the Alsa-devel mailing list