From 7f5855f6baa35df2cfa855baced2f61083e78670 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sun, 30 Aug 2009 22:40:28 +0300 Subject: [PATCH] Studio start/stop commands and signals --- daemon/studio.c | 112 +++++++++++++++++++++++++++++++++++++++++------- gui/gui.glade | 44 +++++++++++++++++++ gui/main.c | 30 +++++++++++++ ladish_control | 8 ++++ studio_proxy.c | 44 +++++++++++++++++++ studio_proxy.h | 4 ++ 6 files changed, 226 insertions(+), 16 deletions(-) diff --git a/daemon/studio.c b/daemon/studio.c index 9b2ea519..56170846 100644 --- a/daemon/studio.c +++ b/daemon/studio.c @@ -503,6 +503,55 @@ studio_publish(void) return true; } +static void emit_studio_started() +{ + signal_new_valist(g_dbus_connection, STUDIO_OBJECT_PATH, IFACE_STUDIO, "StudioStarted", DBUS_TYPE_INVALID); +} + +static void emit_studio_stopped() +{ + signal_new_valist(g_dbus_connection, STUDIO_OBJECT_PATH, IFACE_STUDIO, "StudioStopped", DBUS_TYPE_INVALID); +} + +static bool studio_start(void) +{ + if (!g_studio.jack_running) + { + lash_info("Starting JACK server."); + + if (!jack_proxy_start_server()) + { + lash_error("jack_proxy_start_server() failed."); + return false; + } + } + + emit_studio_started(); + + return true; +} + +static bool studio_stop(void) +{ + if (g_studio.jack_running) + { + lash_info("Stopping JACK server..."); + + if (jack_proxy_stop_server()) + { + g_studio.jack_running = false; + emit_studio_stopped(); + } + else + { + lash_error("Stopping JACK server failed."); + return false; + } + } + + return true; +} + void studio_clear(void) { @@ -521,19 +570,7 @@ studio_clear(void) g_studio.jack_conf_valid = false; - if (g_studio.jack_running) - { - lash_info("Stopping JACK server..."); - - if (jack_proxy_stop_server()) - { - g_studio.jack_running = false; - } - else - { - lash_error("Stopping JACK server failed."); - } - } + studio_stop(); if (g_studio.dbus_object != NULL) { @@ -1552,10 +1589,9 @@ bool studio_load(void * call_ptr, const char * studio_name) return false; } - lash_info("Starting JACK server."); - if (!jack_proxy_start_server()) + if (!studio_start()) { - lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "Failed to start JACK server() failed."); + lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "Failed to start JACK server."); studio_clear(); return false; } @@ -1650,6 +1686,34 @@ bool studio_new(void * call_ptr, const char * studio_name) return true; } +static void ladish_stop_studio(method_call_t * call_ptr) +{ + lash_info("Studio stop requested"); + + if (!studio_stop()) + { + lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "Failed to stop studio."); + } + else + { + method_return_new_void(call_ptr); + } +} + +static void ladish_start_studio(method_call_t * call_ptr) +{ + lash_info("Studio start requested"); + + if (!studio_start()) + { + lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "Failed to start studio."); + } + else + { + method_return_new_void(call_ptr); + } +} + METHOD_ARGS_BEGIN(GetName, "Get studio name") METHOD_ARG_DESCRIBE_OUT("studio_name", "s", "Name of studio") METHOD_ARGS_END @@ -1664,17 +1728,31 @@ METHOD_ARGS_END METHOD_ARGS_BEGIN(Unload, "Unload studio") METHOD_ARGS_END +METHOD_ARGS_BEGIN(Start, "Start studio") +METHOD_ARGS_END + +METHOD_ARGS_BEGIN(Stop, "Stop studio") +METHOD_ARGS_END + METHODS_BEGIN METHOD_DESCRIBE(GetName, ladish_get_studio_name) METHOD_DESCRIBE(Rename, ladish_rename_studio) METHOD_DESCRIBE(Save, ladish_save_studio) METHOD_DESCRIBE(Unload, ladish_unload_studio) + METHOD_DESCRIBE(Start, ladish_start_studio) + METHOD_DESCRIBE(Stop, ladish_stop_studio) METHODS_END SIGNAL_ARGS_BEGIN(StudioRenamed, "Studio name changed") SIGNAL_ARG_DESCRIBE("studio_name", "s", "New studio name") SIGNAL_ARGS_END +SIGNAL_ARGS_BEGIN(StudioStarted, "Studio started") +SIGNAL_ARGS_END + +SIGNAL_ARGS_BEGIN(StudioStopped, "Studio stopped") +SIGNAL_ARGS_END + SIGNAL_ARGS_BEGIN(RoomAppeared, "Room D-Bus object appeared") SIGNAL_ARG_DESCRIBE("room_path", "s", "room object path") SIGNAL_ARGS_END @@ -1685,6 +1763,8 @@ SIGNAL_ARGS_END SIGNALS_BEGIN SIGNAL_DESCRIBE(StudioRenamed) + SIGNAL_DESCRIBE(StudioStarted) + SIGNAL_DESCRIBE(StudioStopped) SIGNAL_DESCRIBE(RoomAppeared) SIGNAL_DESCRIBE(RoomDisappeared) SIGNALS_END diff --git a/gui/gui.glade b/gui/gui.glade index 3cc44320..e042c18b 100644 --- a/gui/gui.glade +++ b/gui/gui.glade @@ -51,6 +51,50 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Start Studio + True + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-media-play + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Stop Studio + True + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-media-stop + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True diff --git a/gui/main.c b/gui/main.c index 14398ecd..122aaf39 100644 --- a/gui/main.c +++ b/gui/main.c @@ -49,6 +49,8 @@ GtkWidget * g_xrun_progress_bar; GtkWidget * g_buffer_size_combo; GtkWidget * g_menu_item_new_studio; +GtkWidget * g_menu_item_start_studio; +GtkWidget * g_menu_item_stop_studio; GtkWidget * g_menu_item_save_studio; GtkWidget * g_menu_item_unload_studio; GtkWidget * g_menu_item_rename_studio; @@ -337,6 +339,26 @@ static void new_studio(void) } } +static void start_studio(void) +{ + lash_info("start studio request"); + if (!studio_proxy_start()) + { + lash_error("studio start failed"); + /* TODO: display error message */ + } +} + +static void stop_studio(void) +{ + lash_info("stop studio request"); + if (!studio_proxy_stop()) + { + lash_error("studio stop failed"); + /* TODO: display error message */ + } +} + static void unload_studio(void) { lash_info("unload studio request"); @@ -393,6 +415,8 @@ void control_proxy_on_studio_appeared(void) goto free_name; } + gtk_widget_set_sensitive(g_menu_item_start_studio, true); + gtk_widget_set_sensitive(g_menu_item_stop_studio, true); gtk_widget_set_sensitive(g_menu_item_save_studio, true); gtk_widget_set_sensitive(g_menu_item_unload_studio, true); gtk_widget_set_sensitive(g_menu_item_rename_studio, true); @@ -416,6 +440,8 @@ void control_proxy_on_studio_disappeared(void) return; } + gtk_widget_set_sensitive(g_menu_item_start_studio, false); + gtk_widget_set_sensitive(g_menu_item_stop_studio, false); gtk_widget_set_sensitive(g_menu_item_save_studio, false); gtk_widget_set_sensitive(g_menu_item_unload_studio, false); gtk_widget_set_sensitive(g_menu_item_rename_studio, false); @@ -531,6 +557,8 @@ int main(int argc, char** argv) g_xrun_progress_bar = get_glade_widget("xrun_progress_bar"); g_buffer_size_combo = get_glade_widget("buffer_size_combo"); g_menu_item_new_studio = get_glade_widget("menu_item_new_studio"); + g_menu_item_start_studio = get_glade_widget("menu_item_start_studio"); + g_menu_item_stop_studio = get_glade_widget("menu_item_stop_studio"); g_menu_item_save_studio = get_glade_widget("menu_item_save_studio"); g_menu_item_unload_studio = get_glade_widget("menu_item_unload_studio"); g_menu_item_rename_studio = get_glade_widget("menu_item_rename_studio"); @@ -574,6 +602,8 @@ int main(int argc, char** argv) g_signal_connect(G_OBJECT(g_clear_load_button), "clicked", G_CALLBACK(clear_load), NULL); g_signal_connect(G_OBJECT(get_glade_widget("menu_item_view_arrange")), "activate", G_CALLBACK(arrange), NULL); g_signal_connect(G_OBJECT(g_menu_item_new_studio), "activate", G_CALLBACK(new_studio), NULL); + g_signal_connect(G_OBJECT(g_menu_item_start_studio), "activate", G_CALLBACK(start_studio), NULL); + g_signal_connect(G_OBJECT(g_menu_item_stop_studio), "activate", G_CALLBACK(stop_studio), NULL); g_signal_connect(G_OBJECT(g_menu_item_unload_studio), "activate", G_CALLBACK(unload_studio), NULL); g_signal_connect(G_OBJECT(g_menu_item_save_studio), "activate", G_CALLBACK(save_studio), NULL); g_signal_connect(G_OBJECT(g_menu_item_rename_studio), "activate", G_CALLBACK(rename_studio), NULL); diff --git a/ladish_control b/ladish_control index ccca8a84..0e742121 100755 --- a/ladish_control +++ b/ladish_control @@ -108,6 +108,8 @@ def main(): print " ssave - save studio" print " sunload - unload studio" print " srename - rename studio" + print " sstart - start studio" + print " sstop - stop studio" sys.exit(0) bus = dbus.SessionBus() @@ -205,6 +207,12 @@ def main(): index += 1 studio_iface.Rename(arg) + elif arg == 'sstart': + print "--- studio start" + studio_iface.Start() + elif arg == 'sstop': + print "--- studio stop" + studio_iface.Stop() else: print "Unknown command '%s'" % arg except dbus.DBusException, e: diff --git a/studio_proxy.c b/studio_proxy.c index decb8f3d..f8daf04d 100644 --- a/studio_proxy.c +++ b/studio_proxy.c @@ -30,10 +30,14 @@ #include "dbus/helpers.h" static void (* g_renamed_callback)(const char * new_studio_name) = NULL; +static void (* g_started_callback)(void) = NULL; +static void (* g_stopped_callback)(void) = NULL; static const char * g_signals[] = { "StudioRenamed", + "StudioStarted", + "StudioStopped", "RoomAppeared", "RoomDisappeared", NULL @@ -70,6 +74,30 @@ static DBusHandlerResult message_hook(DBusConnection * connection, DBusMessage * return DBUS_HANDLER_RESULT_HANDLED; } + if (dbus_message_is_signal(message, IFACE_STUDIO, "StudioStarted")) + { + lash_info("StudioStarted"); + + if (g_started_callback != NULL) + { + g_started_callback(); + } + + return DBUS_HANDLER_RESULT_HANDLED; + } + + if (dbus_message_is_signal(message, IFACE_STUDIO, "StudioStopped")) + { + lash_info("StudioStopped"); + + if (g_stopped_callback != NULL) + { + g_stopped_callback(); + } + + return DBUS_HANDLER_RESULT_HANDLED; + } + if (dbus_message_is_signal(message, IFACE_STUDIO, "RoomAppeared")) { lash_info("RoomAppeared"); @@ -155,3 +183,19 @@ void studio_proxy_set_renamed_callback(void (* callback)(const char * new_studio { g_renamed_callback = callback; } + +void studio_proxy_set_startstop_callbacks(void (* started_callback)(void), void (* stopped_callback)(void)) +{ + g_started_callback = started_callback; + g_stopped_callback = stopped_callback; +} + +bool studio_proxy_start(void) +{ + return dbus_call_simple(SERVICE_NAME, STUDIO_OBJECT_PATH, IFACE_STUDIO, "Start", "", ""); +} + +bool studio_proxy_stop(void) +{ + return dbus_call_simple(SERVICE_NAME, STUDIO_OBJECT_PATH, IFACE_STUDIO, "Stop", "", ""); +} diff --git a/studio_proxy.h b/studio_proxy.h index 3c8107cd..1dc3002d 100644 --- a/studio_proxy.h +++ b/studio_proxy.h @@ -36,4 +36,8 @@ bool studio_proxy_save(void); bool studio_proxy_unload(void); void studio_proxy_set_renamed_callback(void (* callback)(const char * new_studio_name)); +void studio_proxy_set_startstop_callbacks(void (* started_callback)(void), void (* stopped_callback)(void)); +bool studio_proxy_start(void); +bool studio_proxy_stop(void); + #endif /* #ifndef STUDIO_PROXY_H__2CEC623F_C998_4618_A947_D1A0016DF978__INCLUDED */