diff --git a/CMakeLists.txt b/CMakeLists.txt index 9632ec4..87d598b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.4.1) project(AirplayServer) set (CMAKE_CXX_STANDARD 11) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCMAKE_BUILD_TYPE=Debug") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCMAKE_BUILD_TYPE=Release") add_subdirectory(lib/curve25519) add_subdirectory(lib/ed25519) diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..a610446 --- /dev/null +++ b/install.sh @@ -0,0 +1,5 @@ +#!/bin/bash +mkdir build; +cd build/; +cmake ..; +make -j; diff --git a/lib/raop_rtp_mirror.c b/lib/raop_rtp_mirror.c index c53394d..ab5c7b7 100755 --- a/lib/raop_rtp_mirror.c +++ b/lib/raop_rtp_mirror.c @@ -331,10 +331,8 @@ raop_rtp_mirror_thread(void *arg) // The information in the payload contains an SPS and a PPS NAL float width_source = byteutils_get_float(packet, 40); - printf("source-width: %f", width_source); float height_source = byteutils_get_float(packet, 44); float width = byteutils_get_float(packet, 56); - printf("width: %f", width); float height = byteutils_get_float(packet, 60); logger_log(raop_rtp_mirror->logger, LOGGER_DEBUG, "raop_rtp_mirror width_source = %f height_source = %f width = %f height = %f", diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 37fc067..25e3c6a 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -67,7 +67,7 @@ void set_video_overlay2(video_renderer_t *renderer, gulong embed_xid); * 1: a new connection come * -1: a connection lost */ -void video_renderer_update_background(video_renderer_t *renderer, int type); +void video_renderer_update_background(video_renderer_t *renderer, int type, int width, int height); #ifdef __cplusplus } diff --git a/renderers/video_renderer_gstreamer.c b/renderers/video_renderer_gstreamer.c index 88595d3..0ff5a8f 100644 --- a/renderers/video_renderer_gstreamer.c +++ b/renderers/video_renderer_gstreamer.c @@ -111,6 +111,11 @@ void video_renderer_destroy(video_renderer_t *renderer) { } } -void video_renderer_update_background(video_renderer_t *renderer, int type) { +void video_renderer_update_background(video_renderer_t *renderer, int type, int width, int height) { + + if(type==-1) { + + gst_app_src_end_of_stream (GST_APP_SRC(renderer->appsrc)); + } } \ No newline at end of file diff --git a/uxplay.cpp b/uxplay.cpp index a859ea5..f2d718e 100755 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -65,6 +65,15 @@ static raop_t *raop = NULL; static video_renderer_t *video_renderer = NULL; static audio_renderer_t *audio_renderer = NULL; +struct GTK_STRUCT { + GtkWidget *app_window, *video_window; + GdkWindow *video_window_xwindow; + gulong embed_xid; + cairo_surface_t *surface = NULL; +}; + +static GTK_STRUCT * GTK_data = NULL; + static void signal_handler(int sig) { switch (sig) { case SIGINT: @@ -119,6 +128,35 @@ void print_info(char *name) { static void gtk_destroy (GtkWidget * widget, gpointer data) { gtk_main_quit(); } + +gboolean draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) { + guint width, height; + GdkRGBA color; + GtkStyleContext *context; + + context = gtk_widget_get_style_context (widget); + + width = gtk_widget_get_allocated_width (widget); + height = gtk_widget_get_allocated_height (widget); + + gtk_render_background (context, cr, 0, 0, width, height); + + cairo_rectangle (cr, 0, 0, width, height); + + gtk_style_context_get_color (context, + gtk_style_context_get_state (context), + &color); + gdk_cairo_set_source_rgba (cr, &color); + + cairo_fill (cr); + + return FALSE; +} + +void configure_callback(GtkWindow *window, GdkEvent *event, gpointer data) { + gtk_widget_queue_draw(GTK_data->video_window); +} + int main(int argc, char *argv[]) { init_signals(); @@ -173,22 +211,25 @@ int main(int argc, char *argv[]) { //GTK gtk_init (&argc, &argv); + + GTK_data = new GTK_STRUCT(); - GtkWidget *app_window, *video_window; - GdkWindow *video_window_xwindow; - app_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (app_window), "AirplayLinux"); - video_window = gtk_drawing_area_new (); - gtk_widget_set_size_request(video_window, 800, 600); - g_signal_connect (video_window, "destroy",G_CALLBACK (gtk_destroy), NULL); - //gtk_widget_set_double_buffered (video_window, FALSE); - gtk_container_add (GTK_CONTAINER (app_window), video_window); - gtk_widget_show_all (app_window); - gtk_widget_realize (video_window); - - video_window_xwindow = gtk_widget_get_window (video_window); - gulong embed_xid = GDK_WINDOW_XID (video_window_xwindow); - if (start_server(server_hw_addr, server_name, background, audio_device, low_latency, debug_log, embed_xid) != 0) { + GTK_data->app_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (GTK_data->app_window), "AirplayLinux"); + gtk_widget_set_size_request (GTK_data->app_window, 200, 200); + GTK_data->video_window = gtk_drawing_area_new (); + gtk_widget_set_size_request(GTK_data->video_window, 800, 600); + g_signal_connect (GTK_data->video_window, "destroy",G_CALLBACK (gtk_destroy), NULL); + //gtk_widget_set_double_buffered (GTK_data->video_window, FALSE); + gtk_container_add (GTK_CONTAINER (GTK_data->app_window), GTK_data->video_window); + gtk_widget_show_all (GTK_data->app_window); + gtk_widget_realize (GTK_data->video_window); + g_signal_connect (G_OBJECT (GTK_data->video_window), "draw",G_CALLBACK (draw_callback), NULL); + g_signal_connect(G_OBJECT(GTK_data->app_window), "configure-event", G_CALLBACK(configure_callback), NULL); + + GTK_data->video_window_xwindow = gtk_widget_get_window (GTK_data->video_window); + GTK_data->embed_xid = GDK_WINDOW_XID (GTK_data->video_window_xwindow); + if (start_server(server_hw_addr, server_name, background, audio_device, low_latency, debug_log, GTK_data->embed_xid) != 0) { return 1; } @@ -209,11 +250,14 @@ int main(int argc, char *argv[]) { // Server callbacks extern "C" void conn_init(void *cls) { - video_renderer_update_background(video_renderer, 1); + //video_renderer_update_background(video_renderer, 1); } extern "C" void conn_destroy(void *cls) { - video_renderer_update_background(video_renderer, -1); + gtk_widget_queue_draw(GTK_data->video_window); + //int width = gtk_widget_get_allocated_width (GTK_data->video_window); + //int height = gtk_widget_get_allocated_height (GTK_data->video_window); + //video_renderer_update_background(video_renderer, -1, width, height); } extern "C" void audio_process(void *cls, raop_ntp_t *ntp, aac_decode_struct *data) {