gpointer tag;
void *buf;
unsigned int buf_len;
- ALSATimerEventData *event_data;
} TimerUserInstanceSource;
enum timer_user_instance_sig_type {
/**
* ALSATimerUserInstance::handle-event:
* @self: A #ALSATimerUserInstance.
- * @event_data: (transfer none): An object derived from #ALSATimerEventData.
+ * @event: (transfer none): The instance of #ALSATimerEvent.
*
* When event occurs for any element, this signal is emit.
*/
G_STRUCT_OFFSET(ALSATimerUserInstanceClass, handle_event),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1, ALSATIMER_TYPE_EVENT_DATA);
+ G_TYPE_NONE, 1, ALSATIMER_TYPE_EVENT);
/**
* ALSATimerUserInstance::handle-disconnection:
}
}
-static void handle_tick_events(TimerUserInstanceSource *src, int len)
-{
- struct snd_timer_read *ev = src->buf;
-
- while (len >= sizeof(*ev)) {
- ALSATimerEventDataTick *data = ALSATIMER_EVENT_DATA_TICK(src->event_data);
-
- timer_event_data_tick_set_data(data, ev);
- g_signal_emit(src->self,
- timer_user_instance_sigs[TIMER_USER_INSTANCE_SIG_HANDLE_EVENT],
- 0, src->event_data);
-
- len -= sizeof(*ev);
- ++ev;
- }
-}
-
-static void handle_timestamp_events(TimerUserInstanceSource *src, int len)
-{
- struct snd_timer_tread *ev = src->buf;
-
- while (len >= sizeof(*ev)) {
- ALSATimerEventDataTimestamp *data = ALSATIMER_EVENT_DATA_TIMESTAMP(src->event_data);
-
- timer_event_data_timestamp_set_data(data, ev);
- g_signal_emit(src->self,
- timer_user_instance_sigs[TIMER_USER_INSTANCE_SIG_HANDLE_EVENT],
- 0, src->event_data);
-
- len -= sizeof(*ev);
- ++ev;
- }
-}
-
static gboolean timer_user_instance_check_src(GSource *gsrc)
{
TimerUserInstanceSource *src = (TimerUserInstanceSource *)gsrc;
ALSATimerUserInstance *self = src->self;
ALSATimerUserInstancePrivate *priv;
GIOCondition condition;
+ size_t event_size;
int len;
+ guint8 *buf;
priv = alsatimer_user_instance_get_instance_private(self);
if (priv->fd < 0)
return G_SOURCE_REMOVE;
}
- if (priv->event_data_type == ALSATIMER_EVENT_DATA_TYPE_TICK)
- handle_tick_events(src, len);
- else
- handle_timestamp_events(src, len);
+ switch (priv->event_data_type) {
+ case ALSATIMER_EVENT_DATA_TYPE_TICK:
+ event_size = sizeof(struct snd_timer_read);
+ break;
+ case ALSATIMER_EVENT_DATA_TYPE_TIMESTAMP:
+ event_size = sizeof(struct snd_timer_tread);
+ break;
+ default:
+ return G_SOURCE_CONTINUE;
+ }
+
+ buf = src->buf;
+ while (len > 0) {
+ ALSATimerEvent *ev = (ALSATimerEvent *)buf;
+
+ g_signal_emit(src->self,
+ timer_user_instance_sigs[TIMER_USER_INSTANCE_SIG_HANDLE_EVENT],
+ 0, ev);
+
+ buf += event_size;
+ len -= event_size;
+ }
// Just be sure to continue to process this source.
return G_SOURCE_CONTINUE;
TimerUserInstanceSource *src = (TimerUserInstanceSource *)gsrc;
g_free(src->buf);
- g_object_unref(src->event_data);
g_object_unref(src->self);
}
.finalize = timer_user_instance_finalize_src,
};
ALSATimerUserInstancePrivate *priv;
- GType event_data_class;
TimerUserInstanceSource *src;
long page_size = sysconf(_SC_PAGESIZE);
void *buf;
return;
}
- switch (priv->event_data_type) {
- case ALSATIMER_EVENT_DATA_TYPE_TICK:
- event_data_class = ALSATIMER_TYPE_EVENT_DATA_TICK;
- break;
- case ALSATIMER_EVENT_DATA_TYPE_TIMESTAMP:
- event_data_class = ALSATIMER_TYPE_EVENT_DATA_TIMESTAMP;
- break;
- default:
- generate_error(error, EINVAL);
- return;
- }
-
buf = g_try_malloc0(page_size);
if (buf == NULL) {
generate_error(error, ENOMEM);
src->tag = g_source_add_unix_fd(*gsrc, priv->fd, G_IO_IN);
src->buf = buf;
src->buf_len = page_size;
-
- src->event_data = g_object_new(event_data_class,
- "type", priv->event_data_type, NULL);
}
/**