Studio start/stop commands and signals

This commit is contained in:
Nedko Arnaudov 2009-08-30 22:40:28 +03:00
parent 00de237ebd
commit 7f5855f6ba
6 changed files with 226 additions and 16 deletions

View File

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

View File

@ -51,6 +51,50 @@
</child>
</widget>
</child>
<child>
<widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="menu_item_start_studio">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Start Studio</property>
<property name="use_underline">True</property>
<accelerator key="F5" modifiers="" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="menu-item-image15">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-media-play</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="menu_item_stop_studio">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label" translatable="yes">Stop Studio</property>
<property name="use_underline">True</property>
<accelerator key="F6" modifiers="" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="menu-item-image13">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="stock">gtk-media-stop</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkSeparatorMenuItem" id="separatormenuitem2">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="menu_item_rename_studio">
<property name="visible">True</property>

View File

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

View File

@ -108,6 +108,8 @@ def main():
print " ssave - save studio"
print " sunload - unload studio"
print " srename <studioname> - 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:

View File

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

View File

@ -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 */