diff --git a/lib/raop.h b/lib/raop.h index eaf25d0..bd3363e 100755 --- a/lib/raop.h +++ b/lib/raop.h @@ -42,7 +42,7 @@ struct raop_callbacks_s { void (*conn_destroy)(void *cls); void (*audio_flush)(void *cls); void (*video_flush)(void *cls); - void (*audio_get_format)(void *cls, unsigned int audioFormat); + void (*audio_compression_type)(void *cls, unsigned char *compression_type); void (*audio_set_volume)(void *cls, float volume); void (*audio_set_metadata)(void *cls, const void *buffer, int buflen); void (*audio_set_coverart)(void *cls, const void *buffer, int buflen); diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index 064fa43..8a28a82 100755 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -432,13 +432,12 @@ raop_handler_setup(raop_conn_t *conn, } case 96: { // Audio unsigned short cport = conn->raop->control_lport, dport = conn->raop->data_lport; - - if (conn->raop->callbacks.audio_get_format) { - /* get audio format of connection */ - uint64_t uint_val; - plist_t audio_format_node = plist_dict_get_item(req_stream_node, "audioFormat"); - plist_get_uint_val(audio_format_node, &uint_val); - conn->raop->callbacks.audio_get_format(conn->raop->callbacks.cls, (unsigned int) uint_val); + uint64_t ct; + if (conn->raop->callbacks.audio_compression_type) { + /* get audio compression type */ + plist_t req_stream_ct_node = plist_dict_get_item(req_stream_node, "ct"); + plist_get_uint_val(req_stream_ct_node, &ct); + conn->raop->callbacks.audio_compression_type(conn->raop->callbacks.cls, (unsigned char*) &ct); } if (conn->raop_rtp) { diff --git a/renderers/audio_renderer.h b/renderers/audio_renderer.h index ad542d8..14c3956 100644 --- a/renderers/audio_renderer.h +++ b/renderers/audio_renderer.h @@ -32,7 +32,7 @@ extern "C" { typedef struct audio_renderer_s audio_renderer_t; - audio_renderer_t *audio_renderer_init(logger_t *logger, video_renderer_t *video_renderer, const char* audiosink); +audio_renderer_t *audio_renderer_init(logger_t *logger, unsigned char *compression_type, const char* audiosink); void audio_renderer_start(audio_renderer_t *renderer); void audio_renderer_render_buffer(audio_renderer_t *renderer, raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts); void audio_renderer_set_volume(audio_renderer_t *renderer, float volume); diff --git a/renderers/audio_renderer_gstreamer.c b/renderers/audio_renderer_gstreamer.c index 69dbf15..ca8b4ee 100644 --- a/renderers/audio_renderer_gstreamer.c +++ b/renderers/audio_renderer_gstreamer.c @@ -66,23 +66,21 @@ static gboolean check_plugins (void) return ret; } -audio_renderer_t *audio_renderer_init(logger_t *logger, video_renderer_t *video_renderer, const char* audiosink) { +audio_renderer_t *audio_renderer_init(logger_t *logger, unsigned char *compression_type, const char* audiosink) { audio_renderer_t *renderer; GError *error = NULL; GstCaps *caps = NULL; - //logger_log(logger, LOGGER_INFO , "audio_renderer_init: compression_type ct = %d", *compression_type); - int ct = 8; - int *compression_type = &ct; - + switch (*compression_type) { - case 1: - case 2: - case 4: - case 8: - break; + case 1: /* uncompressed PCM */ + case 2: /* Apple lossless ALAC */ + case 4: /* AAC-LC */ + case 8: /* AAC-ELD */ + logger_log(logger, LOGGER_INFO , "audio_renderer_init: compression_type ct = %d", *compression_type); + break; default: logger_log(logger, LOGGER_ERR, "audio_renderer_init: unsupported compression_type ct = %d", *compression_type); return NULL; diff --git a/uxplay.cpp b/uxplay.cpp index 67b3f60..de22383 100755 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -60,6 +60,8 @@ static bool connections_stopped = false; static unsigned int server_timeout = 0; static unsigned int counter; static bool use_video = true; +static unsigned char compression_type = 8; + gboolean connection_callback (gpointer loop){ if (!connections_stopped) { @@ -464,26 +466,7 @@ extern "C" void audio_set_volume (void *cls, float volume) { } } -extern "C" void audio_get_format (void *cls, unsigned int audioFormat) { - const char * audio_format; - switch (audioFormat) { - case 0x1000000: - audio_format = "AAC_ELD"; - break; - case 0x40000: - audio_format = "ALAC"; - break; - case 0x400000: - audio_format = "AAC"; - break; - case 0x0: - audio_format = "PCM"; - break; - default: - audio_format = "UNKNOWN"; - break; - } - printf("new audio connection with audio format 0x%X %s\n", audioFormat, audio_format); +extern "C" void audio_compression_type (void *cls, unsigned char *ct) { } extern "C" void log_callback (void *cls, int level, const char *msg) { @@ -522,7 +505,7 @@ int start_server (std::vector hw_addr, std::string name, unsigned short di raop_cbs.audio_flush = audio_flush; raop_cbs.video_flush = video_flush; raop_cbs.audio_set_volume = audio_set_volume; - raop_cbs.audio_get_format = audio_get_format; + raop_cbs.audio_compression_type = audio_compression_type; raop = raop_init(10, &raop_cbs); if (raop == NULL) { @@ -567,7 +550,7 @@ int start_server (std::vector hw_addr, std::string name, unsigned short di if (! use_audio) { LOGI("Audio disabled"); - } else if ((audio_renderer = audio_renderer_init(render_logger, video_renderer, audiosink.c_str())) == + } else if ((audio_renderer = audio_renderer_init(render_logger, &compression_type, audiosink.c_str())) == NULL) { LOGE("Could not init audio renderer"); stop_server(); @@ -604,9 +587,11 @@ int start_server (std::vector hw_addr, std::string name, unsigned short di int stop_server () { if (raop) raop_destroy(raop); - if (dnssd) dnssd_unregister_raop(dnssd); - if (dnssd) dnssd_unregister_airplay(dnssd); - if (dnssd) dnssd_destroy(dnssd); + if (dnssd) { + dnssd_unregister_raop(dnssd); + dnssd_unregister_airplay(dnssd); + dnssd_destroy(dnssd); + } if (audio_renderer) audio_renderer_destroy(audio_renderer); if (video_renderer) video_renderer_destroy(video_renderer); if (render_logger) logger_destroy(render_logger);