/* close callback */ static int snd_bcm2835_playback_close(struct snd_pcm_substream *substream) { /* the hardware-specific codes will be here */ struct bcm2835_chip *chip; struct snd_pcm_runtime *runtime; struct bcm2835_alsa_stream *alsa_stream; audio_info(" .. IN\n"); chip = snd_pcm_substream_chip(substream); if (mutex_lock_interruptible(&chip->audio_mutex)) { audio_error("Interrupted whilst waiting for lock\n"); return -EINTR; } runtime = substream->runtime; alsa_stream = runtime->private_data; audio_info("Alsa close\n"); /* * Call stop if it's still running. This happens when app * is force killed and we don't get a stop trigger. */ if (alsa_stream->running) { int err; err = bcm2835_audio_stop(alsa_stream); alsa_stream->running = 0; if (err) audio_error(" Failed to STOP alsa device\n"); } alsa_stream->period_size = 0; alsa_stream->buffer_size = 0; if (alsa_stream->open) { alsa_stream->open = 0; bcm2835_audio_close(alsa_stream); } if (alsa_stream->chip) alsa_stream->chip->alsa_stream[alsa_stream->idx] = NULL; /* * Do not free up alsa_stream here, it will be freed up by * runtime->private_free callback we registered in *_open above */ chip->opened &= ~(1 << substream->number); mutex_unlock(&chip->audio_mutex); audio_info(" .. OUT\n"); return 0; }
/* close callback */ static int snd_bcm2835_playback_close(struct snd_pcm_substream *substream) { /* the hardware-specific codes will be here */ struct snd_pcm_runtime *runtime = substream->runtime; bcm2835_alsa_stream_t *alsa_stream = runtime->private_data; audio_info(" .. IN\n"); audio_warning("Alsa close\n"); /* * Call stop if it's still running. This happens when app * is force killed and we don't get a stop trigger. */ if (alsa_stream->running) { int err; err = bcm2835_audio_stop(alsa_stream); alsa_stream->running = 0; if (err != 0) audio_error(" Failed to STOP alsa device\n"); } alsa_stream->period_size = 0; alsa_stream->buffer_size = 0; if (alsa_stream->open) { alsa_stream->open = 0; bcm2835_audio_close(alsa_stream); } if (alsa_stream->chip) alsa_stream->chip->alsa_stream[alsa_stream->idx] = NULL; /* * Do not free up alsa_stream here, it will be freed up by * runtime->private_free callback we registered in *_open above */ audio_info(" .. OUT\n"); return 0; }