Commit 8d19b4e0 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: pcm: Use for_each_pcm_substream() macro

There are a few places doing the same loop iterating all PCM
substreams belonging to the PCM object.  Introduce a local helper
macro, for_each_pcm_substream(), to simplify the code.

Link: https://lore.kernel.org/r/20210206203656.15959-5-tiwai@suse.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 700cb707
Loading
Loading
Loading
Loading
+13 −16
Original line number Diff line number Diff line
@@ -1095,13 +1095,12 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
	mutex_lock(&pcm->open_mutex);
	wake_up(&pcm->open_wait);
	list_del_init(&pcm->list);
	for (cidx = 0; cidx < 2; cidx++) {
		for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) {

	for_each_pcm_substream(pcm, cidx, substream) {
		snd_pcm_stream_lock_irq(substream);
		if (substream->runtime) {
			if (snd_pcm_running(substream))
					snd_pcm_stop(substream,
						     SNDRV_PCM_STATE_DISCONNECTED);
				snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
			/* to be sure, set the state unconditionally */
			substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
			wake_up(&substream->runtime->sleep);
@@ -1109,10 +1108,8 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
		}
		snd_pcm_stream_unlock_irq(substream);
	}
	}

	for (cidx = 0; cidx < 2; cidx++)
		for (substream = pcm->streams[cidx].substream; substream; substream = substream->next)
	for_each_pcm_substream(pcm, cidx, substream)
		snd_pcm_sync_stop(substream, false);

	pcm_call_notify(pcm, n_disconnect);
+6 −0
Original line number Diff line number Diff line
@@ -72,4 +72,10 @@ struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,

#define PCM_RUNTIME_CHECK(sub) snd_BUG_ON(!(sub) || !(sub)->runtime)

/* loop over all PCM substreams */
#define for_each_pcm_substream(pcm, str, subs) \
	for ((str) = 0; (str) < 2; (str)++) \
		for ((subs) = (pcm)->streams[str].substream; (subs); \
		     (subs) = (subs)->next)

#endif	/* __SOUND_CORE_PCM_LOCAL_H */
+4 −8
Original line number Diff line number Diff line
@@ -111,8 +111,7 @@ void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm)
	struct snd_pcm_substream *substream;
	int stream;

	for (stream = 0; stream < 2; stream++)
		for (substream = pcm->streams[stream].substream; substream; substream = substream->next)
	for_each_pcm_substream(pcm, stream, substream)
		snd_pcm_lib_preallocate_free(substream);
}
EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all);
@@ -246,11 +245,8 @@ static void preallocate_pages_for_all(struct snd_pcm *pcm, int type,
	struct snd_pcm_substream *substream;
	int stream;

	for (stream = 0; stream < 2; stream++)
		for (substream = pcm->streams[stream].substream; substream;
		     substream = substream->next)
			preallocate_pages(substream, type, data, size, max,
					  managed);
	for_each_pcm_substream(pcm, stream, substream)
		preallocate_pages(substream, type, data, size, max, managed);
}

/**
+15 −20
Original line number Diff line number Diff line
@@ -1674,11 +1674,9 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm)
	if (! pcm)
		return 0;

	for (stream = 0; stream < 2; stream++) {
		for (substream = pcm->streams[stream].substream;
		     substream; substream = substream->next) {
	for_each_pcm_substream(pcm, stream, substream) {
		/* FIXME: the open/close code should lock this as well */
			if (substream->runtime == NULL)
		if (!substream->runtime)
			continue;

		/*
@@ -1692,11 +1690,8 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm)
		if (err < 0 && err != -EBUSY)
			return err;
	}
	}

	for (stream = 0; stream < 2; stream++)
		for (substream = pcm->streams[stream].substream;
		     substream; substream = substream->next)
	for_each_pcm_substream(pcm, stream, substream)
		snd_pcm_sync_stop(substream, false);

	return 0;