def connect(self, server=None):
        """Connect to pulseaudio server.

        :Parameters:
            `server` : str
                Server to connect to, or ``None`` for the default local
                server (which may be spawned as a daemon if no server is
                found).
        """
        # TODO disconnect from old
        assert not self._context, 'Already connected'

        # Create context
        app_name = self.get_app_name()
        self._context = pa.pa_context_new(self.mainloop, app_name.encode('ASCII'))

        # Context state callback
        self._state_cb_func = pa.pa_context_notify_cb_t(self._state_cb)
        pa.pa_context_set_state_callback(self._context,
                                         self._state_cb_func, None)

        # Connect
        check(
            pa.pa_context_connect(self._context, server, 0, None)
        )

        with self.lock:
            check(
                pa.pa_threaded_mainloop_start(self.threaded_mainloop)
            )
            # Wait for context ready.
            self.wait()
            if pa.pa_context_get_state(self._context) != pa.PA_CONTEXT_READY:
                check(-1)
 def _state_cb(self, context, userdata):
     if _debug:
         print('context state cb')
     state = pa.pa_context_get_state(self._context)
     if state in (pa.PA_CONTEXT_READY,
                  pa.PA_CONTEXT_TERMINATED,
                  pa.PA_CONTEXT_FAILED):
         self.signal()