ocarina: Created thread-safe ocarina callbacks

I use the gdk threading functions to change my gtk code.  This should
create fewer UI inconsistencies whenever anything changes, and it should
also allow me to trigger TRACK_LOADED from a new gstreamer thread.

Signed-off-by: Bryan Schumaker <bjschuma@gmail.com>
This commit is contained in:
Bryan Schumaker 2012-01-21 22:07:43 -05:00
parent 7150e8bdee
commit 6b6b2814c3
2 changed files with 41 additions and 48 deletions

View File

@ -9,61 +9,48 @@
#include <ocarina/settings.h>
#include <ocarina/footer.h>
void cb_play()
void cb_handler(callback_t type)
{
println("Ocarina PLAY callback!");
hide_button_list(PLAY_BUTTON_LIST);
show_button_list(PAUSE_BUTTON_LIST);
}
libsaria::Track *current;
void cb_pause()
{
println("Ocarina PAUSE callback!");
hide_button_list(PAUSE_BUTTON_LIST);
show_button_list(PLAY_BUTTON_LIST);
}
gdk_threads_enter();
void cb_idle_task_queued()
{
println("Ocarina IDLE_TASK_QUEUED callback!");
ocarina::idle_add();
}
switch (type) {
case PLAY:
hide_button_list(PLAY_BUTTON_LIST);
show_button_list(PAUSE_BUTTON_LIST);
break;
case PAUSE:
hide_button_list(PAUSE_BUTTON_LIST);
show_button_list(PLAY_BUTTON_LIST);
break;
case IDLE_TASK_QUEUED:
ocarina::idle_add();
break;
case LIBRARY_REFRESH:
ocarina::library::refresh();
library_settings_refresh();
break;
case QUEUE_REFRESH:
ocarina::queue::refresh();
break;
case REFILTER:
ocarina::library::refilter();
break;
case TRACK_LOADED:
current = libsaria::current_track();
change_footer(current);
ocarina::library::scroll_to(current);
break;
default:
break;
}
void cb_library_refresh()
{
println("Ocarina LIBRARY_REFRESH callback!");
ocarina::library::refresh();
library_settings_refresh();
}
void cb_queue_refresh()
{
println("Ocarina QUEUE_REFRESH callback!");
ocarina::queue::refresh();
}
void cb_refilter()
{
println("Ocarina REFILTER callback!");
ocarina::library::refilter();
}
void cb_track_loaded()
{
println("Ocarina TRACK_LOADED callback!");
libsaria::Track *current = libsaria::current_track();
change_footer(current);
ocarina::library::scroll_to(current);
gdk_threads_leave();
}
void setup_callbacks()
{
println("Ocarina setting up callbacks");
register_callback(PLAY, cb_play);
register_callback(PAUSE, cb_pause);
register_callback(IDLE_TASK_QUEUED, cb_idle_task_queued);
register_callback(LIBRARY_REFRESH, cb_library_refresh);
register_callback(QUEUE_REFRESH, cb_queue_refresh);
register_callback(REFILTER, cb_refilter);
register_callback(TRACK_LOADED, cb_track_loaded);
set_cb_handler(cb_handler);
}

View File

@ -75,13 +75,19 @@ int main(int argc, char **argv)
libsaria::init(argc, argv);
setup_callbacks();
g_thread_init(NULL);
gdk_threads_init();
gtk_init(&argc, &argv);
ocarina::init(argc, argv);
if (argc > 1)
libsaria::audio::load(argv[1]);
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
libsaria::quit();
return 0;
}