alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: <twischer@de.adit-jv.com>
To: tiwai@suse.de
Cc: Timo Wischer <twischer@de.adit-jv.com>, alsa-devel@alsa-project.org
Subject: [PATCH - PCM 2/3] pcm: ioplug: Provide hw_avail helper function for plugins
Date: Fri, 2 Mar 2018 17:21:12 +0100	[thread overview]
Message-ID: <1520007674-14618-2-git-send-email-twischer@de.adit-jv.com> (raw)
In-Reply-To: <1520007674-14618-1-git-send-email-twischer@de.adit-jv.com>

From: Timo Wischer <twischer@de.adit-jv.com>

This function can be called without calling snd_pcm_avail_update().

The call to snd_pcm_avail_update() can take some time.
Therefore some developers would not like to call it from a real-time
context (e.g. from JACK client context).

Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>

diff --git a/include/pcm_ioplug.h b/include/pcm_ioplug.h
index e75f973..778d9c6 100644
--- a/include/pcm_ioplug.h
+++ b/include/pcm_ioplug.h
@@ -234,6 +234,9 @@ int snd_pcm_ioplug_set_param_list(snd_pcm_ioplug_t *io, int type, unsigned int n
 /* change PCM status */
 int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state);
 
+/* calucalte the available frames */
+snd_pcm_uframes_t snd_pcm_ioplug_hw_avail(const snd_pcm_ioplug_t* const ioplug, const snd_pcm_uframes_t hw_ptr, const snd_pcm_uframes_t appl_ptr);
+
 /** \} */
 
 #endif /* __ALSA_PCM_IOPLUG_H */
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index 9970646..a0cb778 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -1148,3 +1148,27 @@ int snd_pcm_ioplug_set_state(snd_pcm_ioplug_t *ioplug, snd_pcm_state_t state)
 	ioplug->state = state;
 	return 0;
 }
+
+/**
+ * \brief Get the available frames. This function can be used to calculate the
+ * the available frames before calling #snd_pcm_avail_update()
+ * \param ioplug the ioplug handle
+ * \param hw_ptr hardware pointer in frames
+ * \param appl_ptr application pointer in frames
+ * \return available frames for the hardware
+ */
+snd_pcm_uframes_t snd_pcm_ioplug_hw_avail(const snd_pcm_ioplug_t* const ioplug,
+                                          const snd_pcm_uframes_t hw_ptr,
+                                          const snd_pcm_uframes_t appl_ptr)
+{
+	/* available data/space which can be transfered by the user application */
+	const snd_pcm_uframes_t user_avail = __snd_pcm_avail(ioplug->pcm, hw_ptr,
+	                                                     appl_ptr);
+
+	if (user_avail > ioplug->pcm->buffer_size) {
+		/* there was an Xrun */
+		return 0;
+	}
+	/* available data/space which can be transfered by the DMA */
+	return ioplug->pcm->buffer_size - user_avail;
+}
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
index 3d95e17..b695b92 100644
--- a/src/pcm/pcm_local.h
+++ b/src/pcm/pcm_local.h
@@ -467,10 +467,12 @@ static inline int snd_pcm_check_error(snd_pcm_t *pcm, int err)
 	return err;
 }
 
-static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
+static inline snd_pcm_uframes_t __snd_pcm_playback_avail(snd_pcm_t *pcm,
+                                                       const snd_pcm_uframes_t hw_ptr,
+                                                       const snd_pcm_uframes_t appl_ptr)
 {
 	snd_pcm_sframes_t avail;
-	avail = *pcm->hw.ptr + pcm->buffer_size - *pcm->appl.ptr;
+	avail = hw_ptr + pcm->buffer_size - appl_ptr;
 	if (avail < 0)
 		avail += pcm->boundary;
 	else if ((snd_pcm_uframes_t) avail >= pcm->boundary)
@@ -478,21 +480,40 @@ static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
 	return avail;
 }
 
-static inline snd_pcm_uframes_t snd_pcm_mmap_capture_avail(snd_pcm_t *pcm)
+static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
+{
+	return __snd_pcm_playback_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr);
+}
+
+static inline snd_pcm_uframes_t __snd_pcm_capture_avail(snd_pcm_t *pcm,
+                                                      const snd_pcm_uframes_t hw_ptr,
+                                                      const snd_pcm_uframes_t appl_ptr)
 {
 	snd_pcm_sframes_t avail;
-	avail = *pcm->hw.ptr - *pcm->appl.ptr;
+	avail = hw_ptr - appl_ptr;
 	if (avail < 0)
 		avail += pcm->boundary;
 	return avail;
 }
 
