From 36db5e3a81100309ddff868df5680329a7df2cb4 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Tue, 14 Jun 2022 19:23:22 +0900 Subject: [PATCH] seq: user-client: rewrite public API to schedule single event This commit rewrite ALSASeq.schedule_event() to get an instance of ALSASeq.Event. Signed-off-by: Takashi Sakamoto --- samples/seq | 13 +++++------- src/seq/alsaseq.map | 2 +- src/seq/user-client.c | 46 +++++++++++++++++++++++++++---------------- src/seq/user-client.h | 4 ++-- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/samples/seq b/samples/seq index c335338..d3bef8e 100755 --- a/samples/seq +++ b/samples/seq @@ -136,19 +136,16 @@ _, src = client.create_source() src.attach(dispatcher.get_context()) # Register UNIX signal handler. -def handle_unix_signal(dispatcher): - dispatcher.quit() -GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, SIGINT, - handle_unix_signal, dispatcher) +GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, SIGINT, lambda d: d.quit(), + dispatcher) # Start to dispatch events. dispatcher.run() # Stop the queue. -ev_cntr = ALSASeq.EventCntr.new(1) -ev_cntr.set_queue_id(0, queue_id) -ev_cntr.set_event_type(0, ALSASeq.EventType.STOP) -client.schedule_event(ev_cntr, 1) +ev = ALSASeq.Event.new(ALSASeq.EventType.STOP) +ev.set_queue_id(queue_id) +client.schedule_event(ev) # Delete the queue. client.delete_queue(queue_id) diff --git a/src/seq/alsaseq.map b/src/seq/alsaseq.map index 2cd638c..c624d32 100644 --- a/src/seq/alsaseq.map +++ b/src/seq/alsaseq.map @@ -140,7 +140,6 @@ ALSA_GOBJECT_0_3_0 { "alsaseq_user_client_delete_port"; "alsaseq_user_client_set_pool"; "alsaseq_user_client_get_pool"; - "alsaseq_user_client_schedule_event"; "alsaseq_user_client_create_source"; "alsaseq_user_client_operate_subscription"; "alsaseq_user_client_create_queue"; @@ -271,4 +270,5 @@ ALSA_GOBJECT_0_3_0 { "alsaseq_event_set_result_data"; "alsaseq_user_client_schedule_events"; + "alsaseq_user_client_schedule_event"; } ALSA_GOBJECT_0_2_0; diff --git a/src/seq/user-client.c b/src/seq/user-client.c index e359156..fdba9a1 100644 --- a/src/seq/user-client.c +++ b/src/seq/user-client.c @@ -543,8 +543,7 @@ gboolean alsaseq_user_client_get_pool(ALSASeqUserClient *self, /** * alsaseq_user_client_schedule_event: * @self: A [class@UserClient]. - * @ev_cntr: An instance of [class@EventCntr] pointing to events. - * @count: The number of events in the ev_cntr to write. + * @event: An instance of [struct@Event]. * @error: A [struct@GLib.Error]. Error is generated with two domains; `GLib.FileError` and * `ALSASeq.UserClientError`. * @@ -554,39 +553,52 @@ gboolean alsaseq_user_client_get_pool(ALSASeqUserClient *self, * * Returns: %TRUE when the overall operation finishes successfully, else %FALSE. */ -gboolean alsaseq_user_client_schedule_event(ALSASeqUserClient *self, ALSASeqEventCntr *ev_cntr, - gsize count, GError **error) +gboolean alsaseq_user_client_schedule_event(ALSASeqUserClient *self, const ALSASeqEvent *event, + GError **error) { ALSASeqUserClientPrivate *priv; - gsize total; - const guint8 *buf; - gsize length; - ssize_t len; + size_t length; + guint8 *buf; + ssize_t result; g_return_val_if_fail(ALSASEQ_IS_USER_CLIENT(self), FALSE); + g_return_val_if_fail(event != NULL, FALSE); + g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + priv = alsaseq_user_client_get_instance_private(self); - g_return_val_if_fail(ALSASEQ_IS_EVENT_CNTR(ev_cntr), FALSE); - g_return_val_if_fail(error == NULL || *error == NULL, FALSE); + if (!seq_event_is_deliverable(event)) { + g_set_error_literal(error, ALSASEQ_USER_CLIENT_ERROR, + ALSASEQ_USER_CLIENT_ERROR_EVENT_UNDELIVERABLE, + "The operation failes due to undeliverable event"); + return FALSE; + } - alsaseq_event_cntr_count_events(ev_cntr, &total); - g_return_val_if_fail(count <= total, FALSE); + length = seq_event_calculate_flattened_length(event, FALSE); + if (length == sizeof(*event)) { + buf = (guint8 *)event; + } else { + buf = g_malloc0(length); - seq_event_cntr_get_buf(ev_cntr, count, &buf, &length); - g_return_val_if_fail(buf != NULL && length > 0, FALSE); + seq_event_copy_flattened(event, buf, length); + } - len = write(priv->fd, buf, length); - if (len < 0) { + result = write(priv->fd, buf, length); + if (length != sizeof(*event)) + g_free(buf); + if (result < 0) { GFileError code = g_file_error_from_errno(errno); if (code != G_FILE_ERROR_FAILED) - generate_file_error(error, code, "write(%s)", priv->devnode); + generate_file_error(error, errno, "write(%s)", priv->devnode); else generate_syscall_error(error, errno, "write(%s)", priv->devnode); return FALSE; } + g_return_val_if_fail(result == length, FALSE); + return TRUE; } diff --git a/src/seq/user-client.h b/src/seq/user-client.h index c810cd7..fce549d 100644 --- a/src/seq/user-client.h +++ b/src/seq/user-client.h @@ -62,8 +62,8 @@ gboolean alsaseq_user_client_set_pool(ALSASeqUserClient *self, ALSASeqClientPool gboolean alsaseq_user_client_get_pool(ALSASeqUserClient *self, ALSASeqClientPool *const *client_pool, GError **error); -gboolean alsaseq_user_client_schedule_event(ALSASeqUserClient *self, ALSASeqEventCntr *ev_cntr, - gsize count, GError **error); +gboolean alsaseq_user_client_schedule_event(ALSASeqUserClient *self, const ALSASeqEvent *event, + GError **error); gboolean alsaseq_user_client_schedule_events(ALSASeqUserClient *self, const GList *events, gsize *count, GError **error); -- 2.47.3