This commit is contained in:
2020-04-20 22:16:07 +02:00
parent fd86607fdd
commit 984693226c
6 changed files with 74 additions and 22 deletions

View File

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

5
install.sh Normal file
View File

@@ -0,0 +1,5 @@
#!/bin/bash
mkdir build;
cd build/;
cmake ..;
make -j;

View File

@@ -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",

View File

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

View File

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

View File

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