mirror of
https://github.com/morgan9e/UxPlay
synced 2026-04-14 00:04:13 +09:00
restore native render_logger; add audio decription failure message
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
16
uxplay.cpp
16
uxplay.cpp
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user