+ /* Get the number of output channels from pulseaudio. A simple task, you say?\r
+ "What is your mainloop?" */\r
+ mainloop_ = pa_threaded_mainloop_new();\r
+ if (!mainloop_) {\r
+ return info;\r
+ }\r
+\r
+ pa_threaded_mainloop_start(mainloop_);\r
+ pa_threaded_mainloop_lock(mainloop_);\r
+\r
+ /* "And what is your context?" */\r
+ pa_context* context = pa_context_new(pa_threaded_mainloop_get_api(mainloop_), "RtAudio");\r
+ if (!context) {\r
+ pa_threaded_mainloop_unlock(mainloop_);\r
+ pa_threaded_mainloop_stop(mainloop_);\r
+ pa_threaded_mainloop_free(mainloop_);\r
+ mainloop_ = 0;\r
+ return info;\r
+ }\r
+\r
+ pa_context_set_state_callback(context, contextStateCallback, mainloop_);\r
+\r
+ pa_context_connect(context, 0, (pa_context_flags_t) 0, 0);\r
+\r
+ /* "And what is your favourite colour?" */\r
+ int connected = 0;\r
+ pa_context_state_t state = pa_context_get_state(context);\r
+ for (; !connected; state = pa_context_get_state(context)) {\r
+ switch (state) {\r
+ case PA_CONTEXT_READY:\r
+ connected = 1;\r
+ continue;\r
+ case PA_CONTEXT_FAILED:\r
+ case PA_CONTEXT_TERMINATED:\r
+ /* Blue! No, I mean red! */\r
+ pa_threaded_mainloop_unlock(mainloop_);\r
+ pa_context_disconnect(context);\r
+ pa_context_unref(context);\r
+ pa_threaded_mainloop_stop(mainloop_);\r
+ pa_threaded_mainloop_free(mainloop_);\r
+ mainloop_ = 0;\r
+ return info;\r
+ default:\r
+ pa_threaded_mainloop_wait(mainloop_);\r
+ break;\r
+ }\r
+ }\r
+\r
+ pa_operation* op = pa_context_get_sink_info_by_index(context, 0, sinkInfoCallback, this);\r
+\r
+ if (op) {\r
+ pa_operation_unref(op);\r
+ }\r
+\r
+ pa_threaded_mainloop_wait(mainloop_);\r
+ pa_threaded_mainloop_unlock(mainloop_);\r
+\r
+ pa_context_disconnect(context);\r
+ pa_context_unref(context);\r
+\r
+ pa_threaded_mainloop_stop(mainloop_);\r
+ pa_threaded_mainloop_free(mainloop_);\r
+ mainloop_ = 0;\r
+\r
+ info.outputChannels = channels_;\r
+\r