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)
/**
* 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`.
*
*
* 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;
}
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);