]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
seq: user-client: rewrite public API to schedule single event
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 14 Jun 2022 10:23:22 +0000 (19:23 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Tue, 14 Jun 2022 10:23:22 +0000 (19:23 +0900)
This commit rewrite ALSASeq.schedule_event() to get an instance of
ALSASeq.Event.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
samples/seq
src/seq/alsaseq.map
src/seq/user-client.c
src/seq/user-client.h

index c335338efea0303a86e4589cc15c58587a78dc58..d3bef8e883b1292412e0ddc45b40f524d4f0d318 100755 (executable)
@@ -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)
index 2cd638c31e20c21f6f77b58801f68ee99455bcde..c624d32122b66bb25d256e4c0771ccd238641bf5 100644 (file)
@@ -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;
index e359156098e9d61272580ef50aa67eed31e73b79..fdba9a11c3627663d4d97ddd86797381f0c7b8a4 100644 (file)
@@ -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;
 }
 
index c810cd7ce129b7223b0b25af1e1dcaf82aa3b03d..fce549dd6b3426d259cdf2de868e1d34a23e4573 100644 (file)
@@ -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);