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 - JACK plugin 2/4] jack: Use internal snd_pcm_state to reduce amount of additional variables
Date: Thu, 1 Mar 2018 14:14:06 +0100 [thread overview]
Message-ID: <1519910048-19732-3-git-send-email-twischer@de.adit-jv.com> (raw)
In-Reply-To: <1519910048-19732-1-git-send-email-twischer@de.adit-jv.com>
From: Timo Wischer <twischer@de.adit-jv.com>
This variable will be used to exchange the status of the stream between
the ALSA and JACK thread.
In future commits it will also be used
to signal DRAINING state from the ALSA to JACK thread and
to signal XRUN state form the JACK to ALSA thread
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
diff --git a/jack/pcm_jack.c b/jack/pcm_jack.c
index c3ed9fb..0dff0d2 100644
--- a/jack/pcm_jack.c
+++ b/jack/pcm_jack.c
@@ -36,7 +36,11 @@ typedef struct {
snd_pcm_ioplug_t io;
int fd;
- int activated; /* jack is activated? */
+
+ /* This variable is not always in sync with io->state
+ * because it will be accessed by multiple threads.
+ */
+ snd_pcm_state_t state;
char **port_names;
unsigned int num_ports;
@@ -122,8 +126,8 @@ static int pcm_poll_block_check(snd_pcm_ioplug_t *io)
snd_pcm_sframes_t avail;
snd_pcm_jack_t *jack = io->private_data;
- if (io->state == SND_PCM_STATE_RUNNING ||
- (io->state == SND_PCM_STATE_PREPARED && io->stream == SND_PCM_STREAM_CAPTURE)) {
+ if (jack->state == SND_PCM_STATE_RUNNING ||
+ (jack->state == SND_PCM_STATE_PREPARED && io->stream == SND_PCM_STREAM_CAPTURE)) {
avail = snd_pcm_avail_update(io->pcm);
if (avail >= 0 && avail < jack->min_avail) {
while (read(io->poll_fd, &buf, sizeof(buf)) == sizeof(buf))
@@ -217,7 +221,7 @@ snd_pcm_jack_process_cb(jack_nframes_t nframes, snd_pcm_ioplug_t *io)
}
hw_ptr = jack->hw_ptr;
- if (io->state == SND_PCM_STATE_RUNNING) {
+ if (jack->state == SND_PCM_STATE_RUNNING) {
const snd_pcm_channel_area_t *areas = snd_pcm_ioplug_mmap_areas(io);
while (xfer < nframes) {
@@ -297,29 +301,31 @@ static int snd_pcm_jack_prepare(snd_pcm_ioplug_t *io)
else
pcm_poll_block_check(io); /* block capture pcm if that's XRUN recovery */
- if (jack->ports)
- return 0;
+ if (!jack->ports) {
+ jack->ports = calloc(io->channels, sizeof(jack_port_t*));
- jack->ports = calloc(io->channels, sizeof(jack_port_t*));
-
- for (i = 0; i < io->channels; i++) {
- char port_name[32];
- if (io->stream == SND_PCM_STREAM_PLAYBACK) {
+ for (i = 0; i < io->channels; i++) {
+ char port_name[32];
+ if (io->stream == SND_PCM_STREAM_PLAYBACK) {
- sprintf(port_name, "out_%03d", i);
- jack->ports[i] = jack_port_register(jack->client, port_name,
- JACK_DEFAULT_AUDIO_TYPE,
- JackPortIsOutput, 0);
- } else {
- sprintf(port_name, "in_%03d", i);
- jack->ports[i] = jack_port_register(jack->client, port_name,
- JACK_DEFAULT_AUDIO_TYPE,
- JackPortIsInput, 0);
+ sprintf(port_name, "out_%03d", i);
+ jack->ports[i] = jack_port_register(jack->client, port_name,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsOutput, 0);
+ } else {
+ sprintf(port_name, "in_%03d", i);
+ jack->ports[i] = jack_port_register(jack->client, port_name,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsInput, 0);
+ }
}
+
+ jack_set_process_callback(jack->client,
+ (JackProcessCallback)snd_pcm_jack_process_cb, io);
}
- jack_set_process_callback(jack->client,
- (JackProcessCallback)snd_pcm_jack_process_cb, io);
+ jack->state = SND_PCM_STATE_PREPARED;
+
return 0;
}
@@ -327,12 +333,11 @@ static int snd_pcm_jack_start(snd_pcm_ioplug_t *io)
{
snd_pcm_jack_t *jack = io->private_data;
unsigned int i;
+ int err = 0;
if (jack_activate (jack->client))
return -EIO;
- jack->activated = 1;
-
for (i = 0; i < io->channels && i < jack->num_ports; i++) {
if (jack->port_names[i]) {
const char *src, *dst;
@@ -345,21 +350,27 @@ static int snd_pcm_jack_start(snd_pcm_ioplug_t *io)
}
if (jack_connect(jack->client, src, dst)) {
fprintf(stderr, "cannot connect %s to %s\n", src, dst);
- return -EIO;
+ err = -EIO;
+ break;
}
}
}
+
+ /* do not start forwarding audio samples before the ports are connected */
+ jack->state = SND_PCM_STATE_RUNNING;
- return 0;
+ return err;
}
static int snd_pcm_jack_stop(snd_pcm_ioplug_t *io)
{
snd_pcm_jack_t *jack = io->private_data;
-
- if (jack->activated) {
+ const snd_pcm_state_t state = jack->state;
+
+ if (state == SND_PCM_STATE_RUNNING ||
+ state == SND_PCM_STATE_DRAINING ||
+ state == SND_PCM_STATE_XRUN) {
jack_deactivate(jack->client);
- jack->activated = 0;
}
#if 0
unsigned i;
@@ -370,6 +381,9 @@ static int snd_pcm_jack_stop(snd_pcm_ioplug_t *io)
}
}
#endif
+
+ jack->state = SND_PCM_STATE_SETUP;
+
return 0;
}
@@ -481,6 +495,7 @@ static int snd_pcm_jack_open(snd_pcm_t **pcmp, const char *name,
jack->fd = -1;
jack->io.poll_fd = -1;
+ jack->state = SND_PCM_STATE_OPEN;
err = parse_ports(jack, stream == SND_PCM_STREAM_PLAYBACK ?
playback_conf : capture_conf);
--
2.7.4
next prev parent reply other threads:[~2018-03-01 13:14 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 ` [PATCH - PCM 2/3] pcm: ioplug: Provide hw_avail helper function for plugins twischer
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 ` twischer [this message]
2018-03-01 15:26 ` [PATCH - JACK plugin 2/4] jack: Use internal snd_pcm_state to reduce amount of additional variables 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=1519910048-19732-3-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).