static void lmc_schedule_idle(void) { GIOChannel *channel; assert(idle_source_id == 0); assert(g_mpd != NULL); idle_notified = false; enum mpd_idle mask = MPD_IDLE_PLAYER; #if LIBMPDCLIENT_CHECK_VERSION(2,5,0) if (subscribed) mask |= MPD_IDLE_MESSAGE; #endif if (!mpd_send_idle_mask(g_mpd, mask)) { lmc_failure(); lmc_schedule_reconnect(); return; } /* add a GLib watch on the libmpdclient socket */ channel = g_io_channel_unix_new(mpd_connection_get_fd(g_mpd)); idle_source_id = g_io_add_watch(channel, G_IO_IN, lmc_idle, NULL); g_io_channel_unref(channel); }
gboolean mpd_connect(void) { mpd.conn = mpd_connection_new(prefs.mpd_server, prefs.mpd_port, 10000); mpd.idle_source = 0; if (mpd_connection_get_error(mpd.conn) != MPD_ERROR_SUCCESS) { g_warning("Failed to connect to MPD: %s", mpd_connection_get_error_message(mpd.conn)); return FALSE; } else if (mpd_connection_cmp_server_version(mpd.conn, 0, 14, 0) < 0) { g_critical("MPD too old, please upgrade to 0.14 or newer"); return FALSE; } else { GIOChannel *channel; mpd_command_list_begin(mpd.conn, TRUE); if (prefs.mpd_password) mpd_send_password(mpd.conn, prefs.mpd_password); mpd_send_status(mpd.conn); mpd_send_current_song(mpd.conn); mpd_command_list_end(mpd.conn); mpd.status = mpd_recv_status(mpd.conn); if (!mpd_response_next(mpd.conn)) { mpd_report_error(); return FALSE; } mpd.song = mpd_recv_song(mpd.conn); if (!mpd_response_finish(mpd.conn)) { mpd_report_error(); return FALSE; } g_message("Connected to MPD"); irc_say("Connected to MPD"); mpd_send_idle_mask(mpd.conn, MPD_IDLE_PLAYER); channel = g_io_channel_unix_new( mpd_connection_get_fd(mpd.conn)); mpd.idle_source = g_io_add_watch(channel, G_IO_IN, (GIOFunc) mpd_parse, NULL); g_io_channel_unref(channel); return TRUE; } }
void Connection::Connect() { assert(!m_connection); try { m_connection.reset(mpd_connection_new(m_host.c_str(), m_port, m_timeout * 1000)); checkErrors(); if (!m_password.empty()) SendPassword(); m_fd = mpd_connection_get_fd(m_connection.get()); checkErrors(); } catch (MPD::ClientError &e) { Disconnect(); throw e; } }