public inbox for alsa-devel@alsa-project.org
 help / color / mirror / Atom feed
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;
> 

  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