restore check for compression type

This commit is contained in:
fduncanh
2021-11-05 06:22:56 -04:00
parent d4c3c049b5
commit 7d622cd934
5 changed files with 26 additions and 44 deletions

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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<char> 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<char> 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<char> 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);