ALSA: pcm: Add xrun counter for snd_pcm_substream
This patch adds an xrun counter to snd_pcm_substream as an alternative to using logs from XRUN_DEBUG_BASIC. The counter provides a way to track the number of xrun occurences, accessible through the /proc interface. The counter is enabled when CONFIG_SND_PCM_XRUN_DEBUG is set. Example output: $ cat /proc/asound/card0/pcm9p/sub0/status owner_pid : 1425 trigger_time: 235.248957291 tstamp : 0.000000000 delay : 1912 avail : 480 avail_max : 1920 ----- hw_ptr : 672000 appl_ptr : 673440 xrun_counter: 3 # (new row) Signed-off-by: Norman Bintang <normanbt@chromium.org> Reviewed-by: Chih-Yang Hsia <paulhsia@chromium.org> Tested-by: Chih-Yang Hsia <paulhsia@chromium.org> Reviewed-by: David Riley <davidriley@chromium.org> Link: https://patch.msgid.link/20240809140648.3414349-1-normanbt@chromium.org Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
e9606148a6
commit
72c0f57dbe
@ -498,6 +498,9 @@ struct snd_pcm_substream {
|
|||||||
/* misc flags */
|
/* misc flags */
|
||||||
unsigned int hw_opened: 1;
|
unsigned int hw_opened: 1;
|
||||||
unsigned int managed_buffer_alloc:1;
|
unsigned int managed_buffer_alloc:1;
|
||||||
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
|
unsigned int xrun_counter; /* number of times xrun happens */
|
||||||
|
#endif /* CONFIG_SND_PCM_XRUN_DEBUG */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
|
#define SUBSTREAM_BUSY(substream) ((substream)->ref_count > 0)
|
||||||
|
@ -462,6 +462,9 @@ static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
|
|||||||
snd_iprintf(buffer, "-----\n");
|
snd_iprintf(buffer, "-----\n");
|
||||||
snd_iprintf(buffer, "hw_ptr : %ld\n", runtime->status->hw_ptr);
|
snd_iprintf(buffer, "hw_ptr : %ld\n", runtime->status->hw_ptr);
|
||||||
snd_iprintf(buffer, "appl_ptr : %ld\n", runtime->control->appl_ptr);
|
snd_iprintf(buffer, "appl_ptr : %ld\n", runtime->control->appl_ptr);
|
||||||
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
|
snd_iprintf(buffer, "xrun_counter: %d\n", substream->xrun_counter);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
@ -970,6 +973,9 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
|
|||||||
substream->pid = get_pid(task_pid(current));
|
substream->pid = get_pid(task_pid(current));
|
||||||
pstr->substream_opened++;
|
pstr->substream_opened++;
|
||||||
*rsubstream = substream;
|
*rsubstream = substream;
|
||||||
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
|
substream->xrun_counter = 0;
|
||||||
|
#endif /* CONFIG_SND_PCM_XRUN_DEBUG */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,6 +184,9 @@ void __snd_pcm_xrun(struct snd_pcm_substream *substream)
|
|||||||
pcm_warn(substream->pcm, "XRUN: %s\n", name);
|
pcm_warn(substream->pcm, "XRUN: %s\n", name);
|
||||||
dump_stack_on_xrun(substream);
|
dump_stack_on_xrun(substream);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
|
substream->xrun_counter++;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
#ifdef CONFIG_SND_PCM_XRUN_DEBUG
|
||||||
|
Loading…
Reference in New Issue
Block a user