From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
To: clemens@ladisch.de, tiwai@suse.de
Cc: alsa-devel@alsa-project.org, ffado-devel@lists.sf.net
Subject: Re: [PATCH 06/25] ALSA: firewire-lib: add throttle for MIDI data rate
Date: Fri, 14 Aug 2015 06:34:46 +0900 [thread overview]
Message-ID: <55CD0D76.9040107@sakamocchi.jp> (raw)
In-Reply-To: <1439425221-30826-7-git-send-email-o-takashi@sakamocchi.jp>
On Aug 13 2015 09:20, Takashi Sakamoto wrote:
> Typically, the target devices have internal buffer to adjust output of
> received MIDI messages for MIDI serial bus, while the capacity of the
> buffer is limited. IEEE 1394 transactions can transfer more MIDI messages
> than MIDI serial bus can. This can cause buffer over flow in device side.
>
> This commit adds throttle to limit MIDI data rate by counting intervals
> by jiffies between two MIDI messages. Usual MIDI messages consists of two
> or three bytes. This requires 1.302 to 1.953 mili-seconds interval between
> these messages. Using jiffies for this purpose is not perfect idea.
> Further work is needed for better implementation.
>
> Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
> ---
> sound/firewire/lib.c | 18 +++++++++++++++++-
> sound/firewire/lib.h | 1 +
> 2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/sound/firewire/lib.c b/sound/firewire/lib.c
> index e309b9b..452728c 100644
> --- a/sound/firewire/lib.c
> +++ b/sound/firewire/lib.c
> @@ -76,6 +76,9 @@ static void async_midi_port_callback(struct fw_card *card, int rcode,
>
> if (rcode == RCODE_COMPLETE && substream != NULL)
> snd_rawmidi_transmit_ack(substream, port->consume_bytes);
> + else if (!rcode_is_permanent_error(rcode))
> + /* To start next transaction immediately for recovery. */
> + port->next_tick = 0;
>
> port->idling = true;
>
> @@ -99,6 +102,12 @@ static void midi_port_tasklet(unsigned long data)
> if (substream == NULL || snd_rawmidi_transmit_empty(substream))
> return;
>
> + /* Do it in next chance. */
> + if (time_is_after_jiffies(port->next_tick)) {
> + tasklet_schedule(&port->tasklet);
> + return;
> + }
> +
> /*
> * Fill the buffer. The callee must use snd_rawmidi_transmit_peek().
> * Later, snd_rawmidi_transmit_ack() may be called.
> @@ -107,8 +116,10 @@ static void midi_port_tasklet(unsigned long data)
> port->consume_bytes = port->packetize(substream, port->buf);
> if (port->consume_bytes <= 0) {
> /* Do it in next chance, immediately. */
> - if (port->consume_bytes == 0)
> + if (port->consume_bytes == 0) {
> + port->next_tick = 0;
> tasklet_schedule(&port->tasklet);
> + }
> return;
> }
>
> @@ -118,6 +129,10 @@ static void midi_port_tasklet(unsigned long data)
> else
> type = TCODE_WRITE_BLOCK_REQUEST;
>
> + /* Set interval to next transaction. */
> + port->next_tick =
> + jiffies_64 + msecs_to_jiffies(port->consume_bytes * 8 / 31250);
> +
I realize that the given argument should be multiplexed by 1000 to
represent mili-seconds.
> /* Start this transaction. */
> port->idling = false;
> generation = port->parent->generation;
> @@ -153,6 +168,7 @@ int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
> port->addr = addr;
> port->packetize = packetize;
> port->idling = true;
> + port->next_tick = 0;
>
> tasklet_init(&port->tasklet, midi_port_tasklet, (unsigned long)port);
>
> diff --git a/sound/firewire/lib.h b/sound/firewire/lib.h
> index 9d76f5c..e4b00e2 100644
> --- a/sound/firewire/lib.h
> +++ b/sound/firewire/lib.h
> @@ -26,6 +26,7 @@ struct snd_fw_async_midi_port {
> struct fw_device *parent;
> struct tasklet_struct tasklet;
> bool idling;
> + unsigned long next_tick;
>
> __u64 addr;
> struct fw_transaction transaction;
>
next prev parent reply other threads:[~2015-08-13 21:34 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-13 0:19 [PATCH 00/25] ALSA: support AMDTP variants Takashi Sakamoto
2015-08-13 0:19 ` [PATCH 01/25] ALSA: firewire-lib: rename 'amdtp' to 'amdtp-stream' for functional separation Takashi Sakamoto
2015-08-13 0:19 ` [PATCH 02/25] ALSA: firewire-lib: functional separation for packet transmission layer and data processing layer Takashi Sakamoto
2015-08-13 0:19 ` [PATCH 03/25] ALSA: firewire-lib: add helper functions for asynchronous MIDI port Takashi Sakamoto
2015-08-13 6:31 ` Takashi Iwai
2015-08-13 7:57 ` Takashi Sakamoto
2015-08-15 10:15 ` Stefan Richter
2015-08-15 10:19 ` Stefan Richter
2015-08-16 6:47 ` Takashi Iwai
2015-08-16 12:15 ` Stefan Richter
2015-08-17 14:01 ` Takashi Iwai
2015-08-13 0:20 ` [PATCH 04/25] ALSA: firewire-lib: add a restriction for a transaction at once Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 05/25] ALSA: firewire-lib: schedule tasklet again when MIDI substream has rest of MIDI messages Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 06/25] ALSA: firewire-lib: add throttle for MIDI data rate Takashi Sakamoto
2015-08-13 21:34 ` Takashi Sakamoto [this message]
2015-08-13 0:20 ` [PATCH 07/25] ALSA: firewire-lib: avoid endless loop to transfer MIDI messages at fatal error Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 08/25] ALSA: firewire-digi00x: add skeleton for Digi 002/003 family Takashi Sakamoto
2015-08-13 6:33 ` Takashi Iwai
2015-08-13 0:20 ` [PATCH 09/25] ALSA: firewire-digi00x: add data processing layer Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 10/25] ALSA: firewire-digi00x: add stream functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 11/25] ALSA: firewire-digi00x: add proc node to show clock status Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 12/25] ALSA: firewire-digi00x: add PCM functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 13/25] ALSA: firewire-digi00x: add MIDI functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 14/25] ALSA: firewire-digi00x: add hwdep interface Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 15/25] ALSA: firewire-digi00x: add support for asynchronous messaging Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 16/25] ALSA: firewire-digi00x: add support for MIDI ports for machine control Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 17/25] ALSA: firewire-tascam: add skeleton for TASCAM FireWire series Takashi Sakamoto
2015-08-13 6:24 ` Takashi Iwai
2015-08-13 7:18 ` Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 18/25] ALSA: firewire-tascam: add a structure for model-dependent parameters Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 19/25] ALSA: firewire-tascam: add proc node to show firmware information Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 20/25] ALSA: firewire-tascam: add data processing layer Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 21/25] ALSA: firewire-tascam: add streaming functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 22/25] ALSA: firewire-tascam: add PCM functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 23/25] ALSA: firewire-tascam: add transaction functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 24/25] ALSA: firewire-tascam: add MIDI functionality Takashi Sakamoto
2015-08-13 0:20 ` [PATCH 25/25] ALSA: firewire-tascam: add hwdep interface Takashi Sakamoto
2015-08-13 0:32 ` [PATCH 00/25] ALSA: support AMDTP variants Takashi Sakamoto
-- strict thread matches above, loose matches on Subject: below --
2015-08-22 9:19 [PATCH 00/25 v2] " Takashi Sakamoto
2015-08-22 9:19 ` [PATCH 06/25] ALSA: firewire-lib: add throttle for MIDI data rate Takashi Sakamoto
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=55CD0D76.9040107@sakamocchi.jp \
--to=o-takashi@sakamocchi.jp \
--cc=alsa-devel@alsa-project.org \
--cc=clemens@ladisch.de \
--cc=ffado-devel@lists.sf.net \
--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