[alsa-devel] aconnect patch
Hi everybody,
I'm a musician working intensively with Linux, and I like writing programs. Now I am working on a little command line utility to store and restore all ALSA (midi) and JACK connections to/from an xml file, and I've been using aconnect as an example for writing the ALSA part.
I also needed a function to remove all connections, similar to the remove_connections function in aconnect. After using aconnect -x for some time, I noticed that it didn't work as it should. Very often a number of connections were left untouched after issuing this command.
After digging a little bit deeper, I think I found the reason for the bug, and wrote a fix for it.
This is what I think happens in remove_connections:
Every time the for loop is executed, the index of the snd_seq_query_subscribe_t is updated (+ 1). If the connection has the right capabilities, it is removed.
When the connection is removed, I think the index gets reassigned, and the next connection gets the position at index 0. The result is that when one connection is removed, the removal of the next connection is skipped (because the for loop updates the index every time).
In the patch, I only update the index when unsubscribing fails, or if it is unwanted because the capabilities or wrong. This seems to solve the problems I had with aconnect -x, and now it disconnects all connections as it should.
In the original function, connections are removed both ways. First all ports with SND_SEQ_PORT_CAP_SUBS_READ are checked, and associated connections removed, and then all ports with SND_SEQ_PORT_CAP_SUBS_WRITE.
In the patch, I removed the second part, because I think it is doing the same thing twice.
Please let me know what you think about this patch, and if you think my reasoning is sane...
Greetings,
Lieven Moors
diff --git a/aconnect.c b/aconnect.c index 1a50666..6092748 100644 --- a/aconnect.c +++ b/aconnect.c @@ -192,52 +192,33 @@ static void remove_connection(snd_seq_t *seq, snd_seq_client_info_t *cinfo, snd_seq_port_info_t *pinfo, int count) { snd_seq_query_subscribe_t *query; - snd_seq_query_subscribe_alloca(&query); snd_seq_query_subscribe_set_root(query, snd_seq_port_info_get_addr(pinfo)); - snd_seq_query_subscribe_set_type(query, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(query, 0); - for (; snd_seq_query_port_subscribers(seq, query) >= 0; - snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1)) { + + while (snd_seq_query_port_subscribers(seq, query) >= 0) + { snd_seq_port_info_t *port; snd_seq_port_subscribe_t *subs; const snd_seq_addr_t *sender = snd_seq_query_subscribe_get_root(query); const snd_seq_addr_t *dest = snd_seq_query_subscribe_get_addr(query); snd_seq_port_info_alloca(&port); - if (snd_seq_get_any_port_info(seq, dest->client, dest->port, port) < 0) - continue; - if (!(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_WRITE)) - continue; - if (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT) - continue; - snd_seq_port_subscribe_alloca(&subs); - snd_seq_port_subscribe_set_queue(subs, snd_seq_query_subscribe_get_queue(query)); - snd_seq_port_subscribe_set_sender(subs, sender); - snd_seq_port_subscribe_set_dest(subs, dest); - snd_seq_unsubscribe_port(seq, subs); - }
- snd_seq_query_subscribe_set_type(query, SND_SEQ_QUERY_SUBS_WRITE); - snd_seq_query_subscribe_set_index(query, 0); - for (; snd_seq_query_port_subscribers(seq, query) >= 0; - snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1)) { - snd_seq_port_info_t *port; - snd_seq_port_subscribe_t *subs; - const snd_seq_addr_t *dest = snd_seq_query_subscribe_get_root(query); - const snd_seq_addr_t *sender = snd_seq_query_subscribe_get_addr(query); - snd_seq_port_info_alloca(&port); - if (snd_seq_get_any_port_info(seq, sender->client, sender->port, port) < 0) - continue; - if (!(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_READ)) - continue; - if (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT) + if ((snd_seq_get_any_port_info(seq, dest->client, dest->port, port) < 0) || + !(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_WRITE) || + (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT)) + { + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); continue; + } snd_seq_port_subscribe_alloca(&subs); snd_seq_port_subscribe_set_queue(subs, snd_seq_query_subscribe_get_queue(query)); snd_seq_port_subscribe_set_sender(subs, sender); snd_seq_port_subscribe_set_dest(subs, dest); - snd_seq_unsubscribe_port(seq, subs); + if(snd_seq_unsubscribe_port(seq, subs) < 0){ + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); + } } }
Dear lieven,
Am Montag, den 15.03.2010, 14:04 +0100 schrieb lieven moors:
[…]
Please let me know what you think about this patch, and if you think my reasoning is sane...
thank you for your work. Unfortunately your MUA mangled the output. Could you please resend without linebreaks.
It looks like you used `git format-patch` already. Great! You can also use `git send-email` if you plan on submitting more patches [1].
Anyway, could you also add a `Signed-off-by` line (`git commit -s` or `git format-patch -s`) and add a more descriptive summary as `aconnect -x: Do not update index after removal of connection.`. (This is just taken form your summary.)
Please make sure when resending to not this by »[PATCH v2]« in front of your subject line, e. g. `git format-patch --subject-prefix="Patch v2"` (see `git help format-patch`).
Thanks again and sorry for the long response,
Paul
[1] http://git.wiki.kernel.org/index.php/GitTips#Using_gmail_to_send_your_patche... [2] http://elinux.org/Git_usage#Sending_with_Gmail
On 03/15/2010 03:32 PM, Paul Menzel wrote:
Dear lieven,
Am Montag, den 15.03.2010, 14:04 +0100 schrieb lieven moors:
[…]
Please let me know what you think about this patch, and if you think my reasoning is sane...
thank you for your work. Unfortunately your MUA mangled the output. Could you please resend without linebreaks.
It looks like you used `git format-patch` already. Great! You can also use `git send-email` if you plan on submitting more patches [1].
Anyway, could you also add a `Signed-off-by` line (`git commit -s` or `git format-patch -s`) and add a more descriptive summary as `aconnect -x: Do not update index after removal of connection.`. (This is just taken form your summary.)
Please make sure when resending to not this by »[PATCH v2]« in front of your subject line, e. g. `git format-patch --subject-prefix="Patch v2"` (see `git help format-patch`).
Thanks again and sorry for the long response,
Paul
[1] http://git.wiki.kernel.org/index.php/GitTips#Using_gmail_to_send_your_patche... [2] http://elinux.org/Git_usage#Sending_with_Gmail
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Thanks for the explanation, here is a second try... I'm not sure what caused the extra line breaks, but this should be plain text now. Hope this works...
From 996cf123d20dc5d7db2f98f29cebcfb7d3b013e0 Mon Sep 17 00:00:00 2001 From: lieven moors lievenmoors@gmail.com Date: Mon, 15 Mar 2010 18:13:11 +0100 Subject: [Patch v2] aconnect -x: Do not update index after removal of connection. Signed-off-by: lieven moors lievenmoors@gmail.com
--- seq/aconnect/aconnect.c | 43 ++++++++++++------------------------------- 1 files changed, 12 insertions(+), 31 deletions(-)
diff --git a/seq/aconnect/aconnect.c b/seq/aconnect/aconnect.c index 1a50666..6092748 100644 --- a/seq/aconnect/aconnect.c +++ b/seq/aconnect/aconnect.c @@ -192,52 +192,33 @@ static void remove_connection(snd_seq_t *seq, snd_seq_client_info_t *cinfo, snd_seq_port_info_t *pinfo, int count) { snd_seq_query_subscribe_t *query; - snd_seq_query_subscribe_alloca(&query); snd_seq_query_subscribe_set_root(query, snd_seq_port_info_get_addr(pinfo)); - snd_seq_query_subscribe_set_type(query, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(query, 0); - for (; snd_seq_query_port_subscribers(seq, query) >= 0; - snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1)) { + + while (snd_seq_query_port_subscribers(seq, query) >= 0) + { snd_seq_port_info_t *port; snd_seq_port_subscribe_t *subs; const snd_seq_addr_t *sender = snd_seq_query_subscribe_get_root(query); const snd_seq_addr_t *dest = snd_seq_query_subscribe_get_addr(query); snd_seq_port_info_alloca(&port); - if (snd_seq_get_any_port_info(seq, dest->client, dest->port, port) < 0) - continue; - if (!(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_WRITE)) - continue; - if (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT) - continue; - snd_seq_port_subscribe_alloca(&subs); - snd_seq_port_subscribe_set_queue(subs, snd_seq_query_subscribe_get_queue(query)); - snd_seq_port_subscribe_set_sender(subs, sender); - snd_seq_port_subscribe_set_dest(subs, dest); - snd_seq_unsubscribe_port(seq, subs); - }
- snd_seq_query_subscribe_set_type(query, SND_SEQ_QUERY_SUBS_WRITE); - snd_seq_query_subscribe_set_index(query, 0); - for (; snd_seq_query_port_subscribers(seq, query) >= 0; - snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1)) { - snd_seq_port_info_t *port; - snd_seq_port_subscribe_t *subs; - const snd_seq_addr_t *dest = snd_seq_query_subscribe_get_root(query); - const snd_seq_addr_t *sender = snd_seq_query_subscribe_get_addr(query); - snd_seq_port_info_alloca(&port); - if (snd_seq_get_any_port_info(seq, sender->client, sender->port, port) < 0) - continue; - if (!(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_READ)) - continue; - if (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT) + if ((snd_seq_get_any_port_info(seq, dest->client, dest->port, port) < 0) || + !(snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_SUBS_WRITE) || + (snd_seq_port_info_get_capability(port) & SND_SEQ_PORT_CAP_NO_EXPORT)) + { + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); continue; + } snd_seq_port_subscribe_alloca(&subs); snd_seq_port_subscribe_set_queue(subs, snd_seq_query_subscribe_get_queue(query)); snd_seq_port_subscribe_set_sender(subs, sender); snd_seq_port_subscribe_set_dest(subs, dest); - snd_seq_unsubscribe_port(seq, subs); + if(snd_seq_unsubscribe_port(seq, subs) < 0){ + snd_seq_query_subscribe_set_index(query, snd_seq_query_subscribe_get_index(query) + 1); + } } }
Am Montag, den 15.03.2010, 18:40 +0100 schrieb lieven moors:
On 03/15/2010 03:32 PM, Paul Menzel wrote:
[…]
Thanks for the explanation, here is a second try... I'm not sure what caused the extra line breaks, but this should be plain text now. Hope this works...
Unfortunately I did not. Could you just attach the patch, please?
Thanks,
Paul
On 03/15/2010 09:47 PM, Paul Menzel wrote:
Am Montag, den 15.03.2010, 18:40 +0100 schrieb lieven moors:
On 03/15/2010 03:32 PM, Paul Menzel wrote:
[…]
Thanks for the explanation, here is a second try... I'm not sure what caused the extra line breaks, but this should be plain text now. Hope this works...
Unfortunately I did not. Could you just attach the patch, please?
Thanks,
Paul
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Ok, done.
On 03/15/2010 11:30 PM, lieven moors wrote:
On 03/15/2010 09:47 PM, Paul Menzel wrote:
Am Montag, den 15.03.2010, 18:40 +0100 schrieb lieven moors:
On 03/15/2010 03:32 PM, Paul Menzel wrote:
[…]
Thanks for the explanation, here is a second try... I'm not sure what caused the extra line breaks, but this should be plain text now. Hope this works...
Unfortunately I did not. Could you just attach the patch, please?
Thanks,
Paul
Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Ok, done.
Hi Paul,
Did you get my patch in the end?
Greetings,
Lieven
Dear Lieven,
sorry for my late reply. I was offline.
Am Mittwoch, den 24.03.2010, 16:32 +0100 schrieb lieven moors:
[…]
Did you get my patch in the end?
yes I did. But it looks like it did not make it to the list.
Takashi, could you please review and apply the attached patch. According to [1] you seem to be the author.
Thanks,
Paul
At Thu, 25 Mar 2010 11:05:55 +0100, Paul Menzel wrote:
Dear Lieven,
sorry for my late reply. I was offline.
Am Mittwoch, den 24.03.2010, 16:32 +0100 schrieb lieven moors:
[…]
Did you get my patch in the end?
yes I did. But it looks like it did not make it to the list.
Takashi, could you please review and apply the attached patch. According to [1] you seem to be the author.
Thanks! I applied it with minor coding-style fixes.
Takashi
participants (3)
-
lieven moors
-
Paul Menzel
-
Takashi Iwai