summaryrefslogtreecommitdiffstats
path: root/paman.cc
diff options
context:
space:
mode:
Diffstat (limited to 'paman.cc')
-rw-r--r--paman.cc78
1 files changed, 47 insertions, 31 deletions
diff --git a/paman.cc b/paman.cc
index 6fb0d88..0c1741d 100644
--- a/paman.cc
+++ b/paman.cc
@@ -16,30 +16,52 @@ ServerInfoManager *serverInfoManager = NULL;
struct pa_context *context = NULL;
struct pa_mainloop_api *mainloop_api = NULL;
-static void context_complete_callback(struct pa_context *c, int success, void *userdata) {
- g_assert(c && mainWindow && !serverInfoManager);
-
- if (!success) {
- mainWindow->showFailure(pa_strerror(pa_context_errno(c)));
- //pa_context_free(context); /* Mrprmfmfl! */
+static void context_state_callback(struct pa_context *c, void *userdata) {
+ g_assert(c && mainWindow);
+
+ switch (pa_context_get_state(c)) {
+ case PA_CONTEXT_CONNECTING:
+ mainWindow->showSuccess("Connecting ...");
+ mainWindow->connectButton->set_sensitive(false);
+ return;
+
+ case PA_CONTEXT_AUTHORIZING:
+ mainWindow->showSuccess("Authorizing ...");
+ return;
+
+ case PA_CONTEXT_SETTING_NAME:
+ mainWindow->showSuccess("Setting name ...");
+ return;
+
+ case PA_CONTEXT_READY:
+ mainWindow->showSuccess("Ready");
+ g_assert(!serverInfoManager);
+ serverInfoManager = new ServerInfoManager(*c);
+ return;
+
+ case PA_CONTEXT_TERMINATED:
+ mainWindow->showSuccess("Disconnected");
+ break;
+
+ case PA_CONTEXT_FAILED:
+ default:
+ mainWindow->showFailure(pa_strerror(pa_context_errno(c)));
+ break;
+
+ }
+
+ if (context) {
+ pa_context_unref(context);
context = NULL;
- mainWindow->connectButton->set_sensitive(true);
- return;
}
- mainWindow->showSuccess("Connected");
- mainWindow->connectButton->set_sensitive(false);
- serverInfoManager = new ServerInfoManager(*c);
-}
-
-static void die_callback(struct pa_context *c, void *userdata) {
- mainWindow->clearAllData();
- mainWindow->showFailure(pa_strerror(pa_context_errno(c)));
- delete serverInfoManager;
- serverInfoManager = NULL;
- //pa_context_free(contetx); /* Mrprmfmfl! */
- context = NULL;
+ if (serverInfoManager) {
+ delete serverInfoManager;
+ serverInfoManager = NULL;
+ }
+
mainWindow->connectButton->set_sensitive(true);
+ mainWindow->clearAllData();
}
void create_connection() {
@@ -47,22 +69,16 @@ void create_connection() {
delete serverInfoManager;
serverInfoManager = NULL;
}
+
if (context) {
- pa_context_free(context);
+ pa_context_unref(context);
context = NULL;
}
- mainWindow->showSuccess("Connecting ...");
context = pa_context_new(mainloop_api, "Polypaudio Manager");
g_assert(context);
- pa_context_set_die_callback(context, die_callback, NULL);
-
- if (pa_context_connect(context, NULL, context_complete_callback, NULL) < 0) {
- context_complete_callback(context, 0, NULL);
- return;
- }
-
- mainWindow->connectButton->set_sensitive(false);
+ pa_context_set_state_callback(context, context_state_callback, NULL);
+ pa_context_connect(context, NULL);
}
int main(int argc, char *argv[]) {
@@ -89,7 +105,7 @@ quit:
delete serverInfoManager;
if (context)
- pa_context_free(context);
+ pa_context_unref(context);
mainloop_api = NULL;
if (mainWindow)