Hi Takashi,
I am working on stopping alsa streams of audio USB gadget when USB host stops capture/playback/USB cable unplugged.
For capture I used code from AK4114 SPDIF receiver https://elixir.bootlin.com/linux/latest/source/sound/i2c/other/ak4114.c#L590:
static void stop_substream(struct uac_rtd_params *prm) { unsigned long _flags; struct snd_pcm_substream *substream;
substream = prm->ss; if (substream) { snd_pcm_stream_lock_irqsave(substream, _flags); if (snd_pcm_running(substream)) // TODO - correct handling for playback substream? snd_pcm_stop(substream, SNDRV_PCM_STATE_DRAINING); snd_pcm_stream_unlock_irqrestore(substream, _flags); } }
For setup I found calling snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP) (https://elixir.bootlin.com/linux/latest/source/drivers/staging/vc04_services...) Or for both capture and playback using SNDRV_PCM_STATE_DISCONNECTED (https://elixir.bootlin.com/linux/latest/source/sound/core/pcm.c#L1103).
Or perhaps using snd_pcm_dev_disconnect(dev) or snd_pcm_drop(substream)?
Please what is the recommended way?
Thanks a lot,
Pavel.