Пример #1
0
bool
mpd_recv_queue_change_brief(struct mpd_connection *connection,
			    unsigned *position_r, unsigned *id_r)
{
	struct mpd_pair *pair;

	pair = mpd_recv_pair_named(connection, "cpos");
	if (pair == NULL)
		return false;

	*position_r = atoi(pair->value);
	mpd_return_pair(connection, pair);

	pair = mpd_recv_pair_named(connection, "Id");
	if (pair == NULL) {
		mpd_return_pair(connection, pair);

		if (!mpd_error_is_defined(&connection->error)) {
			mpd_error_code(&connection->error,
				       MPD_ERROR_MALFORMED);
			mpd_error_message(&connection->error,
					  "No id received");
		}

		return false;
	}

	*id_r = atoi(pair->value);
	mpd_return_pair(connection, pair);

	return !mpd_error_is_defined(&connection->error);
}
struct mpd_playlist *
mpd_recv_playlist(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	struct mpd_playlist *playlist;

	pair = mpd_recv_pair_named(connection, "playlist");
	if (pair == NULL)
		return NULL;

	playlist = mpd_playlist_begin(pair);
	mpd_return_pair(connection, pair);
	if (playlist == NULL) {
		mpd_error_code(&connection->error, MPD_ERROR_OOM);
		return NULL;
	}

	while ((pair = mpd_recv_pair(connection)) != NULL &&
	       mpd_playlist_feed(playlist, pair))
		mpd_return_pair(connection, pair);

	if (mpd_error_is_defined(&connection->error)) {
		assert(pair == NULL);

		mpd_playlist_free(playlist);
		return NULL;
	}

	/* unread this pair for the next mpd_recv_playlist() call */
	mpd_enqueue_pair(connection, pair);

	return playlist;
}
Пример #3
0
struct mpd_entity *
mpd_recv_entity(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	struct mpd_entity *entity;

	pair = mpd_recv_pair(connection);
	if (pair == NULL)
		return NULL;

	entity = mpd_entity_begin(pair);
	mpd_return_pair(connection, pair);
	if (entity == NULL) {
		mpd_error_entity(&connection->error);
		return NULL;
	}

	while ((pair = mpd_recv_pair(connection)) != NULL &&
	       mpd_entity_feed(entity, pair))
		mpd_return_pair(connection, pair);

	if (mpd_error_is_defined(&connection->error)) {
		mpd_entity_free(entity);
		return NULL;
	}

	/* unread this pair for the next mpd_recv_entity() call */
	mpd_enqueue_pair(connection, pair);

	return entity;
}
Пример #4
0
struct mpd_directory *
mpd_recv_directory(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	struct mpd_directory *directory;

	pair = mpd_recv_pair_named(connection, "directory");
	if (pair == NULL)
		return NULL;

	directory = mpd_directory_begin(pair);
	mpd_return_pair(connection, pair);
	if (directory == NULL) {
		mpd_error_entity(&connection->error);
		return NULL;
	}

	while ((pair = mpd_recv_pair(connection)) != NULL &&
	       mpd_directory_feed(directory, pair))
		mpd_return_pair(connection, pair);

	if (mpd_error_is_defined(&connection->error)) {
		assert(pair == NULL);

		mpd_directory_free(directory);
		return NULL;
	}

	/* unread this pair for the next mpd_recv_directory() call */
	mpd_enqueue_pair(connection, pair);

	return directory;
}
Пример #5
0
struct mpd_song *
mpd_recv_song(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	struct mpd_song *song;

	pair = mpd_recv_pair_named(connection, "file");
	if (pair == NULL)
		return NULL;

	song = mpd_song_begin(pair);
	mpd_return_pair(connection, pair);
	if (song == NULL) {
		mpd_error_entity(&connection->error);
		return NULL;
	}

	while ((pair = mpd_recv_pair(connection)) != NULL &&
	       mpd_song_feed(song, pair))
		mpd_return_pair(connection, pair);

	if (mpd_error_is_defined(&connection->error)) {
		mpd_song_free(song);
		return NULL;
	}

	/* unread this pair for the next mpd_recv_song() call */
	mpd_enqueue_pair(connection, pair);

	return song;
}
Пример #6
0
int
cmd_replaygain(int argc, char **argv, struct mpd_connection *connection)
{
	/* libmpdclient 2.0 doesn't support these commands yet, we
	   have to roll our own with mpd_send_command() */

	if (mpd_connection_cmp_server_version(connection, 0, 16, 0) < 0)
		fprintf(stderr, "warning: MPD 0.16 required for this command\n");

	if (argc == 0) {
		struct mpd_pair *pair;

		mpd_send_command(connection, "replay_gain_status", NULL);
		while ((pair = mpd_recv_pair(connection)) != NULL) {
			printf("%s: %s\n", pair->name, pair->value);
			mpd_return_pair(connection, pair);
		}

		my_finishCommand(connection);
	} else {
		mpd_send_command(connection, "replay_gain_mode",
				 argv[0], NULL);
		my_finishCommand(connection);
	}

	return 0;
}
Пример #7
0
int mpd_list_artists()
{
    int num = 0;

    mpd_search_db_tags(mpd.conn, MPD_TAG_ARTIST);
    if (!mpd_search_commit(mpd.conn)) {
        syslog(LOG_DEBUG, "%s: search_commit error\n", __func__);
        return 0;
    }

    struct mpd_pair *pair;
    while ((pair = mpd_recv_pair_tag(mpd.conn, MPD_TAG_ARTIST)) != NULL) {
        syslog(LOG_DEBUG, "%s: %s\n", __func__, pair->value);
        mpd_return_pair(mpd.conn, pair);
        num++;
    }

    if (!mpd_response_finish(mpd.conn)) {
        syslog(LOG_DEBUG, "%s: error\n", __func__);
        return 0;
    }

    syslog(LOG_DEBUG, "%s: found %i\n", __func__, num);
    return num;
}
Пример #8
0
/* mpd functions */
bool Mpd::update(mpd_tag_type type, const char *value) {
    mpd_pair *pair;
    album.clear();

    if (!mpd_search_db_tags(conn, MPD_TAG_ALBUM)) { err(); return false; }

    if (strcmp(value, "") != 0)
        if (!mpd_search_add_tag_constraint(conn, MPD_OPERATOR_DEFAULT, type, value)) { err(); return false; }

    if (!mpd_search_commit(conn)) { err(); return false; }

    while ((pair = mpd_recv_pair_tag(conn, MPD_TAG_ALBUM)) != NULL) {
        album.push_back(Album(pair->value));
        mpd_return_pair(conn, pair);
    }

    if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) { err(); return false; }

    if (!mpd_response_finish(conn)) { err(); return false; }

    cout << "Successful Update" << endl;
    for (std::vector<Album>::iterator i = album.begin(); i != album.end(); ++i)
        i->buildTags();
    sys->sortAlbums(MPD_TAG_UNKNOWN);
    for (std::vector<Album>::iterator i = album.begin(); i != album.end(); ++i)
        i->build();
    return true;
}
Пример #9
0
bool Connection::AddRandomSongs(size_t number)
{
	prechecksNoCommandsList();
	std::vector<std::string> files;
	mpd_send_list_all(m_connection.get(), "/");
	while (mpd_pair *item = mpd_recv_pair_named(m_connection.get(), "file"))
	{
		files.push_back(item->value);
		mpd_return_pair(m_connection.get(), item);
	}
	mpd_response_finish(m_connection.get());
	checkErrors();
	
	if (number > files.size())
	{
		//if (itsErrorHandler)
		//	itsErrorHandler(this, 0, "Requested number of random songs is bigger than size of your library", itsErrorHandlerUserdata);
		return false;
	}
	else
	{
		std::random_shuffle(files.begin(), files.end());
		StartCommandsList();
		auto it = files.begin()+rand()%(std::max(size_t(1), files.size()-number));
		for (size_t i = 0; i < number && it != files.end(); ++i, ++it)
			AddSong(*it);
		CommitCommandsList();
	}
	return true;
}
Пример #10
0
int
cmd_list(int argc, char **argv, struct mpd_connection *conn)
{
	enum mpd_tag_type type = get_search_type(argv[0]);
	if (type == MPD_TAG_UNKNOWN)
		return -1;

	--argc;
	++argv;

	mpd_search_db_tags(conn, type);

	if (argc > 0 && !add_constraints(argc, argv, conn))
		return -1;

	if (!mpd_search_commit(conn))
		printErrorAndExit(conn);

	struct mpd_pair *pair;
	while ((pair = mpd_recv_pair_tag(conn, type)) != NULL) {
		printf("%s\n", charset_from_utf8(pair->value));
		mpd_return_pair(conn, pair);
	}

	my_finishCommand(conn);
	return 0;
}
Пример #11
0
struct mpd_stats *
mpd_recv_stats(struct mpd_connection *connection)
{
	struct mpd_stats * stats;
	struct mpd_pair *pair;

	assert(connection != NULL);

	if (mpd_error_is_defined(&connection->error))
		/* refuse to receive a response if the connection's
		   state is not clean */
		return NULL;

	stats = mpd_stats_begin();
	if (stats == NULL) {
		mpd_error_code(&connection->error, MPD_ERROR_OOM);
		return NULL;
	}

	/* read and parse all response lines */
	while ((pair = mpd_recv_pair(connection)) != NULL) {
		mpd_stats_feed(stats, pair);
		mpd_return_pair(connection, pair);
	}

	if (mpd_error_is_defined(&connection->error)) {
		/* an error has occurred; roll back */
		mpd_stats_free(stats);
		return NULL;
	}

	return stats;
}
Пример #12
0
struct mpd_message *
mpd_recv_message(struct mpd_connection *connection)
{
	struct mpd_message *message;
	struct mpd_pair *pair;

	pair = mpd_recv_pair_named(connection, "channel");
	if (pair == NULL)
		return NULL;

	message = mpd_message_begin(pair);
	mpd_return_pair(connection, pair);
	if (message == NULL) {
		mpd_error_code(&connection->error, MPD_ERROR_OOM);
		return NULL;
	}

	while ((pair = mpd_recv_pair(connection)) != NULL &&
	       mpd_message_feed(message, pair))
		mpd_return_pair(connection, pair);

	if (mpd_error_is_defined(&connection->error)) {
		assert(pair == NULL);

		mpd_message_free(message);
		return NULL;
	}

	mpd_enqueue_pair(connection, pair);

	if (mpd_message_get_text(message) == NULL) {
		mpd_error_code(&connection->error, MPD_ERROR_MALFORMED);
		mpd_error_message(&connection->error,
				  "No 'message' line received");
		mpd_message_free(message);
		return NULL;
	}

	return message;
}
Пример #13
0
std::string Connection::GetReplayGainMode()
{
	prechecksNoCommandsList();
	mpd_send_command(m_connection.get(), "replay_gain_status", NULL);
	std::string result;
	if (mpd_pair *pair = mpd_recv_pair_named(m_connection.get(), "replay_gain_mode"))
	{
		result = pair->value;
		mpd_return_pair(m_connection.get(), pair);
	}
	mpd_response_finish(m_connection.get());
	checkErrors();
	return result;
}
Пример #14
0
struct mpd_pair *
mpd_recv_pair_named(struct mpd_connection *connection, const char *name)
{
	struct mpd_pair *pair;

	while ((pair = mpd_recv_pair(connection)) != NULL) {
		if (strcmp(pair->name, name) == 0)
			return pair;

		mpd_return_pair(connection, pair);
	}

	return NULL;
}
Пример #15
0
int
mpd_recv_song_id(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	int id = -1;

	pair = mpd_recv_pair_named(connection, "Id");
	if (pair != NULL) {
		id = atoi(pair->value);
		mpd_return_pair(connection, pair);
	}

	return id;
}
Пример #16
0
unsigned
mpd_recv_update_id(struct mpd_connection *connection)
{
	struct mpd_pair *pair;
	int ret = 0;

	pair = mpd_recv_pair_named(connection, "updating_db");
	if (pair != NULL) {
		ret = atoi(pair->value);
		mpd_return_pair(connection, pair);
	}

	return ret;
}
Пример #17
0
StringIterator Connection::GetSupportedExtensions()
{
	prechecksNoCommandsList();
	mpd_send_command(m_connection.get(), "decoders", NULL);
	checkErrors();
	return StringIterator(m_connection.get(), [](StringIterator::State &state) {
		auto src = mpd_recv_pair_named(state.connection(), "suffix");
		if (src != nullptr)
		{
			state.setObject(src->value);
			mpd_return_pair(state.connection(), src);
			return true;
		}
		else
			return false;
	});
}
Пример #18
0
StringIterator Connection::GetURLHandlers()
{
	prechecksNoCommandsList();
	mpd_send_list_url_schemes(m_connection.get());
	checkErrors();
	return StringIterator(m_connection.get(), [](StringIterator::State &state) {
		auto src = mpd_recv_pair_named(state.connection(), "handler");
		if (src != nullptr)
		{
			state.setObject(src->value);
			mpd_return_pair(state.connection(), src);
			return true;
		}
		else
			return false;
	});
}
Пример #19
0
StringIterator Connection::GetList(mpd_tag_type type)
{
	prechecksNoCommandsList();
	mpd_search_db_tags(m_connection.get(), type);
	mpd_search_commit(m_connection.get());
	checkErrors();
	return StringIterator(m_connection.get(), [type](StringIterator::State &state) {
		auto src = mpd_recv_pair_tag(state.connection(), type);
		if (src != nullptr)
		{
			state.setObject(src->value);
			mpd_return_pair(state.connection(), src);
			return true;
		}
		else
			return false;
	});
}
Пример #20
0
Файл: path.c Проект: GGbaba/mpc
bool
path_prepare(struct mpd_connection *conn)
{
	if (initialized)
		return true;

	initialized = true;

	if (mpd_connection_cmp_server_version(conn, 0, 17, 0) < 0)
		/* the "config" command was added in MPD 0.17.1 */
		return true;

	if (!mpd_send_command(conn, "config", NULL))
		return false;

	struct mpd_pair *pair = mpd_recv_pair_named(conn, "music_directory");
	if (pair != NULL) {
		music_directory = strdup(pair->value);
		mpd_return_pair(conn, pair);
	}

	return mpd_response_finish(conn) || mpd_connection_clear_error(conn);
}
Пример #21
0
int
cmd_replaygain(int argc, char **argv, struct mpd_connection *connection)
{
	/* libmpdclient 2.0 doesn't support these commands yet, we
	   have to roll our own with mpd_send_command() */

	if (argc == 0) {
		mpd_send_command(connection, "replay_gain_status", NULL);

		struct mpd_pair *pair;
		while ((pair = mpd_recv_pair(connection)) != NULL) {
			printf("%s: %s\n", pair->name, pair->value);
			mpd_return_pair(connection, pair);
		}

		my_finishCommand(connection);
	} else {
		mpd_send_command(connection, "replay_gain_mode",
				 argv[0], NULL);
		my_finishCommand(connection);
	}

	return 0;
}
Пример #22
0
void TopWidget::updateAlbumList()
{
	albumList.clear();
	albumList << "(Any)";
	mpdconfirm(mpd_search_db_tags(mpd, MPD_TAG_ALBUM));
	if (selectedArtist != "(Any)")
		mpd_search_add_tag_constraint(mpd, MPD_OPERATOR_DEFAULT, MPD_TAG_ARTIST, selectedArtist.toUtf8().constData());
	mpd_search_commit(mpd);
	mpd_pair * mp;
	while((mp = mpd_recv_pair_tag(mpd, MPD_TAG_ALBUM)) != NULL)
	{
		const QString album = mp->value;
		if (album != "")
			albumList << album;
		mpd_return_pair(mpd, mp);
	}
	albumListWidget->setModel(albumModel);
	albumModel->setStringList(albumList);
	parent->setTracks(Track::searchByArtist(selectedArtist));
	parent->playlistChanged = true;
	parent->trackView->update();
	parent->trackView->resetScroll();
	
}
Пример #23
0
/*
 * Retrieve available commands
 */
