#include <alsa/asoundlib.h>

#define CLIENT 72
#define PORT    0

void subscribe_to(snd_seq_t *seq, int port, int client, int c_port);

int main() {
    snd_seq_t       *seq;
    int              port;
    snd_seq_event_t *ev;

    /* Open the sequencer */
    snd_seq_open(&seq, "default", SND_SEQ_OPEN_INPUT, 0);
    snd_seq_set_client_name(seq, "test");

    /* Our port */
    port = snd_seq_create_simple_port(seq, "test port",
                                      SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
                                      SND_SEQ_PORT_TYPE_MIDI_GENERIC|SND_SEQ_PORT_TYPE_APPLICATION);


    subscribe_to(seq, port, CLIENT, PORT);

    for(;;) {
        snd_seq_event_input(seq, &ev);
        printf("Type: %d Time: %d %d\n", ev->type, ev->time.time.tv_sec,
               ev->time.time.tv_nsec);
        /* This prints 0 0 ... what do I do to receive time? */
    }
}

void subscribe_to(snd_seq_t *seq, int port, int client, int c_port) {
    snd_seq_addr_t sender, dest;
    snd_seq_port_subscribe_t *subs;
    int queue;
    snd_seq_event_t ev;

    sender.client = client;
    sender.port   = c_port;
    dest.client   = snd_seq_client_id(seq);
    dest.port     = port;
    queue         = snd_seq_alloc_queue(seq);

    snd_seq_port_subscribe_alloca(&subs);
    snd_seq_port_subscribe_set_sender(subs, &sender);
    snd_seq_port_subscribe_set_dest(subs, &dest);
    snd_seq_port_subscribe_set_queue(subs, queue);
    snd_seq_port_subscribe_set_time_update(subs, 1);
    snd_seq_port_subscribe_set_time_real(subs, 1);
    snd_seq_subscribe_port(seq, subs);
}