-static inline snd_pcm_uframes_t snd_pcm_mmap_avail(snd_pcm_t *pcm)
+static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
+{
+	return __snd_pcm_capture_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr);
+}
+
+static inline snd_pcm_uframes_t __snd_pcm_avail(snd_pcm_t *pcm,
+                                                const snd_pcm_uframes_t hw_ptr,
+                                                const snd_pcm_uframes_t appl_ptr)
 {
 	if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
-		return snd_pcm_mmap_playback_avail(pcm);
+		return snd_pcm_playback_avail(pcm, hw_ptr, appl_ptr);
 	else
-		return snd_pcm_mmap_capture_avail(pcm);
+		return snd_pcm_capture_avail(pcm, hw_ptr, appl_ptr);
+}
+
+static inline snd_pcm_uframes_t snd_pcm_mmap_avail(snd_pcm_t *pcm)
+{
+	return __snd_pcm_avail(pcm, *pcm->hw.ptr, *pcm->appl.ptr);
 }
 
 static inline snd_pcm_sframes_t snd_pcm_mmap_playback_hw_avail(snd_pcm_t *pcm)
-- 
2.7.4

  reply	other threads:[~2018-03-02 16:21 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-24 11:53 [PATCH - JACK PCM plugin] jack: Do not Xrun the ALSA buffer twischer
2018-02-26  8:14 ` Wischer, Timo (ADITG/ESB)
2018-02-27  8:48   ` Takashi Iwai
2018-03-01 13:14     ` [PATCH - JACK PCM plugin] Xrun handling twischer
2018-03-01 13:14       ` [PATCH - JACK plugin 1/4] jack: Do not Xrun the ALSA buffer twischer
2018-03-01 15:24         ` Takashi Iwai
2018-03-02 16:21           ` twischer
2018-03-02 16:21             ` twischer [this message]
2018-03-02 16:21             ` [PATCH - PCM 3/3] pcm: Provide areas_copy function which handles buffer wrap around twischer
2018-03-02 16:21             ` [PATCH - JACK 1/1] jack: Do not Xrun the ALSA buffer twischer
2018-03-13  8:34               ` [PATCH - JACK plugin] " twischer
2018-03-13  8:34                 ` [PATCH - PCM 1/2] pcm: ioplug: Provide hw_avail helper function for plugins twischer
2018-03-13  8:34                 ` [PATCH - PCM 2/2] pcm: Provide areas_copy function which handles buffer wrap around twischer
2018-03-13  8:34                 ` [PATCH - JACK 1/1] jack: Do not Xrun the ALSA buffer twischer
2018-03-13 21:20                 ` [PATCH - JACK plugin] " Takashi Iwai
2018-03-15 15:09                   ` Wischer, Timo (ADITG/ESB)
2018-03-15 15:13                     ` Takashi Iwai
2018-03-01 13:14       ` [PATCH - JACK plugin 2/4] jack: Use internal snd_pcm_state to reduce amount of additional variables twischer
2018-03-01 15:26         ` Takashi Iwai
2018-03-15 12:56           ` [PATCH - JACK plugin] " twischer
2018-03-15 12:56             ` [PATCH - JACK 1/1] " twischer
2018-03-15 13:14               ` Takashi Iwai
2018-03-15 14:05                 ` Wischer, Timo (ADITG/ESB)
2018-03-15 14:20                   ` Takashi Iwai
2018-03-15 15:07                     ` Wischer, Timo (ADITG/ESB)
2018-03-15 15:49                       ` Takashi Iwai
2018-03-16 10:02                         ` [PATCH - IOPLUG] Update prepare and draining state correctly twischer
2018-03-16 10:02                           ` [PATCH - IOPLUG 1/1] pcm: ioplug: update Prepare " twischer
2018-03-16 10:08                             ` Takashi Iwai
2018-03-16 10:20                               ` [PATCH - IOPLUG 1/1] pcm: ioplug: update prepare " twischer
2018-03-16 10:30                                 ` Takashi Iwai
2018-03-01 13:14       ` [PATCH - JACK plugin 3/4] jack: Report Xruns to user application twischer
2018-03-16 14:23         ` twischer
2018-03-16 14:23           ` [PATCH - JACK 1/1] " twischer
2018-03-16 14:41             ` Takashi Iwai
2018-03-16 14:47               ` Wischer, Timo (ADITG/ESB)
2018-03-16 14:57                 ` Takashi Iwai
2018-03-01 13:14       ` [PATCH - JACK plugin 4/4] jack: Support snd_pcm_drain() twischer
2018-03-01 13:41         ` Jaroslav Kysela
2018-03-16 14:44           ` Wischer, Timo (ADITG/ESB)
2018-03-16 15:11             ` Jaroslav Kysela
2018-03-16 15:52               ` Wischer, Timo (ADITG/ESB)
2018-03-21 16:22                 ` Wischer, Timo (ADITG/ESB)
2018-03-21 16:34                   ` Takashi Iwai
2018-03-21 16:47                     ` Wischer, Timo (ADITG/ESB)
2018-03-21 16:52                       ` Takashi Iwai
2018-03-21 17:02                         ` Wischer, Timo (ADITG/ESB)
2018-03-21 17:07                           ` Takashi Iwai
2018-03-01 15:19       ` [PATCH - JACK PCM plugin] Xrun handling Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1520007674-14618-2-git-send-email-twischer@de.adit-jv.com \
    --to=twischer@de.adit-jv.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).