Timestamping (if enabled on a subscription or a port) is not applied
to the quoted event but to the quoting event. This patch adds a
function to copy only selected fields into the event to be delivered.
- fix KERNEL_QUOTE event timestamping
- fix typo in port_broadcast_event
Index: alsa-kernel/core/seq/seq_clientmgr.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/seq/seq_clientmgr.c,v
retrieving revision 1.27
diff -u -r1.27 seq_clientmgr.c
--- alsa-kernel/core/seq/seq_clientmgr.c 5 Feb 2004 15:38:42 -0000 1.27
+++ alsa-kernel/core/seq/seq_clientmgr.c 23 Feb 2004 08:27:41 -0000
@@ -547,6 +547,36 @@
/*
+ * expand a quoted event.
+ */
+static int expand_quoted_event(snd_seq_event_t *event)
+{
+ snd_seq_event_t *quoted;
+
+ quoted = event->data.quote.event;
+ if (quoted == NULL) {
+ snd_printd("seq: quoted event is NULL\n");
+ return -EINVAL;
+ }
+
+ event->type = quoted->type;
+ event->tag = quoted->tag;
+ event->source = quoted->source;
+ /* don't use quoted destination */
+ event->data = quoted->data;
+ /* use quoted timestamp only if subscription/port didn't update it */
+ if (event->queue == SNDRV_SEQ_QUEUE_DIRECT) {
+ event->flags = quoted->flags;
+ event->queue = quoted->queue;
+ event->time = quoted->time;
+ } else {
+ event->flags = (event->flags & SNDRV_SEQ_TIME_STAMP_MASK)
+ | (quoted->flags & ~SNDRV_SEQ_TIME_STAMP_MASK);
+ }
+ return 0;
+}
+
+/*
* deliver an event to the specified destination.
* if filter is non-zero, client filter bitmap is tested.
*
@@ -581,12 +611,9 @@
update_timestamp_of_queue(event, dest_port->time_queue,
dest_port->time_real);
- /* expand the quoted event */
if (event->type == SNDRV_SEQ_EVENT_KERNEL_QUOTE) {
quoted = 1;
- event = event->data.quote.event;
- if (event == NULL) {
- snd_printd("seq: quoted event is NULL\n");
+ if (expand_quoted_event(event) < 0) {
result = 0; /* do not send bounce error */
goto __skip;
}
@@ -694,8 +721,8 @@
if (dest_client == NULL)
return 0; /* no matching destination */
- read_lock(&client->ports_lock);
- list_for_each(p, &client->ports_list_head) {
+ read_lock(&dest_client->ports_lock);
+ list_for_each(p, &dest_client->ports_list_head) {
client_port_t *port = list_entry(p, client_port_t, list);
event->dest.port = port->addr.port;
/* pass NULL as source client to avoid error bounce */
@@ -706,7 +733,7 @@
break;
num_ev++;
}
- read_unlock(&client->ports_lock);
+ read_unlock(&dest_client->ports_lock);
snd_seq_client_unlock(dest_client);
event->dest.port = SNDRV_SEQ_ADDRESS_BROADCAST; /* restore */
return (err < 0) ? err : num_ev;
-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel