denon: Add Qt6 support

This commit is contained in:
Simon Stürz 2025-08-07 16:22:29 +02:00
parent 783a785838
commit e673a6fcea
4 changed files with 115 additions and 108 deletions

View File

@ -41,8 +41,13 @@ AvrConnection::AvrConnection(const QHostAddress &hostAddress, const int &port, Q
connect(m_socket, &QTcpSocket::connected, this, &AvrConnection::onConnected);
connect(m_socket, &QTcpSocket::disconnected, this, &AvrConnection::onDisconnected);
connect(m_socket, &QTcpSocket::readyRead, this, &AvrConnection::readData);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
connect(m_socket, &QTcpSocket::errorOccurred, this, &AvrConnection::onError);
#else
// Note: error signal will be interpreted as function, not as signal in C++11
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
#endif
m_commandTimer = new QTimer(this);
m_commandTimer->start(50); // 50ms is the minimum request interval specified
@ -157,20 +162,20 @@ QUuid AvrConnection::sendCommand(const QByteArray &message)
QUuid AvrConnection::setChannel(const QByteArray &channel)
{
QByteArray cmd = "SI" + channel + "\r";
qCDebug(dcDenon) << "Change to channel:" << channel;
qCDebug(dcDenon()) << "Change to channel:" << channel;
return sendCommand(cmd);
}
QUuid AvrConnection::setVolume(uint volume)
{
qCDebug(dcDenon) << "Set volume" << volume;
qCDebug(dcDenon()) << "Set volume" << volume;
QByteArray cmd = "MV" + QByteArray::number(volume) + "\r";
return sendCommand(cmd);
}
QUuid AvrConnection::setMute(bool mute)
{
qCDebug(dcDenon) << "Set mute" << mute;
qCDebug(dcDenon()) << "Set mute" << mute;
QByteArray cmd;
if (mute) {
cmd = "MUON\r";
@ -182,7 +187,7 @@ QUuid AvrConnection::setMute(bool mute)
QUuid AvrConnection::setPower(bool power)
{
qCDebug(dcDenon) << "Set power" << power;
qCDebug(dcDenon()) << "Set power" << power;
QByteArray cmd;
if (power) {
cmd = "PWON\r";
@ -194,7 +199,7 @@ QUuid AvrConnection::setPower(bool power)
QUuid AvrConnection::setSurroundMode(const QByteArray &surroundMode)
{
qCDebug(dcDenon) << "Set surround mode" << surroundMode;
qCDebug(dcDenon()) << "Set surround mode" << surroundMode;
QByteArray cmd = "MS" + surroundMode + "\r";
return sendCommand(cmd);
}
@ -298,33 +303,33 @@ QUuid AvrConnection::setRepeat(AvrConnection::RepeatMode mode)
QUuid AvrConnection::increaseVolume()
{
qCDebug(dcDenon) << "Execute volume increase";
qCDebug(dcDenon()) << "Execute volume increase";
QByteArray cmd = "MVUP\r";
return sendCommand(cmd);
}
QUuid AvrConnection::decreaseVolume()
{
qCDebug(dcDenon) << "Execute volume decrease";
qCDebug(dcDenon()) << "Execute volume decrease";
QByteArray cmd = "MVDOWN\r";
return sendCommand(cmd);
}
void AvrConnection::onConnected()
{
qCDebug(dcDenon) << "connected successfully to" << hostAddress().toString() << port();
qCDebug(dcDenon()) << "connected successfully to" << hostAddress().toString() << port();
emit connectionStatusChanged(true);
}
void AvrConnection::onDisconnected()
{
qCDebug(dcDenon) << "disconnected from" << hostAddress().toString() << port();
qCDebug(dcDenon()) << "disconnected from" << hostAddress().toString() << port();
emit connectionStatusChanged(false);
}
void AvrConnection::onError(QAbstractSocket::SocketError socketError)
{
qCWarning(dcDenon) << "socket error:" << socketError << m_socket->errorString();
qCWarning(dcDenon()) << "socket error:" << socketError << m_socket->errorString();
emit socketErrorOccured(socketError);
}
@ -337,7 +342,7 @@ void AvrConnection::readData()
if(line.isEmpty())
continue;
qCDebug(dcDenon) << "Data received" << line;
qCDebug(dcDenon()) << "Data received" << line;
if (line.contains("MV") && !data.contains("MAX")){
int index = data.indexOf("MV");
int volume = data.mid(index+2, 2).toInt();

View File

@ -1,8 +1,6 @@
include(../plugins.pri)
QT += network
TARGET = $$qtLibraryTarget(nymea_integrationplugindenon)
QT *= network
SOURCES += \
integrationplugindenon.cpp \

View File

@ -50,7 +50,11 @@ Heos::Heos(const QHostAddress &hostAddress, QObject *parent) :
connect(m_socket, &QTcpSocket::connected, this, &Heos::onConnected);
connect(m_socket, &QTcpSocket::disconnected, this, &Heos::onDisconnected);
connect(m_socket, &QTcpSocket::readyRead, this, &Heos::readData);
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
connect(m_socket, &QTcpSocket::errorOccurred, this, &Heos::onError);
#else
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
#endif
m_reconnectTimer = new QTimer(this);
m_reconnectTimer->setInterval(5000);
@ -113,7 +117,7 @@ void Heos::registerForChangeEvents(bool state)
query = "?enable=off";
}
QByteArray cmd = "heos://system/register_for_change_events" + query + "\r\n";
qCDebug(dcDenon) << "Register for change events:" << cmd;
qCDebug(dcDenon()) << "Register for change events:" << cmd;
m_socket->write(cmd);
}
@ -164,35 +168,35 @@ void Heos::prettifyJsonResponse(bool enable)
void Heos::playNext(int playerId)
{
QByteArray cmd = "heos://player/play_next?pid=" + QVariant(playerId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Play next:" << cmd;
qCDebug(dcDenon()) << "Play next:" << cmd;
m_socket->write(cmd);
}
void Heos::playPrevious(int playerId)
{
QByteArray cmd = "heos://player/play_previous?pid=" + QVariant(playerId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Play previous:" << cmd;
qCDebug(dcDenon()) << "Play previous:" << cmd;
m_socket->write(cmd);
}
void Heos::volumeUp(int playerId, int step)
{
QByteArray cmd = "heos://player/volume_up?pid=" + QVariant(playerId).toByteArray() + "&step=" + QVariant(step).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Volume up:" << cmd;
qCDebug(dcDenon()) << "Volume up:" << cmd;
m_socket->write(cmd);
}
void Heos::volumeDown(int playerId, int step)
{
QByteArray cmd = "heos://player/volume_down?pid=" + QVariant(playerId).toByteArray() + "&step=" + QVariant(step).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Volume down:" << cmd;
qCDebug(dcDenon()) << "Volume down:" << cmd;
m_socket->write(cmd);
}
void Heos::clearQueue(int playerId)
{
QByteArray cmd = "heos://player/clear_queue?pid=" + QVariant(playerId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "clear queue:" << cmd;
qCDebug(dcDenon()) << "clear queue:" << cmd;
m_socket->write(cmd);
}
@ -203,16 +207,16 @@ void Heos::moveQueue(int playerId, int sourcQueueId, int destinationQueueId)
queryParams.addQueryItem("pid", QString::number(playerId));
queryParams.addQueryItem("sqid", QString::number(sourcQueueId));
queryParams.addQueryItem("dqid", QString::number(destinationQueueId));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "moving queue:" << cmd;
qCDebug(dcDenon()) << "moving queue:" << cmd;
m_socket->write(cmd);
}
void Heos::checkForFirmwareUpdate(int playerId)
{
QByteArray cmd = "heos://player/check_update?pid=" + QVariant(playerId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Check firmware update:" << cmd;
qCDebug(dcDenon()) << "Check firmware update:" << cmd;
m_socket->write(cmd);
}
void Heos::getNowPlayingMedia(int playerId)
@ -230,7 +234,7 @@ void Heos::getPlayers()
void Heos::getPlayerInfo(int playerId)
{
QByteArray cmd = "heos://player/get_player_info?pid=" + QVariant(playerId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Get player info:" << cmd;
qCDebug(dcDenon()) << "Get player info:" << cmd;
m_socket->write(cmd);
}
@ -243,7 +247,7 @@ void Heos::getVolume(int playerId)
void Heos::setVolume(int playerId, int volume)
{
QByteArray cmd = "heos://player/set_volume?pid=" + QVariant(playerId).toByteArray() + "&level=" + QVariant(volume).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Set volume:" << cmd;
qCDebug(dcDenon()) << "Set volume:" << cmd;
m_socket->write(cmd);
}
@ -262,7 +266,7 @@ void Heos::setMute(int playerId, bool state)
stateQuery = "&state=off";
}
QByteArray cmd = "heos://player/set_mute?pid=" + QVariant(playerId).toByteArray() + stateQuery + "\r\n";
qCDebug(dcDenon) << "Set mute:" << cmd;
qCDebug(dcDenon()) << "Set mute:" << cmd;
m_socket->write(cmd);
}
@ -279,7 +283,7 @@ void Heos::setPlayerState(int playerId, PLAYER_STATE state)
}
QByteArray cmd = "heos://player/set_play_state?pid=" + QVariant(playerId).toByteArray() + playerStateQuery + "\r\n";
qCDebug(dcDenon) << "Set play mode:" << cmd;
qCDebug(dcDenon()) << "Set play mode:" << cmd;
m_socket->write(cmd);
}
@ -310,7 +314,7 @@ void Heos::setPlayMode(int playerId, REPEAT_MODE repeatMode, bool shuffle)
}
QByteArray cmd = "heos://player/set_play_mode?pid=" + QVariant(playerId).toByteArray() + repeatModeQuery + shuffleQuery + "\r\n";
qCDebug(dcDenon) << "Set play mode:" << cmd;
qCDebug(dcDenon()) << "Set play mode:" << cmd;
m_socket->write(cmd);
}
@ -357,7 +361,7 @@ void Heos::getGroupMute(int groupId)
void Heos::setGroupVolume(int groupId, bool volume)
{
QByteArray cmd = "heos://group/set_volume?gid=" + QVariant(groupId).toByteArray() + "&level=" + QVariant(volume).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Volume up:" << cmd;
qCDebug(dcDenon()) << "Volume up:" << cmd;
m_socket->write(cmd);
}
@ -381,28 +385,28 @@ void Heos::setGroup(QList<int> playerIds)
}
cmd.resize(cmd.size()-1); //remove last ','
cmd.append("\r\n");
qCDebug(dcDenon) << "Set group:" << cmd;
qCDebug(dcDenon()) << "Set group:" << cmd;
m_socket->write(cmd);
}
void Heos::toggleGroupMute(int groupId)
{
QByteArray cmd = "heos://group/toggle_mute?gid=" + QVariant(groupId).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Volume up:" << cmd;
qCDebug(dcDenon()) << "Volume up:" << cmd;
m_socket->write(cmd);
}
void Heos::groupVolumeUp(int groupId, int step)
{
QByteArray cmd = "heos://group/volume_up?pid=" + QVariant(groupId).toByteArray() + "&step=" + QVariant(step).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Group volume up:" << cmd;
qCDebug(dcDenon()) << "Group volume up:" << cmd;
m_socket->write(cmd);
}
void Heos::groupVolumeDown(int groupId, int step)
{
QByteArray cmd = "heos://group/volume_down?pid=" + QVariant(groupId).toByteArray() + "&step=" + QVariant(step).toByteArray() + "\r\n";
qCDebug(dcDenon) << "Group volume up:" << cmd;
qCDebug(dcDenon()) << "Group volume up:" << cmd;
m_socket->write(cmd);
}
@ -416,9 +420,9 @@ quint32 Heos::getMusicSources()
QByteArray cmd = "heos://browse/get_music_sources?";
QUrlQuery queryParams;
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Get music sources:" << cmd;
qCDebug(dcDenon()) << "Get music sources:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -430,9 +434,9 @@ quint32 Heos::getSourceInfo(const QString &sourceId)
QUrlQuery queryParams;
queryParams.addQueryItem("sid", sourceId);
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Get source info:" << cmd;
qCDebug(dcDenon()) << "Get source info:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -443,9 +447,9 @@ quint32 Heos::getSearchCriteria(const QString &sourceId)
QByteArray cmd = "heos://browse/get_search_criteria?";
QUrlQuery queryParams;
queryParams.addQueryItem("sid", sourceId);
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Get search criteria:" << cmd;
qCDebug(dcDenon()) << "Get search criteria:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -457,9 +461,9 @@ quint32 Heos::browseSource(const QString &sourceId)
QUrlQuery queryParams;
queryParams.addQueryItem("sid", sourceId);
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Browse source:" << cmd;
qCDebug(dcDenon()) << "Browse source:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -472,9 +476,9 @@ quint32 Heos::browseSourceContainers(const QString &sourceId, const QString &con
queryParams.addQueryItem("sid", sourceId);
queryParams.addQueryItem("cid", containerId);
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Browsing container:" << cmd;
qCDebug(dcDenon()) << "Browsing container:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -498,9 +502,9 @@ quint32 Heos::playStation(int playerId, const QString &sourceId, const QString &
queryParams.addQueryItem("name", stationName);
}
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "playing station:" << cmd;
qCDebug(dcDenon()) << "playing station:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -513,9 +517,9 @@ quint32 Heos::playPresetStation(int playerId, int presetNumber)
queryParams.addQueryItem("pid", QString::number(playerId));
queryParams.addQueryItem("preset", QString::number(presetNumber));
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "playing preset station:" << cmd;
qCDebug(dcDenon()) << "playing preset station:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -528,9 +532,9 @@ quint32 Heos::playInputSource(int playerId, const QString &inputName)
queryParams.addQueryItem("pid", QString::number(playerId));
queryParams.addQueryItem("input", inputName);
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "playing input source:" << cmd;
qCDebug(dcDenon()) << "playing input source:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -543,9 +547,9 @@ quint32 Heos::playUrl(int playerId, const QUrl &mediaUrl)
queryParams.addQueryItem("pid", QString::number(playerId));
queryParams.addQueryItem("url", mediaUrl.toString());
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "playing url:" << cmd;
qCDebug(dcDenon()) << "playing url:" << cmd;
m_socket->write(cmd);
return sequence;
}
@ -574,16 +578,16 @@ quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const Q
queryParams.addQueryItem("cid", containerId);
queryParams.addQueryItem("aid", QString::number(addCriteria));
queryParams.addQueryItem("SEQUENCE", QString::number(sequence));
cmd.append(queryParams.toString());
cmd.append(queryParams.toString().toUtf8());
cmd.append("\r\n");
qCDebug(dcDenon) << "Adding to queue:" << cmd;
qCDebug(dcDenon()) << "Adding to queue:" << cmd;
m_socket->write(cmd);
return sequence;
}
void Heos::onError(QAbstractSocket::SocketError socketError)
{
qCWarning(dcDenon) << "Heos: Socket error:" << socketError << m_socket->errorString();
qCWarning(dcDenon()) << "Heos: Socket error:" << socketError << m_socket->errorString();
}
void Heos::readData()
@ -595,7 +599,7 @@ void Heos::readData()
data = m_socket->readLine();
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qCWarning(dcDenon) << "failed to parse json :" << error.errorString();
qCWarning(dcDenon()) << "failed to parse json :" << error.errorString();
return;
}
QVariantMap dataMap = jsonDoc.toVariant().toMap();
@ -627,18 +631,18 @@ void Heos::readData()
if (command.contains("register_for_change_events")) {
QString enabled = message.queryItemValue("enabled");
if (enabled.contains("off")) {
qDebug(dcDenon) << "Events are disabled";
qCDebug(dcDenon()) << "Events are disabled";
m_eventRegistered = false;
emit systemEventsEnabled(false);
} else {
qDebug(dcDenon) << "Events are enabled";
qCDebug(dcDenon()) << "Events are enabled";
m_eventRegistered = true;
emit systemEventsEnabled(true);
}
} else if (command.contains("check_account")) {
qDebug(dcDenon()) << "System command check_account:" << message.toString();
qCDebug(dcDenon()) << "System command check_account:" << message.toString();
bool signedIn;
QString username = "";
if (message.hasQueryItem("signed_in")){
@ -651,7 +655,7 @@ void Heos::readData()
} else if (command.contains("sign_in")) {
qDebug(dcDenon()) << "System command sign_in:" << message.toString();
qCDebug(dcDenon()) << "System command sign_in:" << message.toString();
if (message.hasQueryItem("signed_in")) {
QString username = message.queryItemValue("un");
@ -660,7 +664,7 @@ void Heos::readData()
} // otherwise it will be command under process and we will wait for the event
} else if (command.contains("sign_out")) {
qDebug(dcDenon()) << "System command sign_out:" << message.toString();
qCDebug(dcDenon()) << "System command sign_out:" << message.toString();
emit userChanged(false, "");
} else if (command.contains("heart_beat")) {
@ -670,7 +674,7 @@ void Heos::readData()
} else if (command.contains("prettify_json_response")) {
} else {
qDebug(dcDenon) << "Unhandled Heos system command" << command;
qCDebug(dcDenon()) << "Unhandled Heos system command" << command;
}
/* 4.2 Player Commands
* 4.2.1 Get Players
@ -743,7 +747,7 @@ void Heos::readData()
QString artwork = dataMap.value("payload").toMap().value("image_url").toString();
QString album = dataMap.value("payload").toMap().value("album").toString();
QString sourceId = dataMap.value("payload").toMap().value("sid").toString();
qDebug(dcDenon) << "Now playing" << playerId << sourceId << artist << album << song;
qCDebug(dcDenon()) << "Now playing" << playerId << sourceId << artist << album << song;
emit nowPlayingMediaStatusReceived(playerId, sourceId, artist, album, song, artwork);
} else if (command.contains("get_play_state") || command.contains("set_play_state")) {
@ -797,7 +801,7 @@ void Heos::readData()
bool updateExist = payloadVariantMap.value("update").toString().contains("exist");
emit playerUpdateAvailable(playerId, updateExist);
} else {
qDebug(dcDenon) << "Unhandled Heos group command" << command;
qCDebug(dcDenon()) << "Unhandled Heos group command" << command;
}
/*
* 4.3 Group Commands
@ -815,7 +819,7 @@ void Heos::readData()
} else if (command.startsWith("group")) {
int groupId = 0;
if (message.hasQueryItem("gid")) {
qDebug(dcDenon) << "Group id" << message.queryItemValue("gid");
qCDebug(dcDenon()) << "Group id" << message.queryItemValue("gid");
groupId = message.queryItemValue("gid").toInt();
}
if (command.contains("get_groups")) {
@ -887,7 +891,7 @@ void Heos::readData()
} else if (command.contains("toggle_mute")) {
} else {
qDebug(dcDenon) << "Unhandled Heos group command" << command;
qCDebug(dcDenon()) << "Unhandled Heos group command" << command;
}
@ -912,12 +916,12 @@ void Heos::readData()
quint32 sequenceNumber = 0;
if (message.hasQueryItem("SEQUENCE")) {
qDebug(dcDenon) << "Sequence number" << message.queryItemValue("SEQUENCE");
qCDebug(dcDenon()) << "Sequence number" << message.queryItemValue("SEQUENCE");
sequenceNumber = message.queryItemValue("SEQUENCE").toUInt();
}
if (command.contains("get_music_sources") || command.contains("get_source_info")) {
qDebug(dcDenon()) << "Get music source request response received" << command;
qCDebug(dcDenon()) << "Get music source request response received" << command;
QVariantList payloadVariantList = jsonDoc.toVariant().toMap().value("payload").toList();
QList<MusicSourceObject> musicSources;
if (success) {
@ -935,7 +939,7 @@ void Heos::readData()
}
} else if (command.contains("browse/browse")) {
qDebug(dcDenon()) << "Browse response:" << jsonDoc.toVariant().toMap().value("payload");
qCDebug(dcDenon()) << "Browse response:" << jsonDoc.toVariant().toMap().value("payload");
QVariantList payloadVariantList = jsonDoc.toVariant().toMap().value("payload").toList();
QString sourceId;
QString containerId;
@ -947,7 +951,7 @@ void Heos::readData()
}
if (message.toString().contains("command under process")){
qDebug(dcDenon()) << "Browse command is beeing processed";
qCDebug(dcDenon()) << "Browse command is beeing processed";
return;
}
if (success) {
@ -961,13 +965,13 @@ void Heos::readData()
source.image_url = payloadEntryVariant.toMap().value("image_url").toString();
source.type = payloadEntryVariant.toMap().value("type").toString();
source.sourceId = payloadEntryVariant.toMap().value("sid").toInt();
qDebug(dcDenon()) << "Source" << source.name << source.type << source.sourceId << payloadEntryVariant.toMap().value("sid");
qCDebug(dcDenon()) << "Source" << source.name << source.type << source.sourceId << payloadEntryVariant.toMap().value("sid");
//source.available = payloadEntryVariant.toMap().value("available").toString().contains("true");
//source.serviceUsername = payloadEntryVariant.toMap().value("service_username").toString();
musicSources.append(source);
} else {
MediaObject media;
qDebug(dcDenon()) << "Media Item" << payloadEntryVariant.toMap().value("mid").toString() << payloadEntryVariant.toMap().value("cid").toString();
qCDebug(dcDenon()) << "Media Item" << payloadEntryVariant.toMap().value("mid").toString() << payloadEntryVariant.toMap().value("cid").toString();
media.name = payloadEntryVariant.toMap().value("name").toString();
if (payloadEntryVariant.toMap().contains("cid")) {
media.containerId = payloadEntryVariant.toMap().value("cid").toString();
@ -1016,7 +1020,7 @@ void Heos::readData()
} else if (command.contains("retrieve_metadata")) {
} else {
qDebug(dcDenon) << "Unhandled Heos browse command" << command;
qCDebug(dcDenon()) << "Unhandled Heos browse command" << command;
}
@ -1046,7 +1050,7 @@ void Heos::readData()
emit groupsChanged();
} else if (command.contains("player_state_changed")) {
qDebug(dcDenon()) << "Player state changed";
qCDebug(dcDenon()) << "Player state changed";
if (message.hasQueryItem("pid")) {
int playerId = message.queryItemValue("pid").toInt();
if (message.hasQueryItem("state")) {
@ -1062,13 +1066,13 @@ void Heos::readData()
}
}
} else if (command.contains("player_now_playing_changed")) {
qDebug(dcDenon()) << "Player now playing changed, player id:" << message.queryItemValue("pid").toInt();
qCDebug(dcDenon()) << "Player now playing changed, player id:" << message.queryItemValue("pid").toInt();
if (message.hasQueryItem("pid")) {
int playerId = message.queryItemValue("pid").toInt();
emit playerNowPlayingChanged(playerId);
}
} else if (command.contains("player_now_playing_progress")) {
//qDebug(dcDenon()) << "Player now playing progress";
//qCDebug(dcDenon()) << "Player now playing progress";
if (message.hasQueryItem("pid")) {
int playerId = message.queryItemValue("pid").toInt();
int currentPossition = message.queryItemValue("cur_pos").toInt();
@ -1076,7 +1080,7 @@ void Heos::readData()
emit playerNowPlayingProgressReceived(playerId, currentPossition, duration);
}
} else if (command.contains("player_playback_error")) {
qDebug(dcDenon) << "Player playback error";
qCDebug(dcDenon()) << "Player playback error";
int playerId = 0;
if (message.hasQueryItem("pid")) {
playerId = message.queryItemValue("pid").toInt();
@ -1084,14 +1088,14 @@ void Heos::readData()
emit playerPlaybackErrorReceived(playerId, errorMessage);
}
} else if (command.contains("player_queue_changed")) {
qDebug(dcDenon()) << "Player queue Changed";
qCDebug(dcDenon()) << "Player queue Changed";
int playerId = 0;
if (message.hasQueryItem("pid")) {
playerId = message.queryItemValue("pid").toInt();
emit playerQueueChanged(playerId);
}
} else if (command.contains("player_volume_changed")) {
qDebug(dcDenon()) << "Event player volume Changed";
qCDebug(dcDenon()) << "Event player volume Changed";
int playerId = 0;
if (message.hasQueryItem("pid")) {
playerId = message.queryItemValue("pid").toInt();
@ -1111,7 +1115,7 @@ void Heos::readData()
}
}
} else if (command.contains("repeat_mode_changed")) {
qDebug(dcDenon()) << "Repeat mode Changed";
qCDebug(dcDenon()) << "Repeat mode Changed";
int playerId = 0;
if (message.hasQueryItem("pid")) {
playerId = message.queryItemValue("pid").toInt();
@ -1129,7 +1133,7 @@ void Heos::readData()
}
}
} else if (command.contains("shuffle_mode_changed")) {
qDebug(dcDenon()) << "Shuffle mode Changed";
qCDebug(dcDenon()) << "Shuffle mode Changed";
int playerId = 0;
if (message.hasQueryItem("pid")) {
playerId = message.queryItemValue("pid").toInt();
@ -1145,7 +1149,7 @@ void Heos::readData()
}
}
} else if (command.contains("group_volume_changed")) {
qDebug(dcDenon()) << "Event group volume Changed";
qCDebug(dcDenon()) << "Event group volume Changed";
int playerId = 0;
if (message.hasQueryItem("gid")) {
playerId = message.queryItemValue("gid").toInt();
@ -1166,7 +1170,7 @@ void Heos::readData()
}
} else if (command.contains("user_changed")) {
qDebug(dcDenon()) << "Event user changed" << message.toString();
qCDebug(dcDenon()) << "Event user changed" << message.toString();
bool signedIn;
QString username;
if (message.hasQueryItem("signed_out")){
@ -1177,10 +1181,10 @@ void Heos::readData()
}
emit userChanged(signedIn, username);
} else {
qDebug(dcDenon) << "Unhandled Heos event";
qCDebug(dcDenon()) << "Unhandled Heos event";
}
} else {
qDebug(dcDenon) << "Unhandled Heos category" << command;
qCDebug(dcDenon()) << "Unhandled Heos category" << command;
}
}
}

View File

@ -90,7 +90,7 @@ void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info)
QString id = service.name().split("@").first();
QString name = service.name().split("@").last();
QString address = service.hostAddress().toString();
qCDebug(dcDenon) << "service discovered" << name << "ID:" << id;
qCDebug(dcDenon()) << "service discovered" << name << "ID:" << id;
if (discoveredIds.contains(id))
break;
discoveredIds.append(id);
@ -135,7 +135,7 @@ void IntegrationPluginDenon::discoverThings(ThingDiscoveryInfo *info)
foreach (const UpnpDeviceDescriptor &upnpThing, reply->deviceDescriptors()) {
if (upnpThing.modelName().contains("HEOS", Qt::CaseSensitivity::CaseInsensitive) && upnpThing.serialNumber() != "0000001") {
// child things have serial number 0000001
qCDebug(dcDenon) << "uPnP thing found:" << upnpThing.modelDescription() << upnpThing.friendlyName() << upnpThing.hostAddress().toString() << upnpThing.modelName() << upnpThing.manufacturer() << upnpThing.serialNumber();
qCDebug(dcDenon()) << "uPnP thing found:" << upnpThing.modelDescription() << upnpThing.friendlyName() << upnpThing.hostAddress().toString() << upnpThing.modelName() << upnpThing.manufacturer() << upnpThing.serialNumber();
m_heosIpAddresses.insert(upnpThing.serialNumber(), upnpThing.hostAddress());
ThingDescriptor descriptor(heosThingClassId, upnpThing.modelName(), upnpThing.serialNumber());
@ -206,7 +206,7 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info)
Thing *thing = info->thing();
if (thing->thingClassId() == AVRX1000ThingClassId) {
qCDebug(dcDenon) << "Setup AVR X1000 thing" << thing->name();
qCDebug(dcDenon()) << "Setup AVR X1000 thing" << thing->name();
if (m_avrConnections.contains(thing->id())) {
qCDebug(dcDenon()) << "Setup after reconfiguration, cleaning up ...";
@ -251,10 +251,10 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info)
return;
} else if (thing->thingClassId() == heosThingClassId) {
qCDebug(dcDenon) << "Setup Heos connection thing" << thing->name();
qCDebug(dcDenon()) << "Setup Heos connection thing" << thing->name();
QString serialnumber = thing->paramValue(heosThingSerialNumberParamTypeId).toString();
if (serialnumber.isEmpty()) {
qCWarning(dcDenon) << "Serial number is empty";
qCWarning(dcDenon()) << "Serial number is empty";
info->finish(Thing::ThingErrorInvalidParameter, QT_TR_NOOP("Serial number is not set"));
return;
}
@ -312,7 +312,7 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info)
}
} else if (thing->thingClassId() == heosPlayerThingClassId) {
qCDebug(dcDenon) << "Setup Heos player" << thing->name();
qCDebug(dcDenon()) << "Setup Heos player" << thing->name();
Thing *parentThing = myThings().findById(thing->parentId());
if (!parentThing) {
qCWarning(dcDenon()) << "Parent thing not found for Heos player" << thing->name();
@ -334,7 +334,7 @@ void IntegrationPluginDenon::setupThing(ThingSetupInfo *info)
void IntegrationPluginDenon::thingRemoved(Thing *thing)
{
qCDebug(dcDenon) << "Delete " << thing->name();
qCDebug(dcDenon()) << "Delete " << thing->name();
if (thing->thingClassId() == AVRX1000ThingClassId) {
if (m_avrConnections.contains(thing->id())) {
@ -361,7 +361,7 @@ void IntegrationPluginDenon::executeAction(ThingActionInfo *info)
Thing *thing = info->thing();
Action action = info->action();
qCDebug(dcDenon) << "Execute action" << thing->id() << action.params();
qCDebug(dcDenon()) << "Execute action" << thing->id() << action.params();
if (thing->thingClassId() == AVRX1000ThingClassId) {
AvrConnection *avrConnection = m_avrConnections.value(thing->id());
@ -944,7 +944,7 @@ void IntegrationPluginDenon::onHeosPlayersReceived(QList<HeosPlayer *> heosPlaye
params.append(Param(heosPlayerThingSerialNumberParamTypeId, player->serialNumber()));
params.append(Param(heosPlayerThingVersionParamTypeId, player->playerVersion()));
descriptor.setParams(params);
qCDebug(dcDenon) << "Found new heos player" << player->name();
qCDebug(dcDenon()) << "Found new heos player" << player->name();
heosPlayerDescriptors.append(descriptor);
}
if (!heosPlayerDescriptors.isEmpty())
@ -969,7 +969,7 @@ void IntegrationPluginDenon::onHeosPlayersReceived(QList<HeosPlayer *> heosPlaye
void IntegrationPluginDenon::onHeosPlayerInfoRecieved(HeosPlayer *heosPlayer)
{
qDebug(dcDenon()) << "Heos player info received" << heosPlayer->name() << heosPlayer->playerId() << heosPlayer->groupId();
qCDebug(dcDenon()) << "Heos player info received" << heosPlayer->name() << heosPlayer->playerId() << heosPlayer->groupId();
m_playerBuffer.insert(heosPlayer->playerId(), heosPlayer);
}
@ -1110,7 +1110,7 @@ void IntegrationPluginDenon::onHeosMusicSourcesReceived(quint32 sequenceNumber,
} else {
item.setThumbnail(source.image_url);
}
qDebug(dcDenon()) << "Music source received:" << source.name << source.type << source.sourceId << source.image_url;
qCDebug(dcDenon()) << "Music source received:" << source.name << source.type << source.sourceId << source.image_url;
}
result->finish(Thing::ThingErrorNoError);
}
@ -1141,7 +1141,7 @@ void IntegrationPluginDenon::onHeosBrowseRequestReceived(quint32 sequenceNumber,
foreach(MediaObject media, mediaItems) {
MediaBrowserItem item;
item.setIcon(BrowserItem::BrowserIconMusic);
qDebug(dcDenon()) << "Adding Item" << media.name << media.mediaId << media.containerId << media.mediaType;
qCDebug(dcDenon()) << "Adding Item" << media.name << media.mediaId << media.containerId << media.mediaType;
item.setDisplayName(media.name);
if (media.mediaType == MEDIA_TYPE_CONTAINER) {
item.setId("container=" + media.containerId + "&" + sourceId);
@ -1158,7 +1158,7 @@ void IntegrationPluginDenon::onHeosBrowseRequestReceived(quint32 sequenceNumber,
foreach(MusicSourceObject source, musicSources) {
MediaBrowserItem item;
item.setDisplayName(source.name);
qDebug(dcDenon()) << "Adding Item" << source.name << source.sourceId;
qCDebug(dcDenon()) << "Adding Item" << source.name << source.sourceId;
item.setId("source=" + QString::number(source.sourceId));
item.setIcon(BrowserItem::BrowserIconMusic);
item.setExecutable(false);
@ -1209,7 +1209,7 @@ void IntegrationPluginDenon::onHeosBrowseRequestReceived(quint32 sequenceNumber,
}
result->finish(Thing::ThingErrorNoError);
} else {
qWarning(dcDenon()) << "Pending browser result doesnt recognize" << identifier << m_pendingBrowseResult.keys();
qCWarning(dcDenon()) << "Pending browser result doesnt recognize" << identifier << m_pendingBrowseResult.keys();
}
}
@ -1224,7 +1224,7 @@ void IntegrationPluginDenon::onHeosBrowseErrorReceived(const QString &sourceId,
if (m_pendingBrowseResult.contains(identifier)) {
BrowseResult *result = m_pendingBrowseResult.take(identifier);
qWarning(dcDenon) << "Browse error" << errorMessage << errorId;
qCWarning(dcDenon()) << "Browse error" << errorMessage << errorId;
result->finish(Thing::ThingErrorHardwareFailure, errorMessage);
}
}
@ -1323,7 +1323,7 @@ void IntegrationPluginDenon::browseThing(BrowseResult *result)
}
if (result->itemId().isEmpty()) {
qDebug(dcDenon()) << "Browse source";
qCDebug(dcDenon()) << "Browse source";
MediaBrowserItem item;
item.setId("type=group");
item.setIcon(BrowserItem::BrowserIcon::BrowserIconPackage);
@ -1341,7 +1341,7 @@ void IntegrationPluginDenon::browseThing(BrowseResult *result)
if (itemQuery.hasQueryItem("group")) {
//TBD list players in groups
} else {
qDebug(dcDenon()) << "Browse source" << result->itemId();
qCDebug(dcDenon()) << "Browse source" << result->itemId();
int pid = result->thing()->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt();
HeosPlayer *browsingPlayer = m_playerBuffer.value(pid);
foreach (GroupObject group, m_groupBuffer) {
@ -1362,7 +1362,7 @@ void IntegrationPluginDenon::browseThing(BrowseResult *result)
}
foreach (HeosPlayer *player, m_playerBuffer.values()) {
qDebug(dcDenon) << "Adding group item" << player->name();
qCDebug(dcDenon()) << "Adding group item" << player->name();
if (browsingPlayer->playerId() == player->playerId()) { //player is the current browsing thing
continue;
}
@ -1384,14 +1384,14 @@ void IntegrationPluginDenon::browseThing(BrowseResult *result)
}
} else if (result->itemId().startsWith("source=")){
qDebug(dcDenon()) << "Browse source" << result->itemId();
qCDebug(dcDenon()) << "Browse source" << result->itemId();
QString id = result->itemId().remove("source=");
heos->browseSource(id);
m_pendingBrowseResult.insert(id, result);
connect(result, &QObject::destroyed, this, [this, id](){ m_pendingBrowseResult.remove(id);});
} else if (result->itemId().startsWith("container=")){
qDebug(dcDenon()) << "Browse container" << result->itemId();
qCDebug(dcDenon()) << "Browse container" << result->itemId();
QStringList values = result->itemId().split("&");
if (values.length() == 2) {
QString id = values[0].remove("container=");
@ -1413,7 +1413,7 @@ void IntegrationPluginDenon::browserItem(BrowserItemResult *result)
result->finish(Thing::ThingErrorHardwareNotAvailable);
return;
}
qDebug(dcDenon()) << "Browse item called" << result->itemId();
qCDebug(dcDenon()) << "Browse item called" << result->itemId();
result->item().setDisplayName("Test name");
if (m_mediaObjects.contains(result->itemId())) {
@ -1435,7 +1435,7 @@ void IntegrationPluginDenon::executeBrowserItem(BrowserActionInfo *info)
}
BrowserAction action = info->browserAction();
int playerId = info->thing()->paramValue(heosPlayerThingPlayerIdParamTypeId).toInt();
qDebug(dcDenon()) << "Execute browse item called. Player Id:" << playerId << "Item ID" << action.itemId();
qCDebug(dcDenon()) << "Execute browse item called. Player Id:" << playerId << "Item ID" << action.itemId();
if (m_mediaObjects.contains(action.itemId())) {
MediaObject media = m_mediaObjects.value(action.itemId());
@ -1445,7 +1445,7 @@ void IntegrationPluginDenon::executeBrowserItem(BrowserActionInfo *info)
heos->playStation(playerId, media.sourceId, media.containerId, media.mediaId, media.name);
}
} else {
qWarning(dcDenon()) << "Media item not found" << action.itemId();
qCWarning(dcDenon()) << "Media item not found" << action.itemId();
}
info->finish(Thing::ThingErrorNoError);
@ -1470,7 +1470,7 @@ void IntegrationPluginDenon::executeBrowserItemAction(BrowserItemActionInfo *inf
} else if(query.hasQueryItem("group")) {
GroupObject group = m_groupBuffer.value(query.queryItemValue("group").toInt());
qDebug(dcDenon()) << "Execute browse item action called, Group:" << query.queryItemValue("group").toInt() << group.name;
qCDebug(dcDenon()) << "Execute browse item action called, Group:" << query.queryItemValue("group").toInt() << group.name;
QList<int> playerIds;
foreach(PlayerObject player, group.players) {
playerIds.append(player.playerId);