diff --git a/lib/raop.c b/lib/raop.c index 4523a2c..767d15c 100755 --- a/lib/raop.c +++ b/lib/raop.c @@ -45,6 +45,14 @@ struct raop_s { dnssd_t *dnssd; unsigned short port; + unsigned short timing_lport; + unsigned short control_lport; + unsigned short data_lport; + unsigned short mirror_data_lport; + + unsigned short display_width; + unsigned short display_height; + }; struct raop_conn_s { @@ -303,6 +311,18 @@ raop_init(int max_clients, raop_callbacks_t *callbacks) { memcpy(&raop->callbacks, callbacks, sizeof(raop_callbacks_t)); raop->pairing = pairing; raop->httpd = httpd; + + /* initialize network port list */ + raop->port = 0; + raop->timing_lport = 0; + raop->control_lport = 0; + raop->data_lport = 0; + raop->mirror_data_lport = 0; + + /* initialize display width, height */ + raop->display_width = 1920; + raop->display_height = 1080; + return raop; } @@ -334,12 +354,34 @@ raop_set_log_level(raop_t *raop, int level) { logger_set_level(raop->logger, level); } +void raop_set_display_size(raop_t *raop, unsigned short width, unsigned short height){ + assert(raop); + + if (width) raop->display_width = width; + if (height) raop->display_height = height; +} + void raop_set_port(raop_t *raop, unsigned short port) { assert(raop); raop->port = port; } +void +raop_set_udp_ports(raop_t *raop, unsigned short udp[3]) { + assert(raop); + raop->timing_lport = udp[0]; + raop->control_lport = udp[1]; + raop->data_lport = udp[2]; +} + +void +raop_set_tcp_ports(raop_t *raop, unsigned short tcp[2]) { + assert(raop); + raop->mirror_data_lport = tcp[0]; + raop->port = tcp[1]; +} + unsigned short raop_get_port(raop_t *raop) { assert(raop); @@ -377,4 +419,4 @@ void raop_stop(raop_t *raop) { assert(raop); httpd_stop(raop->httpd); -} \ No newline at end of file +} diff --git a/lib/raop.h b/lib/raop.h index cfd703e..1126bb0 100755 --- a/lib/raop.h +++ b/lib/raop.h @@ -54,7 +54,10 @@ RAOP_API raop_t *raop_init(int max_clients, raop_callbacks_t *callbacks); RAOP_API void raop_set_log_level(raop_t *raop, int level); RAOP_API void raop_set_log_callback(raop_t *raop, raop_log_callback_t callback, void *cls); +RAOP_API void raop_set_display_size(raop_t *raop, unsigned short width, unsigned short height); RAOP_API void raop_set_port(raop_t *raop, unsigned short port); +RAOP_API void raop_set_udp_ports(raop_t *raop, unsigned short port[3]); +RAOP_API void raop_set_tcp_ports(raop_t *raop, unsigned short port[2]); RAOP_API unsigned short raop_get_port(raop_t *raop); RAOP_API void *raop_get_callback_cls(raop_t *raop); RAOP_API int raop_start(raop_t *raop, unsigned short *port); diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index 104b1c4..b65a26a 100755 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -134,10 +134,10 @@ raop_handler_info(raop_conn_t *conn, plist_t displays_0_uuid_node = plist_new_string("e0ff8a27-6738-3d56-8a16-cc53aacee925"); plist_t displays_0_width_physical_node = plist_new_uint(0); plist_t displays_0_height_physical_node = plist_new_uint(0); - plist_t displays_0_width_node = plist_new_uint(1920); - plist_t displays_0_height_node = plist_new_uint(1080); - plist_t displays_0_width_pixels_node = plist_new_uint(1920); - plist_t displays_0_height_pixels_node = plist_new_uint(1080); + plist_t displays_0_width_node = plist_new_uint(conn->raop->display_width); + plist_t displays_0_height_node = plist_new_uint(conn->raop->display_height); + plist_t displays_0_width_pixels_node = plist_new_uint(conn->raop->display_width); + plist_t displays_0_height_pixels_node = plist_new_uint(conn->raop->display_height); plist_t displays_0_rotation_node = plist_new_bool(0); plist_t displays_0_refresh_rate_node = plist_new_real(1.0 / 60.0); plist_t displays_0_overscanned_node = plist_new_bool(1); @@ -372,12 +372,14 @@ raop_handler_setup(raop_conn_t *conn, plist_get_uint_val(time_note, &timing_rport); logger_log(conn->raop->logger, LOGGER_DEBUG, "timing_rport = %llu", timing_rport); - unsigned short timing_lport; + unsigned short timing_lport = conn->raop->timing_lport; conn->raop_ntp = raop_ntp_init(conn->raop->logger, conn->remote, conn->remotelen, timing_rport); raop_ntp_start(conn->raop_ntp, &timing_lport); - conn->raop_rtp = raop_rtp_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp, conn->remote, conn->remotelen, aeskey, aesiv, ecdh_secret); - conn->raop_rtp_mirror = raop_rtp_mirror_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp, conn->remote, conn->remotelen, aeskey, ecdh_secret); + conn->raop_rtp = raop_rtp_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp, conn->remote,conn->remotelen, + aeskey, aesiv, ecdh_secret, conn->raop->control_lport, conn->raop->data_lport); + conn->raop_rtp_mirror = raop_rtp_mirror_init(conn->raop->logger, &conn->raop->callbacks, conn->raop_ntp, conn->remote, conn->remotelen, + aeskey, ecdh_secret, conn->raop->mirror_data_lport); plist_t res_event_port_node = plist_new_uint(conn->raop->port); plist_t res_timing_port_node = plist_new_uint(timing_lport); diff --git a/lib/raop_rtp.c b/lib/raop_rtp.c index d31cfef..79b5942 100755 --- a/lib/raop_rtp.c +++ b/lib/raop_rtp.c @@ -133,7 +133,8 @@ raop_rtp_parse_remote(raop_rtp_t *raop_rtp, const unsigned char *remote, int rem raop_rtp_t * raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, raop_ntp_t *ntp, const unsigned char *remote, int remotelen, - const unsigned char *aeskey, const unsigned char *aesiv, const unsigned char *ecdh_secret) + const unsigned char *aeskey, const unsigned char *aesiv, const unsigned char *ecdh_secret, + unsigned short control_lport, unsigned short data_lport) { raop_rtp_t *raop_rtp; @@ -144,6 +145,8 @@ raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, raop_ntp_t *ntp, co if (!raop_rtp) { return NULL; } + raop_rtp->control_lport = control_lport; + raop_rtp->data_lport = data_lport; raop_rtp->logger = logger; raop_rtp->ntp = ntp; @@ -232,6 +235,8 @@ raop_rtp_init_sockets(raop_rtp_t *raop_rtp, int use_ipv6, int use_udp) assert(raop_rtp); + cport = raop_rtp->control_lport; + dport = raop_rtp->data_lport; csock = netutils_init_socket(&cport, use_ipv6, 1); dsock = netutils_init_socket(&dport, use_ipv6, 1); diff --git a/lib/raop_rtp.h b/lib/raop_rtp.h index 5d66b67..7db1787 100755 --- a/lib/raop_rtp.h +++ b/lib/raop_rtp.h @@ -27,7 +27,8 @@ typedef struct raop_rtp_s raop_rtp_t; raop_rtp_t *raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, raop_ntp_t *ntp, const unsigned char *remote, int remotelen, - const unsigned char *aeskey, const unsigned char *aesiv, const unsigned char *ecdh_secret); + const unsigned char *aeskey, const unsigned char *aesiv, const unsigned char *ecdh_secret, + unsigned short control_lport , unsigned short data_lport); void raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport, unsigned short *control_lport, unsigned short *data_lport); diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c index 2040d7e..e1139aa 100755 --- a/lib/raop_rtp_mirror.c +++ b/lib/raop_rtp_mirror.c @@ -102,7 +102,8 @@ raop_rtp_parse_remote(raop_rtp_mirror_t *raop_rtp_mirror, const unsigned char *r #define NO_FLUSH (-42) raop_rtp_mirror_t *raop_rtp_mirror_init(logger_t *logger, raop_callbacks_t *callbacks, raop_ntp_t *ntp, const unsigned char *remote, int remotelen, - const unsigned char *aeskey, const unsigned char *ecdh_secret) + const unsigned char *aeskey, const unsigned char *ecdh_secret, + unsigned short mirror_data_lport) { raop_rtp_mirror_t *raop_rtp_mirror; @@ -113,6 +114,7 @@ raop_rtp_mirror_t *raop_rtp_mirror_init(logger_t *logger, raop_callbacks_t *call if (!raop_rtp_mirror) { return NULL; } + raop_rtp_mirror->mirror_data_lport = mirror_data_lport; raop_rtp_mirror->logger = logger; raop_rtp_mirror->ntp = ntp; @@ -507,6 +509,7 @@ raop_rtp_init_mirror_sockets(raop_rtp_mirror_t *raop_rtp_mirror, int use_ipv6) assert(raop_rtp_mirror); + dport = raop_rtp_mirror->mirror_data_lport; dsock = netutils_init_socket(&dport, use_ipv6, 0); if (dsock == -1) { goto sockets_cleanup; diff --git a/lib/raop_rtp_mirror.h b/lib/raop_rtp_mirror.h index c465ee5..505d875 100755 --- a/lib/raop_rtp_mirror.h +++ b/lib/raop_rtp_mirror.h @@ -25,7 +25,8 @@ typedef struct h264codec_s h264codec_t; raop_rtp_mirror_t *raop_rtp_mirror_init(logger_t *logger, raop_callbacks_t *callbacks, raop_ntp_t *ntp, const unsigned char *remote, int remotelen, - const unsigned char *aeskey, const unsigned char *ecdh_secret); + const unsigned char *aeskey, const unsigned char *ecdh_secret, + unsigned short mirror_data_lport); void raop_rtp_init_mirror_aes(raop_rtp_mirror_t *raop_rtp_mirror, uint64_t streamConnectionID); void raop_rtp_start_mirror(raop_rtp_mirror_t *raop_rtp_mirror, int use_udp, unsigned short *mirror_data_lport);