restore native render_logger; add audio decription failure message

This commit is contained in:
fduncanh
2021-12-07 01:01:03 -05:00
parent 6a42f3fdc0
commit 857d34c937
5 changed files with 47 additions and 17 deletions

View File

@@ -29,7 +29,7 @@ extern "C" {
void audio_renderer_init(const char* audiosink);
void audio_renderer_init(logger_t *logger, const char* audiosink);
void audio_renderer_start(unsigned char* compression_type);
void audio_renderer_stop();
void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts);

View File

@@ -73,17 +73,20 @@ static gboolean check_plugins (void)
#define NFORMATS 4
static audio_renderer_t *renderer_type[NFORMATS];
static audio_renderer_t *renderer = NULL;
static logger_t *logger = NULL;
const char * format[NFORMATS];
void audio_renderer_init(const char* audiosink) {
void audio_renderer_init(logger_t *render_logger, const char* audiosink) {
GError *error = NULL;
GstCaps *caps = NULL;
logger = render_logger;
gst_init(NULL,NULL);
assert(check_plugins ());
for (int i = 0; i < NFORMATS ; i++) {
renderer_type[i] = (audio_renderer_t *) calloc(1,sizeof(audio_renderer_t));
assert(renderer_type[i]);
GString *launch = g_string_new("appsrc name=audio_source stream-type=0 format=GST_FORMAT_TIME is-live=true ! queue ! ");
switch (i) {
case 0: /* AAC-ELD */
@@ -130,7 +133,7 @@ void audio_renderer_init(const char* audiosink) {
format[i] = "PCM 44100/16/2 S16LE";
break;
}
g_debug ("supported audio format %d: %s",i+1,format[i]);
logger_log(logger, LOGGER_DEBUG, "supported audio format %d: %s",i+1,format[i]);
g_object_set(renderer_type[i]->appsrc, "caps", caps, NULL);
gst_caps_unref(caps);
}
@@ -157,16 +160,16 @@ void audio_renderer_start(unsigned char *ct) {
if(compression_type != renderer->ct) {
gst_app_src_end_of_stream(GST_APP_SRC(renderer->appsrc));
gst_element_set_state (renderer->pipeline, GST_STATE_NULL);
g_message ("changed audio connection, format %s", format[id]);
logger_log(logger, LOGGER_INFO, "changed audio connection, format %s", format[id]);
renderer = renderer_type[id];
gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING);
}
} else if (compression_type) {
g_message ("start audio connection, format %s", format[id]);
logger_log(logger, LOGGER_INFO, "start audio connection, format %s", format[id]);
renderer = renderer_type[id];
gst_element_set_state (renderer->pipeline, GST_STATE_PLAYING);
} else {
g_error("unknown audio compression type ct = %d", *ct);
logger_log(logger, LOGGER_ERR, "unknown audio compression type ct = %d", *ct);
}
}
@@ -174,6 +177,7 @@ void audio_renderer_start(unsigned char *ct) {
void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts) {
GstBuffer *buffer;
bool valid;
if (data_len == 0 || renderer == NULL) return;
/* all audio received seems to be either ct = 8 (AAC_ELD 44100/2 spf 460 ) AirPlay Mirror protocol */
@@ -184,7 +188,25 @@ void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data
assert(buffer != NULL);
GST_BUFFER_DTS(buffer) = (GstClockTime)pts;
gst_buffer_fill(buffer, 0, data, data_len);
gst_app_src_push_buffer(GST_APP_SRC(renderer->appsrc), buffer);
switch (renderer->ct) {
case 8: /*AAC-ELD*/
valid = (data[0] == 0x8d || data[0] == 0x8e);
break;
case 2: /*ALAC*/
valid = (data[0] == 0x20);
break;
case 4: /*AAC_LC */
valid = (data[0] == 0xff );
break;
default:
valid = true;
break;
}
if (valid) {
gst_app_src_push_buffer(GST_APP_SRC(renderer->appsrc), buffer);
} else {
logger_log(logger, LOGGER_ERR, "*** ERROR decrypted audio frame (compression_type %d) was not valid", renderer->ct);
}
}
void audio_renderer_set_volume(float volume) {

View File

@@ -44,7 +44,7 @@ typedef enum videoflip_e {
typedef struct video_renderer_s video_renderer_t;
void video_renderer_init (const char *server_name, videoflip_t videoflip[2], const char *videosink);
void video_renderer_init (logger_t *logger, const char *server_name, videoflip_t videoflip[2], const char *videosink);
void video_renderer_start ();
void video_renderer_stop ();
void video_renderer_render_buffer (raop_ntp_t *ntp, unsigned char* data, int data_len, uint64_t pts, int type);

View File

@@ -94,10 +94,12 @@ static void append_videoflip (GString *launch, const videoflip_t *flip, const vi
}
static video_renderer_t *renderer = NULL;
static logger_t *logger = NULL;
void video_renderer_init(const char *server_name, videoflip_t videoflip[2], const char *videosink) {
void video_renderer_init(logger_t *render_logger, const char *server_name, videoflip_t videoflip[2], const char *videosink) {
GError *error = NULL;
logger = render_logger;
/* this call to g_set_application_name makes server_name appear in the X11 display window title bar, */
/* (instead of the program name uxplay taken from (argv[0]). It is only set one time. */
@@ -209,7 +211,7 @@ gboolean gstreamer_pipeline_bus_callback(GstBus *bus, GstMessage *message, gpoin
gchar *debug;
gboolean flushing;
gst_message_parse_error (message, &err, &debug);
g_print ("GStreamer error: %s\n", err->message);
logger_log(logger, LOGGER_INFO, "GStreamer error: %s", err->message);
g_error_free (err);
g_free (debug);
gst_app_src_end_of_stream (GST_APP_SRC(renderer->appsrc));
@@ -221,7 +223,7 @@ gboolean gstreamer_pipeline_bus_callback(GstBus *bus, GstMessage *message, gpoin
}
case GST_MESSAGE_EOS:
/* end-of-stream */
g_print("GStreamer: End-Of-Stream\n");
logger_log(logger, LOGGER_INFO, "GStreamer: End-Of-Stream");
// g_main_loop_quit( (GMainLoop *) loop);
break;
default:

View File

@@ -57,8 +57,8 @@
static int start_raop_server (std::vector<char> hw_addr, std::string name, unsigned short display[5],
unsigned short tcp[3], unsigned short udp[3], bool debug_log);
static int stop_raop_server ();
extern "C" void log_callback (void *cls, int level, const char *msg) ;
static dnssd_t *dnssd = NULL;
static raop_t *raop = NULL;
@@ -445,20 +445,25 @@ int main (int argc, char *argv[]) {
append_hostname(server_name);
render_logger = logger_init();
logger_set_callback(render_logger, log_callback, NULL);
logger_set_level(render_logger, debug_log ? LOGGER_DEBUG : LOGGER_INFO);
if (use_audio) {
audio_renderer_init(audiosink.c_str());
audio_renderer_init(render_logger, audiosink.c_str());
} else {
LOGI("audio_disabled");
}
if (use_video) {
video_renderer_init(server_name.c_str(), videoflip, videosink.c_str());
video_renderer_init(render_logger, server_name.c_str(), videoflip, videosink.c_str());
video_renderer_start();
}
if (udp[0]) LOGI("using network ports UDP %d %d %d TCP %d %d %d",
udp[0],udp[1], udp[2], tcp[0], tcp[1], tcp[2]);
udp[0],udp[1], udp[2], tcp[0], tcp[1], tcp[2]);
std::string mac_address;
if (!use_random_hw_addr) mac_address = find_mac();
@@ -485,7 +490,7 @@ int main (int argc, char *argv[]) {
LOGI("Re-launching server...");
stop_raop_server();
video_renderer_destroy();
video_renderer_init(server_name.c_str(), videoflip, videosink.c_str());
video_renderer_init(render_logger, server_name.c_str(), videoflip, videosink.c_str());
video_renderer_start();
goto relaunch;
} else {
@@ -498,6 +503,7 @@ int main (int argc, char *argv[]) {
if (use_video) {
video_renderer_destroy();
}
logger_destroy(render_logger);
}
// Server callbacks