From def4678eedc4e5427b35d25285f80247946d73fd Mon Sep 17 00:00:00 2001 From: fduncanh Date: Thu, 14 Oct 2021 00:46:24 -0400 Subject: [PATCH] more infrastructure for diifferent audio formats --- lib/raop_buffer.c | 9 ++++++ lib/raop_buffer.h | 1 + lib/raop_handlers.h | 75 ++++++++++++++++++++++++++++++--------------- lib/raop_rtp.c | 10 ++---- 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/lib/raop_buffer.c b/lib/raop_buffer.c index ddff15d..4ee6cc9 100755 --- a/lib/raop_buffer.c +++ b/lib/raop_buffer.c @@ -53,10 +53,19 @@ struct raop_buffer_s { unsigned short first_seqnum; unsigned short last_seqnum; + /* audio parameters */ + audio_format_t audio_format; + bool using_screen; + /* RTP buffer entries */ raop_buffer_entry_t entries[RAOP_BUFFER_LENGTH]; }; +void raop_buffer_set_audio_parameters(raop_buffer_t *raop_buffer, audio_format_t *audio_format, bool *using_screen) { + assert(raop_buffer); + raop_buffer->audio_format = *audio_format; + raop_buffer->using_screen = *using_screen; +} void raop_buffer_init_key_iv(raop_buffer_t *raop_buffer, const unsigned char *aeskey, diff --git a/lib/raop_buffer.h b/lib/raop_buffer.h index b03ed5d..1b19ee1 100755 --- a/lib/raop_buffer.h +++ b/lib/raop_buffer.h @@ -34,5 +34,6 @@ void raop_buffer_flush(raop_buffer_t *raop_buffer, int next_seq); int raop_buffer_decrypt(raop_buffer_t *raop_buffer, unsigned char *data, unsigned char* output, unsigned int datalen, unsigned int *outputlen); void raop_buffer_destroy(raop_buffer_t *raop_buffer); +void raop_buffer_set_audio_parameters(raop_buffer_t *raop_buffer, audio_format_t *audio_format, bool *using_screen); #endif diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index 15d26bb..f5fb6c4 100755 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -431,45 +431,70 @@ raop_handler_setup(raop_conn_t *conn, break; } case 96: { // Audio - unsigned short cport = conn->raop->control_lport, dport = conn->raop->data_lport; - audio_format_t audio_format = AAC_ELD; - bool using_screen = true; + audio_format_t audioFormat = UNKNOWN; + bool usingScreen = false; + unsigned short spf = 0, ct = 0, redundantAudio = 0; + unsigned int latencyMax, latencyMin; + + plist_type ptype; + uint64_t uint_val; + uint8_t bool_val; /* get audio parameter of connection */ - uint64_t audioFormat; plist_t audio_format_node = plist_dict_get_item(req_stream_node, "audioFormat"); - plist_get_uint_val(audio_format_node, &audioFormat); - audio_format = get_audio_format( (int) audioFormat); - logger_log(conn->raop->logger, LOGGER_DEBUG, "audioFormat = 0X%X %s", audioFormat, audio_format_name(audio_format)); + plist_get_uint_val(audio_format_node, &uint_val); + audioFormat = get_audio_format( (int) uint_val); + logger_log(conn->raop->logger, LOGGER_INFO, "audioFormat = 0X%X %s", audioFormat, audio_format_name(audioFormat)); - if (audio_format == UNKNOWN) { - logger_log(conn->raop->logger, LOGGER_ERR, "RAOP cannot play UNKNOWN audio format 0X%X\n", (int) audioFormat); + if (audioFormat == UNKNOWN) { + logger_log(conn->raop->logger, LOGGER_ERR, "RAOP cannot play UNKNOWN audio format 0X%X\n", (int) uint_val); http_response_set_disconnect(response, 1); } - uint8_t usingScreen; - plist_t using_screen_node = plist_dict_get_item(req_stream_node, "usingScreen"); - plist_get_bool_val(using_screen_node, &usingScreen); - using_screen = (usingScreen == 0) ? false : true; - uint64_t latencyMax, redundantAudio, latencyMin, ct, spf; - plist_t latency_max_node = plist_dict_get_item(req_stream_node, "latencyMax"); - plist_get_uint_val(latency_max_node, &latencyMax); - plist_t redundant_audio_node = plist_dict_get_item(req_stream_node, "redundantAudio"); - plist_get_uint_val(redundant_audio_node, &redundantAudio); - plist_t latency_min_node = plist_dict_get_item(req_stream_node, "latencyMin"); - plist_get_uint_val(latency_min_node, &latencyMin); - plist_t ct_node = plist_dict_get_item(req_stream_node, "ct"); - plist_get_uint_val(ct_node, &ct); + plist_t using_screen_node = plist_dict_get_item(req_stream_node, "usingScreen"); + ptype = plist_get_node_type(using_screen_node); + if (ptype == PLIST_BOOLEAN){ + plist_get_bool_val(using_screen_node, &bool_val); + if (bool_val) { + usingScreen = true; + } + } + plist_t spf_node = plist_dict_get_item(req_stream_node, "spf"); - plist_get_uint_val(spf_node, &spf); + ptype = plist_get_node_type(spf_node); + if(ptype == PLIST_UINT) { + plist_get_uint_val(spf_node, &uint_val); + spf = (unsigned short) uint_val; + } + plist_t ct_node = plist_dict_get_item(req_stream_node, "ct"); + ptype = plist_get_node_type(ct_node); + if(ptype == PLIST_UINT) { + plist_get_uint_val(ct_node, &uint_val); + ct = (unsigned short) uint_val; + } - logger_log(conn->raop->logger, LOGGER_DEBUG, "%d %d %d %d %d %d %d", latencyMax, redundantAudio, latencyMin, ct, spf, using_screen); + plist_t redundant_audio_node = plist_dict_get_item(req_stream_node, "redundantAudio"); + ptype = plist_get_node_type(redundant_audio_node); + if(ptype == PLIST_UINT) { + plist_get_uint_val(redundant_audio_node, &uint_val); + redundantAudio = (unsigned short) uint_val; + } + + plist_t latency_max_node = plist_dict_get_item(req_stream_node, "latencyMax"); + plist_get_uint_val(latency_max_node, &uint_val); + latencyMax = (unsigned int) uint_val; + + plist_t latency_min_node = plist_dict_get_item(req_stream_node, "latencyMin"); + plist_get_uint_val(latency_min_node, &uint_val); + latencyMin = (unsigned int) uint_val; + + logger_log(conn->raop->logger, LOGGER_DEBUG, "audio stream properties: %d %d %d %d %d %d", latencyMax, redundantAudio, latencyMin, ct, spf, usingScreen); if (conn->raop_rtp) { - raop_rtp_start_audio(conn->raop_rtp, use_udp, remote_cport, &cport, &dport, &audio_format, &using_screen); + raop_rtp_start_audio(conn->raop_rtp, use_udp, remote_cport, &cport, &dport, &audioFormat, &usingScreen); logger_log(conn->raop->logger, LOGGER_DEBUG, "RAOP initialized success"); } else { logger_log(conn->raop->logger, LOGGER_ERR, "RAOP not initialized at SETUP, playing will fail!"); diff --git a/lib/raop_rtp.c b/lib/raop_rtp.c index 1ec0936..99a4056 100755 --- a/lib/raop_rtp.c +++ b/lib/raop_rtp.c @@ -98,10 +98,6 @@ struct raop_rtp_s { unsigned short control_lport; unsigned short data_lport; - /* connection-time audio parameters from client */ - audio_format_t audio_format; - bool using_screen; - /* Initialized after the first control packet */ struct sockaddr_storage control_saddr; socklen_t control_saddr_len; @@ -537,16 +533,14 @@ raop_rtp_start_audio(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_r int use_ipv6 = 0; assert(raop_rtp); - + raop_buffer_set_audio_parameters(raop_rtp->buffer, audio_format, using_screen); + MUTEX_LOCK(raop_rtp->run_mutex); if (raop_rtp->running || !raop_rtp->joined) { MUTEX_UNLOCK(raop_rtp->run_mutex); return; } - raop_rtp->audio_format = *audio_format; - raop_rtp->using_screen = *using_screen; - /* Initialize ports and sockets */ raop_rtp->control_lport = *control_lport; raop_rtp->data_lport = *data_lport;