Studio start/stop commands and signals
This commit is contained in:
parent
00de237ebd
commit
7f5855f6ba
112
daemon/studio.c
112
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
|
||||
|
|
|
@ -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>
|
||||
|
|
30
gui/main.c
30
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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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", "", "");
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue