1#
2# pyliblo - Python bindings for the liblo OSC library
3#
4# Copyright (C) 2007-2011  Dominic Sacré  <dominic.sacre@gmx.de>
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU Lesser General Public License as
8# published by the Free Software Foundation; either version 2.1 of the
9# License, or (at your option) any later version.
10#
11
12from libc.stdint cimport int32_t, uint32_t, int64_t, uint8_t
13from libc.stdio cimport const_char
14
15
16cdef extern from 'lo/lo.h':
17    # type definitions
18    ctypedef void *lo_server
19    ctypedef void *lo_server_thread
20    ctypedef void *lo_method
21    ctypedef void *lo_address
22    ctypedef void *lo_message
23    ctypedef void *lo_blob
24    ctypedef void *lo_bundle
25
26    ctypedef struct lo_timetag:
27        uint32_t sec
28        uint32_t frac
29
30    ctypedef union lo_arg:
31        int32_t i
32        int64_t h
33        float f
34        double d
35        unsigned char c
36        char s
37        uint8_t m[4]
38        lo_timetag t
39
40    cdef enum:
41        LO_DEFAULT
42        LO_UDP
43        LO_UNIX
44        LO_TCP
45
46    ctypedef void(*lo_err_handler)(int num, const_char *msg, const_char *where)
47    ctypedef int(*lo_method_handler)(const_char *path, const_char *types, lo_arg **argv, int argc, lo_message msg, void *user_data)
48    ctypedef int(*lo_bundle_start_handler)(lo_timetag time, void *user_data)
49    ctypedef int(*lo_bundle_end_handler)(void *user_data)
50
51    # send
52    int lo_send_message_from(lo_address targ, lo_server serv, char *path, lo_message msg)
53    int lo_send_bundle_from(lo_address targ, lo_server serv, lo_bundle b)
54
55    # server
56    lo_server lo_server_new_with_proto(char *port, int proto, lo_err_handler err_h)
57    void lo_server_free(lo_server s)
58    char *lo_server_get_url(lo_server s)
59    int lo_server_get_port(lo_server s)
60    int lo_server_get_protocol(lo_server s)
61    lo_method lo_server_add_method(lo_server s, char *path, char *typespec, lo_method_handler h, void *user_data)
62    void lo_server_del_method(lo_server s, char *path, char *typespec)
63    int lo_server_add_bundle_handlers(lo_server s, lo_bundle_start_handler sh, lo_bundle_end_handler eh, void *user_data)
64    int lo_server_recv(lo_server s) nogil
65    int lo_server_recv_noblock(lo_server s, int timeout) nogil
66    int lo_server_get_socket_fd(lo_server s)
67
68    # server thread
69    lo_server_thread lo_server_thread_new_with_proto(char *port, int proto, lo_err_handler err_h)
70    void lo_server_thread_free(lo_server_thread st)
71    lo_server lo_server_thread_get_server(lo_server_thread st)
72    void lo_server_thread_start(lo_server_thread st)
73    void lo_server_thread_stop(lo_server_thread st)
74
75    # address
76    lo_address lo_address_new(char *host, char *port)
77    lo_address lo_address_new_with_proto(int proto, char *host, char *port)
78    lo_address lo_address_new_from_url(char *url)
79    void lo_address_free(lo_address)
80    char *lo_address_get_url(lo_address a)
81    char *lo_address_get_hostname(lo_address a)
82    char *lo_address_get_port(lo_address a)
83    int lo_address_get_protocol(lo_address a)
84    const_char* lo_address_errstr(lo_address a)
85
86    # message
87    lo_message lo_message_new()
88    void lo_message_free(lo_message)
89    void lo_message_add_int32(lo_message m, int32_t a)
90    void lo_message_add_int64(lo_message m, int64_t a)
91    void lo_message_add_float(lo_message m, float a)
92    void lo_message_add_double(lo_message m, double a)
93    void lo_message_add_char(lo_message m, char a)
94    void lo_message_add_string(lo_message m, char *a)
95    void lo_message_add_symbol(lo_message m, char *a)
96    void lo_message_add_true(lo_message m)
97    void lo_message_add_false(lo_message m)
98    void lo_message_add_nil(lo_message m)
99    void lo_message_add_infinitum(lo_message m)
100    void lo_message_add_midi(lo_message m, uint8_t a[4])
101    void lo_message_add_timetag(lo_message m, lo_timetag a)
102    void lo_message_add_blob(lo_message m, lo_blob a)
103    lo_address lo_message_get_source(lo_message m)
104
105    # blob
106    lo_blob lo_blob_new(int32_t size, void *data)
107    void lo_blob_free(lo_blob b)
108    void *lo_blob_dataptr(lo_blob b)
109    uint32_t lo_blob_datasize(lo_blob b)
110
111    # bundle
112    lo_bundle lo_bundle_new(lo_timetag tt)
113    void lo_bundle_free(lo_bundle b)
114    void lo_bundle_add_message(lo_bundle b, char *path, lo_message m)
115
116    # timetag
117    void lo_timetag_now(lo_timetag *t)
118