Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7373b70 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Takashi Iwai
Browse files

sound: pcm: record a substream's owner process



Record the pid of the task that opened a PCM substream. For sound
cards with hardware mixing, this allows determining which process
is associated with a specific substream's volume control.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 91d12c48
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -348,6 +348,8 @@ struct snd_pcm_group { /* keep linked substreams */
	int count;
	int count;
};
};


struct pid;

struct snd_pcm_substream {
struct snd_pcm_substream {
	struct snd_pcm *pcm;
	struct snd_pcm *pcm;
	struct snd_pcm_str *pstr;
	struct snd_pcm_str *pstr;
@@ -379,6 +381,7 @@ struct snd_pcm_substream {
	atomic_t mmap_count;
	atomic_t mmap_count;
	unsigned int f_flags;
	unsigned int f_flags;
	void (*pcm_release)(struct snd_pcm_substream *);
	void (*pcm_release)(struct snd_pcm_substream *);
	struct pid *pid;
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
	/* -- OSS things -- */
	/* -- OSS things -- */
	struct snd_pcm_oss_substream oss;
	struct snd_pcm_oss_substream oss;
+4 −0
Original line number Original line Diff line number Diff line
@@ -435,6 +435,7 @@ static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
		return;
		return;
	}
	}
	snd_iprintf(buffer, "state: %s\n", snd_pcm_state_name(status.state));
	snd_iprintf(buffer, "state: %s\n", snd_pcm_state_name(status.state));
	snd_iprintf(buffer, "owner_pid   : %d\n", pid_vnr(substream->pid));
	snd_iprintf(buffer, "trigger_time: %ld.%09ld\n",
	snd_iprintf(buffer, "trigger_time: %ld.%09ld\n",
		status.trigger_tstamp.tv_sec, status.trigger_tstamp.tv_nsec);
		status.trigger_tstamp.tv_sec, status.trigger_tstamp.tv_nsec);
	snd_iprintf(buffer, "tstamp      : %ld.%09ld\n",
	snd_iprintf(buffer, "tstamp      : %ld.%09ld\n",
@@ -900,6 +901,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
	substream->private_data = pcm->private_data;
	substream->private_data = pcm->private_data;
	substream->ref_count = 1;
	substream->ref_count = 1;
	substream->f_flags = file->f_flags;
	substream->f_flags = file->f_flags;
	substream->pid = get_pid(task_pid(current));
	pstr->substream_opened++;
	pstr->substream_opened++;
	*rsubstream = substream;
	*rsubstream = substream;
	return 0;
	return 0;
@@ -921,6 +923,8 @@ void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
	kfree(runtime->hw_constraints.rules);
	kfree(runtime->hw_constraints.rules);
	kfree(runtime);
	kfree(runtime);
	substream->runtime = NULL;
	substream->runtime = NULL;
	put_pid(substream->pid);
	substream->pid = NULL;
	substream->pstr->substream_opened--;
	substream->pstr->substream_opened--;
}
}