bool
Control::get_available_commands()
{
	mpd_pair * pair;

	EXIT_IDLE;

	if (!mpd_send_allowed_commands(conn->h())) {
		return false;
	}

	memset(&commands, 0, sizeof(commands));

	while ((pair = mpd_recv_command_pair(conn->h())) != NULL)
	{
		// FIXME: any other response is not expected
		assert(!strcmp(pair->name, "command"));

		if (!strcmp(pair->value, "add")) {
			commands.add = true;
		} else if (!strcmp(pair->value, "addid")) {
			commands.addid = true;
		} else if (!strcmp(pair->value, "clear")) {
			commands.clear = true;
		} else if (!strcmp(pair->value, "clearerror")) {
			commands.clearerror = true;
		} else if (!strcmp(pair->value, "close")) {
			commands.close = true;
		} else if (!strcmp(pair->value, "commands")) {
			commands.commands = true;
		} else if (!strcmp(pair->value, "consume")) {
			commands.commands = true;
		} else if (!strcmp(pair->value, "count")) {
			commands.count = true;
		} else if (!strcmp(pair->value, "crossfade")) {
			commands.crossfade = true;
		} else if (!strcmp(pair->value, "currentsong")) {
			commands.currentsong = true;
		} else if (!strcmp(pair->value, "delete")) {
			commands.delete_ = true;
		} else if (!strcmp(pair->value, "deleteid")) {
			commands.deleteid = true;
		} else if (!strcmp(pair->value, "disableoutput")) {
			commands.disableoutput = true;
		} else if (!strcmp(pair->value, "enableoutput")) {
			commands.enableoutput = true;
		} else if (!strcmp(pair->value, "find")) {
			commands.find = true;
		} else if (!strcmp(pair->value, "idle")) {
			commands.idle = true;
		} else if (!strcmp(pair->value, "kill")) {
			commands.kill = true;
		} else if (!strcmp(pair->value, "list")) {
			commands.list = true;
		} else if (!strcmp(pair->value, "listall")) {
			commands.listall = true;
		} else if (!strcmp(pair->value, "listallinfo")) {
			commands.listallinfo = true;
		} else if (!strcmp(pair->value, "listplaylist")) {
			commands.listplaylist = true;
		} else if (!strcmp(pair->value, "listplaylistinfo")) {
			commands.listplaylistinfo = true;
		} else if (!strcmp(pair->value, "listplaylists")) {
			commands.listplaylists = true;
		} else if (!strcmp(pair->value, "load")) {
			commands.load = true;
		} else if (!strcmp(pair->value, "lsinfo")) {
			commands.lsinfo = true;
		} else if (!strcmp(pair->value, "move")) {
			commands.move = true;
		} else if (!strcmp(pair->value, "moveid")) {
			commands.moveid = true;
		} else if (!strcmp(pair->value, "next")) {
			commands.next = true;
		} else if (!strcmp(pair->value, "notcommands")) {
			commands.notcommands = true;
		} else if (!strcmp(pair->value, "outputs")) {
			commands.outputs = true;
		} else if (!strcmp(pair->value, "password")) {
			commands.password = true;
		} else if (!strcmp(pair->value, "pause")) {
			commands.pause = true;
		} else if (!strcmp(pair->value, "ping")) {
			commands.ping = true;
		} else if (!strcmp(pair->value, "play")) {
			commands.play = true;
		} else if (!strcmp(pair->value, "playid")) {
			commands.playid = true;
		} else if (!strcmp(pair->value, "playlist")) {
			commands.playlist = true;
		} else if (!strcmp(pair->value, "playlistadd")) {
			commands.playlistadd = true;
		} else if (!strcmp(pair->value, "playlistclear")) {
			commands.playlistclear = true;
		} else if (!strcmp(pair->value, "playlistdelete")) {
			commands.playlistdelete = true;
		} else if (!strcmp(pair->value, "playlistfind")) {
			commands.playlistfind = true;
		} else if (!strcmp(pair->value, "playlistid")) {
			commands.playlistid = true;
		} else if (!strcmp(pair->value, "playlistinfo")) {
			commands.playlistinfo = true;
		} else if (!strcmp(pair->value, "playlistmove")) {
			commands.playlistmove = true;
		} else if (!strcmp(pair->value, "playlistsearch")) {
			commands.playlistsearch = true;
		} else if (!strcmp(pair->value, "plchanges")) {
			commands.plchanges = true;
		} else if (!strcmp(pair->value, "plchangesposid")) {
			commands.plchangesposid = true;
		} else if (!strcmp(pair->value, "previous")) {
			commands.previous = true;
		} else if (!strcmp(pair->value, "random")) {
			commands.random = true;
		} else if (!strcmp(pair->value, "rename")) {
			commands.rename = true;
		} else if (!strcmp(pair->value, "repeat")) {
			commands.repeat = true;
		} else if (!strcmp(pair->value, "single")) {
			commands.single = true;
		} else if (!strcmp(pair->value, "rm")) {
			commands.rm = true;
		} else if (!strcmp(pair->value, "save")) {
			commands.save = true;
		} else if (!strcmp(pair->value, "filter")) {
			commands.filter = true;
		} else if (!strcmp(pair->value, "seek")) {
			commands.seek = true;
		} else if (!strcmp(pair->value, "seekid")) {
			commands.seekid = true;
		} else if (!strcmp(pair->value, "setvol")) {
			commands.setvol = true;
		} else if (!strcmp(pair->value, "shuffle")) {
			commands.shuffle = true;
		} else if (!strcmp(pair->value, "stats")) {
			commands.stats = true;
		} else if (!strcmp(pair->value, "status")) {
			commands.status = true;
		} else if (!strcmp(pair->value, "stop")) {
			commands.stop = true;
		} else if (!strcmp(pair->value, "swap")) {
			commands.swap = true;
		} else if (!strcmp(pair->value, "swapid")) {
			commands.swapid = true;
		} else if (!strcmp(pair->value, "tagtypes")) {
			commands.tagtypes = true;
		} else if (!strcmp(pair->value, "update")) {
			commands.update = true;
		} else if (!strcmp(pair->value, "urlhandlers")) {
			commands.urlhandlers = true;
		} else if (!strcmp(pair->value, "volume")) {
			commands.volume = true;
		}

		mpd_return_pair(conn->h(), pair);
	}

	return get_error_bool();
}
Пример #24
0
int main(int argc, char ** argv) {
	struct mpd_connection *conn;

	conn = mpd_connection_new(NULL, 0, 30000);

	if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS)
		return handle_error(conn);

	{
		int i;
		for(i=0;i<3;i++) {
			printf("version[%i]: %i\n",i,
			       mpd_connection_get_server_version(conn)[i]);
		}
	}

	if(argc==1) {
		struct mpd_status * status;
		struct mpd_song *song;
		const struct mpd_audio_format *audio_format;

		mpd_command_list_begin(conn, true);
		mpd_send_status(conn);
		mpd_send_current_song(conn);
		mpd_command_list_end(conn);

		status = mpd_recv_status(conn);
		if (status == NULL)
			return handle_error(conn);

		printf("volume: %i\n", mpd_status_get_volume(status));
		printf("repeat: %i\n", mpd_status_get_repeat(status));
		printf("queue version: %u\n", mpd_status_get_queue_version(status));
		printf("queue length: %i\n", mpd_status_get_queue_length(status));
		if (mpd_status_get_error(status) != NULL)
			printf("error: %s\n", mpd_status_get_error(status));

		if (mpd_status_get_state(status) == MPD_STATE_PLAY ||
		    mpd_status_get_state(status) == MPD_STATE_PAUSE) {
			printf("song: %i\n", mpd_status_get_song_pos(status));
			printf("elaspedTime: %i\n",mpd_status_get_elapsed_time(status));
			printf("elasped_ms: %u\n", mpd_status_get_elapsed_ms(status));
			printf("totalTime: %i\n", mpd_status_get_total_time(status));
			printf("bitRate: %i\n", mpd_status_get_kbit_rate(status));
		}

		audio_format = mpd_status_get_audio_format(status);
		if (audio_format != NULL) {
			printf("sampleRate: %i\n", audio_format->sample_rate);
			printf("bits: %i\n", audio_format->bits);
			printf("channels: %i\n", audio_format->channels);
		}

		mpd_status_free(status);

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS)
			return handle_error(conn);

		mpd_response_next(conn);

		while ((song = mpd_recv_song(conn)) != NULL) {
			printf("uri: %s\n", mpd_song_get_uri(song));
			print_tag(song, MPD_TAG_ARTIST, "artist");
			print_tag(song, MPD_TAG_ALBUM, "album");
			print_tag(song, MPD_TAG_TITLE, "title");
			print_tag(song, MPD_TAG_TRACK, "track");
			print_tag(song, MPD_TAG_NAME, "name");
			print_tag(song, MPD_TAG_DATE, "date");

			if (mpd_song_get_duration(song) > 0) {
				printf("time: %u\n", mpd_song_get_duration(song));
			}

			printf("pos: %u\n", mpd_song_get_pos(song));

			mpd_song_free(song);
		}

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
		    !mpd_response_finish(conn))
			return handle_error(conn);
	}
	else if(argc==3 && strcmp(argv[1],"lsinfo")==0) {
		struct mpd_entity * entity;

		if (!mpd_send_list_meta(conn, argv[2]))
			return handle_error(conn);

		while ((entity = mpd_recv_entity(conn)) != NULL) {
			const struct mpd_song *song;
			const struct mpd_directory *dir;
			const struct mpd_playlist *pl;

			switch (mpd_entity_get_type(entity)) {
			case MPD_ENTITY_TYPE_UNKNOWN:
				break;

			case MPD_ENTITY_TYPE_SONG:
				song = mpd_entity_get_song(entity);
				printf("uri: %s\n", mpd_song_get_uri(song));
				print_tag(song, MPD_TAG_ARTIST, "artist");
				print_tag(song, MPD_TAG_ALBUM, "album");
				print_tag(song, MPD_TAG_TITLE, "title");
				print_tag(song, MPD_TAG_TRACK, "track");
				break;

			case MPD_ENTITY_TYPE_DIRECTORY:
				dir = mpd_entity_get_directory(entity);
				printf("directory: %s\n", mpd_directory_get_path(dir));
				break;

			case MPD_ENTITY_TYPE_PLAYLIST:
				pl = mpd_entity_get_playlist(entity);
				printf("playlist: %s\n",
				       mpd_playlist_get_path(pl));
				break;
			}

			mpd_entity_free(entity);
		}

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
		    !mpd_response_finish(conn))
			return handle_error(conn);
	}
	else if(argc==2 && strcmp(argv[1],"artists")==0) {
		struct mpd_pair *pair;

		if (!mpd_search_db_tags(conn, MPD_TAG_ARTIST) ||
		    !mpd_search_commit(conn))
			return handle_error(conn);

		while ((pair = mpd_recv_pair_tag(conn,
						 MPD_TAG_ARTIST)) != NULL) {
			printf("%s\n", pair->value);
			mpd_return_pair(conn, pair);
		}

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
		    !mpd_response_finish(conn))
			return handle_error(conn);
	} else if (argc == 2 && strcmp(argv[1], "playlists") == 0) {
		if (!mpd_send_list_playlists(conn))
			return handle_error(conn);

		struct mpd_playlist *playlist;
		while ((playlist = mpd_recv_playlist(conn)) != NULL) {
			printf("%s\n",
			       mpd_playlist_get_path(playlist));
			mpd_playlist_free(playlist);
		}

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
		    !mpd_response_finish(conn))
			return handle_error(conn);
	} else if (argc == 2 && strcmp(argv[1], "idle") == 0) {
		enum mpd_idle idle = mpd_run_idle(conn);
		if (idle == 0 &&
		    mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS)
			return handle_error(conn);

		for (unsigned j = 0;; ++j) {
			enum mpd_idle i = 1 << j;
			const char *name = mpd_idle_name(i);

			if (name == NULL)
				break;

			if (idle & i)
				printf("%s\n", name);
		}
	} else if (argc == 3 && strcmp(argv[1], "subscribe") == 0) {
		/* subscribe to a channel and print all messages */

		if (!mpd_run_subscribe(conn, argv[2]))
			return handle_error(conn);

		while (mpd_run_idle_mask(conn, MPD_IDLE_MESSAGE) != 0) {
			if (!mpd_send_read_messages(conn))
				return handle_error(conn);

			struct mpd_message *msg;
			while ((msg = mpd_recv_message(conn)) != NULL) {
				printf("%s\n", mpd_message_get_text(msg));
				mpd_message_free(msg);
			}

			if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
			    !mpd_response_finish(conn))
				return handle_error(conn);
		}

		return handle_error(conn);
	} else if (argc == 2 && strcmp(argv[1], "channels") == 0) {
		/* print a list of channels */

		if (!mpd_send_channels(conn))
			return handle_error(conn);

		struct mpd_pair *pair;
		while ((pair = mpd_recv_channel_pair(conn)) != NULL) {
			printf("%s\n", pair->value);
			mpd_return_pair(conn, pair);
		}

		if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS ||
		    !mpd_response_finish(conn))
			return handle_error(conn);
	} else if (argc == 4 && strcmp(argv[1], "message") == 0) {
		/* send a message to a channel */

		if (!mpd_run_send_message(conn, argv[2], argv[3]))
			return handle_error(conn);
	}

	mpd_connection_free(conn);

	return 0;
}
Пример #25
0
TopWidget::TopWidget(MainWindow * parent) : QWidget(parent)
{
	this->parent = parent;
	setMinimumWidth(300);
	setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);

	stopButton = new QToolButton();
	stopButton->setIcon(QIcon(DATAPATH "stop.png"));
	pauseButton = new QToolButton();
	pauseButton->setIcon(QIcon(DATAPATH "pause.png"));
	playButton = new QToolButton();
	playButton->setIcon(QIcon(DATAPATH "play.png"));
	prevButton = new QToolButton();
	prevButton->setIcon(QIcon(DATAPATH "prev.png"));
	nextButton = new QToolButton();
	nextButton->setIcon(QIcon(DATAPATH "next.png"));
	randomButton = new QToolButton();
	randomButton->setIcon(QIcon(DATAPATH "random.png"));
	libraryButton = new QToolButton();
	if(Settings::getLibraryFolded())
		libraryButton->setIcon(QIcon(DATAPATH "unfold.png"));
	else
		libraryButton->setIcon(QIcon(DATAPATH "fold.png"));

	trackBar = new Slider(parent);
	volumeBar = new Slider(parent);
	volumeBar->setMaximumWidth(70);
	volumeBar->setValue(100);
	volumeBar->style = 2;

	playModeBox = new QComboBox();
	playModeBox->setMaximumWidth(150);
	playModeBox->addItem("Normal");
	playModeBox->addItem("Loop All");
	playModeBox->addItem("Loop Track");
	playModeBox->addItem("Shuffle");

	grid = new QGridLayout();
	grid->addWidget(stopButton, 0, 0);
	grid->addWidget(pauseButton, 0, 1);
	grid->addWidget(playButton, 0, 2);
	grid->addWidget(prevButton, 0, 3);
	grid->addWidget(nextButton, 0, 4);
	grid->addWidget(randomButton, 0, 5);
	grid->addWidget(trackBar, 0, 6);
	grid->addWidget(playModeBox, 0, 7);
	grid->addWidget(volumeBar, 0, 8);
	grid->addWidget(libraryButton, 0, 9);
	grid->setContentsMargins(4, 4, 4, 4);

	connect(trackBar, SIGNAL(changed()), this, SLOT(onTrackBarChanged()));
	connect(volumeBar, SIGNAL(step()), this, SLOT(onVolumeBarChanged()));
	connect(pauseButton, SIGNAL(clicked()), this, SLOT(onPauseClick()));
	connect(playButton, SIGNAL(clicked()), this, SLOT(onPlayClick()));
	connect(stopButton, SIGNAL(clicked()), this, SLOT(onStopClick()));
	connect(prevButton, SIGNAL(clicked()), this, SLOT(onPrevClick()));
	connect(nextButton, SIGNAL(clicked()), this, SLOT(onNextClick()));
	connect(libraryButton, SIGNAL(clicked()), this, SLOT(onLibraryClick()));
	setLayout(grid);

	//Library View
	libraryWidget = new QWidget();
	libraryGrid = new QGridLayout();
	artistLabel = new QLabel("Artists: ");
	artistListWidget = new QListView();
	artistListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	artistModel = new QStringListModel();
	albumLabel = new QLabel("Albums: ");
	albumListWidget = new QListView();
	albumListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	albumModel = new QStringListModel();
	libraryGrid->addWidget(artistLabel, 1, 0);
	libraryGrid->addWidget(artistListWidget, 2, 0);
	libraryGrid->addWidget(albumLabel, 1, 1);
	libraryGrid->addWidget(albumListWidget, 2, 1);
	libraryGrid->setContentsMargins(0, 0, 0, 0);
	libraryWidget->setLayout(libraryGrid);
	if(Settings::getLibraryFolded())
		foldLibrary();
	else
		unfoldLibrary();

	artistList << "(Any)";
	mpdconfirm(mpd_search_db_tags(mpd, MPD_TAG_ARTIST));
	mpd_search_commit(mpd);
	mpd_pair * mp;
	while((mp = mpd_recv_pair_tag(mpd, MPD_TAG_ARTIST)) != NULL)
	{
		const QString artist = mp->value;
		if (artist != "")
			artistList << artist;
		mpd_return_pair(mpd, mp);
	}
	artistListWidget->setModel(artistModel);
	artistModel->setStringList(artistList);

	albumListWidget->setModel(albumModel);
	albumModel->setStringList(albumList);

	connect(artistListWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(onArtistSelectionChanged(QItemSelection)));
	connect(albumListWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(onAlbumSelectionChanged(QItemSelection)));

	artistListWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
	albumListWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
	selectedArtist = "(Any)";

}