From e95ff04808f13cb93b01be0a56f10bfb50ba087b Mon Sep 17 00:00:00 2001 From: "bernhard.trinnes" Date: Tue, 17 Mar 2020 12:08:24 +0100 Subject: [PATCH] fixed shuffle and repeat state --- bluos/bluos.cpp | 30 ++++++++++++++++++++ bluos/bluos.h | 3 ++ bluos/integrationpluginbluos.cpp | 47 ++++++++++++++++++++++++------- bluos/integrationpluginbluos.h | 3 +- bluos/integrationpluginbluos.json | 8 ++++++ 5 files changed, 80 insertions(+), 11 deletions(-) diff --git a/bluos/bluos.cpp b/bluos/bluos.cpp index 64875f27..69bd7e83 100644 --- a/bluos/bluos.cpp +++ b/bluos/bluos.cpp @@ -220,6 +220,19 @@ QUuid BluOS::setShuffle(bool shuffle) } emit connectionChanged(true); emit actionExecuted(requestId, true); + + QXmlStreamReader xml; + xml.addData(reply->readAll()); + if (xml.hasError()) { + qCDebug(dcBluOS()) << "XML Error:" << xml.errorString(); + return; + } + if (xml.readNextStartElement()) { + if (xml.attributes().hasAttribute("shuffle")) { + bool shuffle = RepeatMode(xml.attributes().value("shuffle").toInt()); + emit shuffleStateReceived(shuffle); + } + } }); return requestId; } @@ -254,6 +267,21 @@ QUuid BluOS::setRepeat(RepeatMode repeatMode) } emit connectionChanged(true); emit actionExecuted(requestId, true); + + QXmlStreamReader xml; + xml.addData(reply->readAll()); + if (xml.hasError()) { + qCDebug(dcBluOS()) << "XML Error:" << xml.errorString(); + return; + } + if (xml.readNextStartElement()) { + if (xml.name() == "playlist") { + if (xml.attributes().hasAttribute("repeat")) { + RepeatMode mode = RepeatMode(xml.attributes().value("repeat").toInt()); + emit repeatModeReceived(mode); + } + } + } }); return requestId; } @@ -652,6 +680,8 @@ bool BluOS::parseState(const QByteArray &state) statusResponse.Image = xml.readElementText(); } else if(xml.name() == "title1") { statusResponse.Title = xml.readElementText(); + } else if(xml.name() == "group") { + statusResponse.Group = xml.readElementText(); } else { xml.skipCurrentElement(); } diff --git a/bluos/bluos.h b/bluos/bluos.h index f929a0ab..65771f67 100644 --- a/bluos/bluos.h +++ b/bluos/bluos.h @@ -80,6 +80,7 @@ public: RepeatMode Repeat; bool Shuffle; QUrl Image; + QString Group; }; struct Preset { @@ -142,6 +143,8 @@ signals: void statusReceived(const StatusResponse &status); void volumeReceived(int volume, bool mute); + void shuffleStateReceived(bool state); + void repeatModeReceived(RepeatMode mode); void presetsReceived(QUuid requestId, const QList &presets); void sourcesReceived(QUuid requestId, const QList &sources); diff --git a/bluos/integrationpluginbluos.cpp b/bluos/integrationpluginbluos.cpp index 1d386136..043a6948 100644 --- a/bluos/integrationpluginbluos.cpp +++ b/bluos/integrationpluginbluos.cpp @@ -47,11 +47,6 @@ IntegrationPluginBluOS::IntegrationPluginBluOS() } -IntegrationPluginBluOS::~IntegrationPluginBluOS() -{ - -} - void IntegrationPluginBluOS::init() { m_serviceBrowser = hardwareManager()->zeroConfController()->createServiceBrowser("_musc._tcp"); @@ -99,13 +94,14 @@ void IntegrationPluginBluOS::setupThing(ThingSetupInfo *info) connect(bluos, &BluOS::volumeReceived, this, &IntegrationPluginBluOS::onVolumeReceived); connect(bluos, &BluOS::presetsReceived, this, &IntegrationPluginBluOS::onPresetsReceived); connect(bluos, &BluOS::sourcesReceived, this, &IntegrationPluginBluOS::onSourcesReceived); + connect(bluos, &BluOS::shuffleStateReceived, this, &IntegrationPluginBluOS::onShuffleStateReceived); + connect(bluos, &BluOS::repeatModeReceived, this, &IntegrationPluginBluOS::onRepeatModeReceived); m_asyncSetup.insert(bluos, info); bluos->getStatus(); // In case the setup is cancelled before we finish it... connect(info, &QObject::destroyed, this, [this, bluos]() { m_asyncSetup.remove(bluos); - }); return; } else { @@ -242,10 +238,10 @@ void IntegrationPluginBluOS::browseThing(BrowseResult *result) presetItem.setMediaIcon(MediaBrowserItem::MediaBrowserIconMusicLibrary); result->addItem(presetItem); - MediaBrowserItem groupingItem("grouping", "Grouping", true, false); - groupingItem.setIcon(BrowserItem::BrowserIcon::BrowserIconApplication); - groupingItem.setMediaIcon(MediaBrowserItem::MediaBrowserIconNetwork); - result->addItem(groupingItem); + // MediaBrowserItem groupingItem("grouping", "Grouping", true, false); + // groupingItem.setIcon(BrowserItem::BrowserIcon::BrowserIconApplication); + // groupingItem.setMediaIcon(MediaBrowserItem::MediaBrowserIconNetwork); + // result->addItem(groupingItem); QUuid requestId = bluos->getSources(); m_asyncBrowseResults.insert(requestId, result); @@ -364,6 +360,7 @@ void IntegrationPluginBluOS::onStatusResponseReceived(const BluOS::StatusRespons thing->setStateValue(bluosPlayerRepeatStateTypeId, "None"); break; } + thing->setStateValue(bluosPlayerGroupStateTypeId, status.Group); } void IntegrationPluginBluOS::onActionExecuted(QUuid requestId, bool success) @@ -397,6 +394,35 @@ void IntegrationPluginBluOS::onVolumeReceived(int volume, bool mute) thing->setStateValue(bluosPlayerVolumeStateTypeId, volume); } +void IntegrationPluginBluOS::onShuffleStateReceived(bool state) +{ + BluOS *bluos = static_cast(sender()); + Thing *thing = myThings().findById(m_bluos.key(bluos)); + if (!thing) + return; + thing->setStateValue(bluosPlayerShuffleStateTypeId, state); +} + +void IntegrationPluginBluOS::onRepeatModeReceived(BluOS::RepeatMode mode) +{ + BluOS *bluos = static_cast(sender()); + Thing *thing = myThings().findById(m_bluos.key(bluos)); + if (!thing) + return; + switch (mode) { + case BluOS::RepeatMode::All: + thing->setStateValue(bluosPlayerRepeatStateTypeId, "All"); + break; + case BluOS::RepeatMode::One: + thing->setStateValue(bluosPlayerRepeatStateTypeId, "One"); + break; + case BluOS::RepeatMode::None: + thing->setStateValue(bluosPlayerRepeatStateTypeId, "None"); + break; + } + +} + void IntegrationPluginBluOS::onPresetsReceived(QUuid requestId, const QList &presets) { BluOS *bluos = static_cast(sender()); @@ -444,6 +470,7 @@ void IntegrationPluginBluOS::onSourcesReceived(QUuid requestId, const QList &presets); void onSourcesReceived(QUuid requestId, const QList &sources); diff --git a/bluos/integrationpluginbluos.json b/bluos/integrationpluginbluos.json index 33e94154..3d946475 100644 --- a/bluos/integrationpluginbluos.json +++ b/bluos/integrationpluginbluos.json @@ -142,6 +142,14 @@ "displayNameEvent": "Artwork changed", "type": "QString", "defaultValue": "" + }, + { + "id": "69757ef3-173f-499c-9304-4252de3588c6", + "name": "group", + "displayName": "Group", + "displayNameEvent": "Group changed", + "type": "QString", + "defaultValue": "" } ], "actionTypes": [