From 6026f487c1b8ddc0d3680f24f9f7b5cac0902100 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Fri, 14 Feb 2020 16:21:56 +0500 Subject: [PATCH 1/4] added preset activation --- bose/devicepluginbose.cpp | 29 ++++++++++++++++++++++++++--- bose/devicepluginbose.json | 22 ++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/bose/devicepluginbose.cpp b/bose/devicepluginbose.cpp index 03861392..5ec069a6 100644 --- a/bose/devicepluginbose.cpp +++ b/bose/devicepluginbose.cpp @@ -242,15 +242,38 @@ void DevicePluginBose::executeAction(DeviceActionInfo *info) QUuid requestId; QString status = action.param(soundtouchPlaybackStatusActionPlaybackStatusParamTypeId).value().toString(); if (status == "Playing") { - soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY); } else if (status == "Paused") { - soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE); } else if (status == "Stopped") { - soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP); } m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); + } else if (action.actionTypeId() == soundtouchActivatePresetActionTypeId) { + + QUuid requestId; + QString preset = action.param(soundtouchActivatePresetActionPresetNumberParamTypeId).value().toString(); + if (preset.contains("1")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_1); + } else if (preset.contains("2")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_2); + } else if (preset.contains("3")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_3); + } else if (preset.contains("4")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_4); + } else if (preset.contains("5")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_5); + } else if (preset.contains("6")) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_6); + } else { + qCWarning(dcBose()) << "Unhandled preset number: " << preset; + info->finish(Device::DeviceErrorInvalidParameter); + return; + } + m_pendingActions.insert(requestId, info); + connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else { qCWarning(dcBose()) << "ActionTypeId not found" << action.actionTypeId(); return info->finish(Device::DeviceErrorActionTypeNotFound); diff --git a/bose/devicepluginbose.json b/bose/devicepluginbose.json index e48bcf5f..19cc0b35 100644 --- a/bose/devicepluginbose.json +++ b/bose/devicepluginbose.json @@ -199,6 +199,28 @@ "id": "85d7126a-b123-4a28-aeb4-d84bcfb4d14f", "name": "skipNext", "displayName": "Skip Next" + }, + { + "id": "69969904-5bb4-401d-bede-9f31fe52d16a", + "name": "activatePreset", + "displayName": "Activate preset", + "paramTypes": [ + { + "id": "2a69f545-41a9-4e84-9cc6-65a5a9600b7e", + "name": "presetNumber", + "displayName": "Preset number", + "type": "QString", + "defaultValue": "Preset 1", + "allowedValues": [ + "Preset 1", + "Preset 2", + "Preset 3", + "Preset 4", + "Preset 5", + "Preset 6" + ] + } + ] } ] } From 0b5041572f24a6fb19389cecbea2816e6660f013 Mon Sep 17 00:00:00 2001 From: Boernsman Date: Fri, 14 Feb 2020 17:42:46 +0500 Subject: [PATCH 2/4] added presets to browsing --- bose/devicepluginbose.cpp | 142 +++++++++++++++++++++++++++---------- bose/devicepluginbose.h | 1 + bose/devicepluginbose.json | 8 +-- bose/soundtouch.cpp | 94 ++++++++++++++++++------ bose/soundtouch.h | 4 +- 5 files changed, 182 insertions(+), 67 deletions(-) diff --git a/bose/devicepluginbose.cpp b/bose/devicepluginbose.cpp index 5ec069a6..1dbc3638 100644 --- a/bose/devicepluginbose.cpp +++ b/bose/devicepluginbose.cpp @@ -87,6 +87,7 @@ void DevicePluginBose::setupDevice(DeviceSetupInfo *info) connect(soundTouch, &SoundTouch::bassCapabilitiesReceived, this, &DevicePluginBose::onBassCapabilitiesObjectReceived); connect(soundTouch, &SoundTouch::zoneReceived, this, &DevicePluginBose::onZoneObjectReceived); connect(soundTouch, &SoundTouch::requestExecuted, this, &DevicePluginBose::onRequestExecuted); + connect(soundTouch, &SoundTouch::presetsReceived, this, &DevicePluginBose::onPresetsReceived); m_soundTouch.insert(info->device(), soundTouch); return info->finish(Device::DeviceErrorNoError); @@ -163,37 +164,37 @@ void DevicePluginBose::executeAction(DeviceActionInfo *info) if (action.actionTypeId() == soundtouchPowerActionTypeId) { //bool power = action.param(soundtouchPowerActionPowerParamTypeId).value().toBool(); - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_POWER); //only toggling possible + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_POWER, true); //only toggling possible m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchMuteActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_MUTE); //only toggling possible + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_MUTE, true); //only toggling possible m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchPlayActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY); + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY, true); m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchPauseActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE); + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE, true); m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchStopActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP); + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP, true); m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchSkipNextActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_NEXT_TRACK); + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_NEXT_TRACK, true); m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); } else if (action.actionTypeId() == soundtouchSkipBackActionTypeId) { - QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PREV_TRACK); + QUuid requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PREV_TRACK, true); m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); @@ -202,9 +203,9 @@ void DevicePluginBose::executeAction(DeviceActionInfo *info) QUuid requestId; bool shuffle = action.param(soundtouchShuffleActionShuffleParamTypeId).value().toBool(); if (shuffle) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_SHUFFLE_ON); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_SHUFFLE_ON, true); } else { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_SHUFFLE_OFF); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_SHUFFLE_OFF, true); } m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); @@ -214,11 +215,11 @@ void DevicePluginBose::executeAction(DeviceActionInfo *info) QUuid requestId; QString repeat = action.param(soundtouchRepeatActionRepeatParamTypeId).value().toString(); if (repeat == "None") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_OFF); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_OFF, true); } else if (repeat == "One") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_ONE); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_ONE, true); } else if (repeat == "All") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_ALL); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_REPEAT_ALL, true); } m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); @@ -242,31 +243,31 @@ void DevicePluginBose::executeAction(DeviceActionInfo *info) QUuid requestId; QString status = action.param(soundtouchPlaybackStatusActionPlaybackStatusParamTypeId).value().toString(); if (status == "Playing") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PLAY, true); } else if (status == "Paused") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PAUSE, true); } else if (status == "Stopped") { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_STOP, true); } m_pendingActions.insert(requestId, info); connect(info, &DeviceActionInfo::aborted, this, [requestId, this] {m_pendingActions.remove(requestId);}); - } else if (action.actionTypeId() == soundtouchActivatePresetActionTypeId) { + } else if (action.actionTypeId() == soundtouchSavePresetActionTypeId) { QUuid requestId; - QString preset = action.param(soundtouchActivatePresetActionPresetNumberParamTypeId).value().toString(); + QString preset = action.param(soundtouchSavePresetActionPresetNumberParamTypeId).value().toString(); if (preset.contains("1")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_1); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_1, true); } else if (preset.contains("2")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_2); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_2, true); } else if (preset.contains("3")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_3); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_3, true); } else if (preset.contains("4")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_4); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_4, true); } else if (preset.contains("5")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_5); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_5, true); } else if (preset.contains("6")) { - requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_6); + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_6, true); } else { qCWarning(dcBose()) << "Unhandled preset number: " << preset; info->finish(Device::DeviceErrorInvalidParameter); @@ -289,9 +290,18 @@ void DevicePluginBose::browseDevice(BrowseResult *result) Device *device = result->device(); if (device->deviceClassId() == soundtouchDeviceClassId) { SoundTouch *soundTouch = m_soundTouch.value(device); - QUuid requestId = soundTouch->getSources(); - m_asyncBrowseResults.insert(requestId, result); - connect(result, &BrowseResult::aborted, this, [this, requestId]{m_asyncBrowseResults.remove(requestId);}); + if (result->itemId() == "presets") { + QUuid requestId = soundTouch->getPresets(); + m_asyncBrowseResults.insert(requestId, result); + connect(result, &BrowseResult::aborted, this, [this, requestId]{m_asyncBrowseResults.remove(requestId);}); + } else { + BrowserItem presetItem("presets", "Presets", true, false); + presetItem.setIcon(BrowserItem::BrowserIcon::BrowserIconFavorites); + QUuid requestId = soundTouch->getSources(); + result->addItem(presetItem); + m_asyncBrowseResults.insert(requestId, result); + connect(result, &BrowseResult::aborted, this, [this, requestId]{m_asyncBrowseResults.remove(requestId);}); + } } } @@ -300,9 +310,18 @@ void DevicePluginBose::browserItem(BrowserItemResult *result) Device *device = result->device(); if (device->deviceClassId() == soundtouchDeviceClassId) { SoundTouch *soundTouch = m_soundTouch.value(device); - QUuid requestId = soundTouch->getSources(); - m_asyncBrowseItemResults.insert(requestId, result); - connect(result, &BrowserItemResult::aborted, this, [this, requestId]{m_asyncBrowseItemResults.remove(requestId);}); + + if (result->itemId() == "presets") { + QUuid requestId = soundTouch->getPresets(); + m_asyncBrowseItemResults.insert(requestId, result); + connect(result, &BrowserItemResult::aborted, this, [this, requestId]{m_asyncBrowseItemResults.remove(requestId);}); + } else { + BrowserItem presetItem("presets", "Presets", true, false); + presetItem.setIcon(BrowserItem::BrowserIcon::BrowserIconFavorites); + QUuid requestId = soundTouch->getSources(); + m_asyncBrowseItemResults.insert(requestId, result); + connect(result, &BrowserItemResult::aborted, this, [this, requestId]{m_asyncBrowseItemResults.remove(requestId);}); + } } } @@ -311,16 +330,40 @@ void DevicePluginBose::executeBrowserItem(BrowserActionInfo *info) Device *device = info->device(); if (device->deviceClassId() == soundtouchDeviceClassId) { SoundTouch *soundTouch = m_soundTouch.value(device); - SourcesObject sources = m_sourcesObjects.value(device); - foreach (SourceItemObject source, sources.sourceItems) { - if (source.source == info->browserAction().itemId()) { - ContentItemObject contentItem; - contentItem.source = source.source; - contentItem.sourceAccount = source.sourceAccount; - QUuid requestId = soundTouch->setSource(contentItem); - m_asyncExecuteBrowseItems.insert(requestId, info); - connect(info, &BrowserActionInfo::aborted, this, [this, requestId]{m_asyncExecuteBrowseItems.remove(requestId);}); - break; + if (info->browserAction().itemId().startsWith("presets")) { + QUuid requestId; + int number = info->browserAction().itemId().split("&").last().toInt(); + if (number == 1) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_1, false); + } else if (number == 2) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_2, false); + } else if (number == 3) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_3, false); + } else if (number == 4) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_4, false); + } else if (number == 5) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_5, false); + } else if (number == 6) { + requestId = soundTouch->setKey(KEY_VALUE::KEY_VALUE_PRESET_6, false); + } else { + qCWarning(dcBose()) << "Unhandled preset number: " << number; + info->finish(Device::DeviceErrorInvalidParameter); + return; + } + m_asyncExecuteBrowseItems.insert(requestId, info); + connect(info, &BrowserActionInfo::aborted, this, [this, requestId]{m_asyncExecuteBrowseItems.remove(requestId);}); + } else { + SourcesObject sources = m_sourcesObjects.value(device); + foreach (SourceItemObject source, sources.sourceItems) { + if (source.source == info->browserAction().itemId()) { + ContentItemObject contentItem; + contentItem.source = source.source; + contentItem.sourceAccount = source.sourceAccount; + QUuid requestId = soundTouch->setSource(contentItem); + m_asyncExecuteBrowseItems.insert(requestId, info); + connect(info, &BrowserActionInfo::aborted, this, [this, requestId]{m_asyncExecuteBrowseItems.remove(requestId);}); + break; + } } } } @@ -513,3 +556,24 @@ void DevicePluginBose::onZoneObjectReceived(QUuid requestId, ZoneObject zone) qDebug(dcBose()) << "-> member:" << member.deviceID; } } + +void DevicePluginBose::onPresetsReceived(QUuid requestId, QList presets) +{ + //SoundTouch *soundtouch = static_cast(sender()); + //Device *device = m_soundTouch.key(soundtouch); + + if (m_asyncBrowseResults.contains(requestId)) { + BrowseResult *result = m_asyncBrowseResults.take(requestId); + foreach (PresetObject preset, presets) { + BrowserItem item("presets&"+QString::number(preset.presetId), QString("Preset %1").arg(QString::number(preset.presetId)), false, true); + item.setDescription(preset.ContentItem.source+" "+preset.ContentItem.itemName); + item.setThumbnail(preset.ContentItem.containerArt); + result->addItem(item); + } + result->finish(Device::DeviceErrorNoError); + } + + if (m_asyncBrowseItemResults.contains(requestId)) { + //TODO + } +} diff --git a/bose/devicepluginbose.h b/bose/devicepluginbose.h index d9a480f0..46ecf37f 100644 --- a/bose/devicepluginbose.h +++ b/bose/devicepluginbose.h @@ -87,6 +87,7 @@ private slots: void onBassCapabilitiesObjectReceived(QUuid requestId, BassCapabilitiesObject bassCapabilities); void onGroupObjectReceived(QUuid requestId, GroupObject group); void onZoneObjectReceived(QUuid requestId, ZoneObject zone); + void onPresetsReceived(QUuid requestId, QList presets); }; #endif // DEVICEPLUGINBOSE_H diff --git a/bose/devicepluginbose.json b/bose/devicepluginbose.json index 19cc0b35..3337a6eb 100644 --- a/bose/devicepluginbose.json +++ b/bose/devicepluginbose.json @@ -201,12 +201,12 @@ "displayName": "Skip Next" }, { - "id": "69969904-5bb4-401d-bede-9f31fe52d16a", - "name": "activatePreset", - "displayName": "Activate preset", + "id": "6c47e736-e2e0-47d4-9b96-7f56d2342b4d", + "name": "savePreset", + "displayName": "Save preset", "paramTypes": [ { - "id": "2a69f545-41a9-4e84-9cc6-65a5a9600b7e", + "id": "04ac6e10-922d-4774-861f-060897d3a6c0", "name": "presetNumber", "displayName": "Preset number", "type": "QString", diff --git a/bose/soundtouch.cpp b/bose/soundtouch.cpp index e62eb580..a8852fa5 100644 --- a/bose/soundtouch.cpp +++ b/bose/soundtouch.cpp @@ -162,7 +162,7 @@ QUuid SoundTouch::getBassCapabilities() return requestId; } -QUuid SoundTouch::setKey(KEY_VALUE keyValue) +QUuid SoundTouch::setKey(KEY_VALUE keyValue, bool pressed) { QUuid requestId = QUuid::createUuid(); QUrl url; @@ -174,7 +174,12 @@ QUuid SoundTouch::setKey(KEY_VALUE keyValue) QXmlStreamWriter xml(&content); xml.writeStartDocument("1.0"); xml.writeStartElement("key"); - xml.writeAttribute("state", "press"); + if (pressed) { + xml.writeAttribute("state", "press"); + } else { + xml.writeAttribute("state", "release"); + } + xml.writeAttribute("sender", "Gabbo"); switch (keyValue){ case KEY_VALUE_PLAY: @@ -225,6 +230,24 @@ QUuid SoundTouch::setKey(KEY_VALUE keyValue) case KEY_VALUE_SHUFFLE_OFF: xml.writeCharacters("SHUFFLE_OFF"); break; + case KEY_VALUE_PRESET_1: + xml.writeCharacters("PRESET_1"); + break; + case KEY_VALUE_PRESET_2: + xml.writeCharacters("PRESET_2"); + break; + case KEY_VALUE_PRESET_3: + xml.writeCharacters("PRESET_3"); + break; + case KEY_VALUE_PRESET_4: + xml.writeCharacters("PRESET_4"); + break; + case KEY_VALUE_PRESET_5: + xml.writeCharacters("PRESET_5"); + break; + case KEY_VALUE_PRESET_6: + xml.writeCharacters("PRESET_6"); + break; default: qWarning(dcBose) << "key not yet implemented"; return "0"; @@ -239,7 +262,8 @@ QUuid SoundTouch::setKey(KEY_VALUE keyValue) emitRequestStatus(requestId, reply); }); - if (keyValue == KEY_VALUE_POWER) { + //Power button needs to be released immediatelly after beeing pressed + if (keyValue == KEY_VALUE_POWER && pressed) { QUrl url; url.setHost(m_ipAddress); url.setScheme("http"); @@ -262,6 +286,7 @@ QUuid SoundTouch::setKey(KEY_VALUE keyValue) return requestId; } + QUuid SoundTouch::setVolume(int volume) { QUuid requestId = QUuid::createUuid(); @@ -850,32 +875,57 @@ void SoundTouch::parseData(QUuid requestId, const QByteArray &data) } emit bassCapabilitiesReceived(requestId, bassCapabilities); } else if (xml.name() == "presets") { - PresetObject preset; - if(xml.attributes().hasAttribute("id")) { - preset.presetId = xml.attributes().value("id").toInt(); - } - if(xml.attributes().hasAttribute("createdOn")) { - preset.createdOn= xml.attributes().value("createdOn").toULong(); - } - if(xml.attributes().hasAttribute("updatedOn")) { - preset.updatedOn = xml.attributes().value("updatedOn").toULong(); - } + QList presets; + qDebug(dcBose) << "Presets"; while(xml.readNextStartElement()){ - if(xml.name() == "ContentItem"){ - if(xml.attributes().hasAttribute("source")) { - preset.ContentItem.source = xml.attributes().value("source").toString(); + if(xml.name() == "preset"){ + PresetObject preset; + if(xml.attributes().hasAttribute("id")) { + preset.presetId = xml.attributes().value("id").toInt(); } - if(xml.attributes().hasAttribute("location")) { - preset.ContentItem.location = xml.attributes().value("location").toString(); + if(xml.attributes().hasAttribute("createdOn")) { + preset.createdOn= xml.attributes().value("createdOn").toULong(); } - if(xml.attributes().hasAttribute("sourceAccount")) { - preset.ContentItem.sourceAccount = xml.attributes().value("sourceAccount").toString(); + if(xml.attributes().hasAttribute("updatedOn")) { + preset.updatedOn = xml.attributes().value("updatedOn").toULong(); } - }else { + qDebug(dcBose) << "Preset" << preset.presetId; + while(xml.readNextStartElement()){ + + if (xml.name() == "ContentItem") { + if(xml.attributes().hasAttribute("source")) { + preset.ContentItem.source = xml.attributes().value("source").toString(); + } + if(xml.attributes().hasAttribute("location")) { + preset.ContentItem.location = xml.attributes().value("location").toString(); + } + if(xml.attributes().hasAttribute("sourceAccount")) { + preset.ContentItem.sourceAccount = xml.attributes().value("sourceAccount").toString(); + } + + while(xml.readNextStartElement()){ + if (xml.name() == "itemName") { + preset.ContentItem.itemName = xml.readElementText(); + } else if (xml.name() == "containerArt"){ + preset.ContentItem.containerArt = xml.readElementText(); + } else { + qCWarning(dcBose()) << "Presets: unhandled XML element" << xml.name(); + xml.skipCurrentElement(); + } + } + + } else { + qCWarning(dcBose()) << "Presets: unhandled XML element" << xml.name(); + xml.skipCurrentElement(); + } + } + presets.append(preset); + } else { + qCWarning(dcBose()) << "Presets: unhandled XML element" << xml.name(); xml.skipCurrentElement(); } } - emit presetsReceived(requestId, preset); + emit presetsReceived(requestId, presets); } else if (xml.name() == "group") { GroupObject group; diff --git a/bose/soundtouch.h b/bose/soundtouch.h index e2231b3c..eebaa985 100644 --- a/bose/soundtouch.h +++ b/bose/soundtouch.h @@ -60,7 +60,7 @@ public: QUuid getPresets(); //Get information related to the user's SoundTouch presets. //ACTIONS - QUuid setKey(KEY_VALUE keyValue); //Start and control playback on a product. + QUuid setKey(KEY_VALUE keyValue, bool pressed); //Start and control playback on a product. QUuid setVolume(int volume); //Set the volume of a product. QUuid setSource(ContentItemObject contentItem); //Select a product's source. QUuid setZone(ZoneObject zone); //Create a zone of synced products. @@ -95,7 +95,7 @@ signals: void zoneReceived(QUuid requestId, ZoneObject); void bassCapabilitiesReceived(QUuid requestId, BassCapabilitiesObject bassCapabilities); void bassReceived(QUuid requestId, BassObject bass); - void presetsReceived(QUuid requestId, PresetObject presets); + void presetsReceived(QUuid requestId, QList presets); void groupReceived(QUuid requestId, GroupObject group); void requestExecuted(QUuid requestId, bool success); From 74ac272274588f0f904bada16a1e00703b89635a Mon Sep 17 00:00:00 2001 From: Boernsman Date: Fri, 14 Feb 2020 17:44:03 +0500 Subject: [PATCH 3/4] updated translation file --- ...a3f24-b05c-49b3-ad9a-dfda608b6760-en_US.ts | 144 ++++++++++-------- 1 file changed, 78 insertions(+), 66 deletions(-) diff --git a/bose/translations/472a3f24-b05c-49b3-ad9a-dfda608b6760-en_US.ts b/bose/translations/472a3f24-b05c-49b3-ad9a-dfda608b6760-en_US.ts index 5742fee3..68c1af66 100644 --- a/bose/translations/472a3f24-b05c-49b3-ad9a-dfda608b6760-en_US.ts +++ b/bose/translations/472a3f24-b05c-49b3-ad9a-dfda608b6760-en_US.ts @@ -4,8 +4,8 @@ Bose - - + + Artist The name of the ParamType (DeviceClass: soundtouch, EventType: artist, ID: {8cb920a3-3bf1-4231-92d4-8ac27e7b3d65}) ---------- @@ -13,14 +13,14 @@ The name of the StateType ({8cb920a3-3bf1-4231-92d4-8ac27e7b3d65}) of DeviceClas - + Artist changed The name of the EventType ({8cb920a3-3bf1-4231-92d4-8ac27e7b3d65}) of DeviceClass soundtouch - - + + Artwork The name of the ParamType (DeviceClass: soundtouch, EventType: artwork, ID: {44304c82-c2f6-433b-b62b-815382617d0b}) ---------- @@ -28,15 +28,15 @@ The name of the StateType ({44304c82-c2f6-433b-b62b-815382617d0b}) of DeviceClas - + Artwork changed The name of the EventType ({44304c82-c2f6-433b-b62b-815382617d0b}) of DeviceClass soundtouch - - - + + + Bass The name of the ParamType (DeviceClass: soundtouch, ActionType: bass, ID: {91bc53ec-4f3b-438d-8e32-129b7c27aae4}) ---------- @@ -46,14 +46,14 @@ The name of the StateType ({91bc53ec-4f3b-438d-8e32-129b7c27aae4}) of DeviceClas - + Bass changed The name of the EventType ({91bc53ec-4f3b-438d-8e32-129b7c27aae4}) of DeviceClass soundtouch - - + + Bose The name of the vendor ({433c45cd-5bc1-4239-a8a1-487c70ffdfc7}) ---------- @@ -61,8 +61,8 @@ The name of the plugin Bose ({472a3f24-b05c-49b3-ad9a-dfda608b6760}) - - + + Collection The name of the ParamType (DeviceClass: soundtouch, EventType: collection, ID: {ce399eec-9f6a-4903-9916-0e90e38b255e}) ---------- @@ -70,14 +70,14 @@ The name of the StateType ({ce399eec-9f6a-4903-9916-0e90e38b255e}) of DeviceClas - + Collection changed The name of the EventType ({ce399eec-9f6a-4903-9916-0e90e38b255e}) of DeviceClass soundtouch - - + + Connected The name of the ParamType (DeviceClass: soundtouch, EventType: connected, ID: {09dfbd40-c97c-4a20-9ecd-f80e389a4864}) ---------- @@ -85,15 +85,15 @@ The name of the StateType ({09dfbd40-c97c-4a20-9ecd-f80e389a4864}) of DeviceClas - + IP The name of the ParamType (DeviceClass: soundtouch, Type: device, ID: {1a897065-57c6-49b3-bac9-1e5db27859e5}) - - - + + + Mute The name of the ParamType (DeviceClass: soundtouch, ActionType: mute, ID: {bc98cdb0-4d0e-48ca-afc7-922e49bb7813}) ---------- @@ -103,27 +103,27 @@ The name of the StateType ({bc98cdb0-4d0e-48ca-afc7-922e49bb7813}) of DeviceClas - + Mute changed The name of the EventType ({bc98cdb0-4d0e-48ca-afc7-922e49bb7813}) of DeviceClass soundtouch - + Pause The name of the ActionType ({3cf341cb-fe63-40bc-a450-9678d18e91e3}) of DeviceClass soundtouch - + Play The name of the ActionType ({4d2ee668-a2e3-4795-8b96-0c800b703b46}) of DeviceClass soundtouch - - - + + + Playback status The name of the ParamType (DeviceClass: soundtouch, ActionType: playbackStatus, ID: {2dd512b7-40c2-488e-8d4f-6519edaa6f74}) ---------- @@ -133,33 +133,33 @@ The name of the StateType ({2dd512b7-40c2-488e-8d4f-6519edaa6f74}) of DeviceClas - + Player ID The name of the ParamType (DeviceClass: soundtouch, Type: device, ID: {3eb95eef-e8ba-4d44-8a21-7d8038b74c4d}) - + Player pause The name of the EventType ({99498b1c-e9c0-480a-9e91-662ee79ba976}) of DeviceClass soundtouch - + Player play The name of the EventType ({2535a1eb-7643-4874-98f6-b027fdff6311}) of DeviceClass soundtouch - + Player stop The name of the EventType ({a02ce255-3abb-435d-a92e-7f99c952ecb2}) of DeviceClass soundtouch - - - + + + Power The name of the ParamType (DeviceClass: soundtouch, ActionType: power, ID: {5bac4ad7-f55c-4301-8d72-f2783d9909ff}) ---------- @@ -169,15 +169,21 @@ The name of the StateType ({5bac4ad7-f55c-4301-8d72-f2783d9909ff}) of DeviceClas - + Power changed The name of the EventType ({5bac4ad7-f55c-4301-8d72-f2783d9909ff}) of DeviceClass soundtouch - - - + + Preset number + The name of the ParamType (DeviceClass: soundtouch, ActionType: savePreset, ID: {04ac6e10-922d-4774-861f-060897d3a6c0}) + + + + + + Repeat The name of the ParamType (DeviceClass: soundtouch, ActionType: repeat, ID: {bc02c28e-3f5d-4de4-b9b5-c0b1576c6e7e}) ---------- @@ -187,51 +193,57 @@ The name of the StateType ({bc02c28e-3f5d-4de4-b9b5-c0b1576c6e7e}) of DeviceClas - + Repeat changed The name of the EventType ({bc02c28e-3f5d-4de4-b9b5-c0b1576c6e7e}) of DeviceClass soundtouch - + + Save preset + The name of the ActionType ({6c47e736-e2e0-47d4-9b96-7f56d2342b4d}) of DeviceClass soundtouch + + + + Set bass The name of the ActionType ({91bc53ec-4f3b-438d-8e32-129b7c27aae4}) of DeviceClass soundtouch - + Set mute The name of the ActionType ({bc98cdb0-4d0e-48ca-afc7-922e49bb7813}) of DeviceClass soundtouch - + Set power The name of the ActionType ({5bac4ad7-f55c-4301-8d72-f2783d9909ff}) of DeviceClass soundtouch - + Set repeat The name of the ActionType ({bc02c28e-3f5d-4de4-b9b5-c0b1576c6e7e}) of DeviceClass soundtouch - + Set shuffle The name of the ActionType ({5913aa2a-629d-4de5-bf44-a4a1f130c118}) of DeviceClass soundtouch - + Set volume The name of the ActionType ({9dfe5d78-4c3f-497c-bab1-bb9fdf7e93a9}) of DeviceClass soundtouch - - - + + + Shuffle The name of the ParamType (DeviceClass: soundtouch, ActionType: shuffle, ID: {5913aa2a-629d-4de5-bf44-a4a1f130c118}) ---------- @@ -241,32 +253,32 @@ The name of the StateType ({5913aa2a-629d-4de5-bf44-a4a1f130c118}) of DeviceClas - + Shuffle changed The name of the EventType ({5913aa2a-629d-4de5-bf44-a4a1f130c118}) of DeviceClass soundtouch - + Skip Next The name of the ActionType ({85d7126a-b123-4a28-aeb4-d84bcfb4d14f}) of DeviceClass soundtouch - + Skip back The name of the ActionType ({a180807d-1265-4831-9d86-a421767418dd}) of DeviceClass soundtouch - + SoundTouch The name of the DeviceClass ({f9b7a3f5-6353-48b1-afc1-66f914412f82}) - - + + Source The name of the ParamType (DeviceClass: soundtouch, EventType: source, ID: {f4684de8-ff5f-41f3-a5c3-f5e5754519d2}) ---------- @@ -274,20 +286,20 @@ The name of the StateType ({f4684de8-ff5f-41f3-a5c3-f5e5754519d2}) of DeviceClas - + Source changed The name of the EventType ({f4684de8-ff5f-41f3-a5c3-f5e5754519d2}) of DeviceClass soundtouch - + Stop The name of the ActionType ({ae3cbe03-ee3e-410e-abbd-efabc2402198}) of DeviceClass soundtouch - - + + Title The name of the ParamType (DeviceClass: soundtouch, EventType: title, ID: {f2209fec-cceb-46ad-8189-4caf42166e6b}) ---------- @@ -295,15 +307,15 @@ The name of the StateType ({f2209fec-cceb-46ad-8189-4caf42166e6b}) of DeviceClas - + Title changed The name of the EventType ({f2209fec-cceb-46ad-8189-4caf42166e6b}) of DeviceClass soundtouch - - - + + + Volume The name of the ParamType (DeviceClass: soundtouch, ActionType: volume, ID: {9dfe5d78-4c3f-497c-bab1-bb9fdf7e93a9}) ---------- @@ -313,25 +325,25 @@ The name of the StateType ({9dfe5d78-4c3f-497c-bab1-bb9fdf7e93a9}) of DeviceClas - + Volume changed The name of the EventType ({9dfe5d78-4c3f-497c-bab1-bb9fdf7e93a9}) of DeviceClass soundtouch - + connected changed The name of the EventType ({09dfbd40-c97c-4a20-9ecd-f80e389a4864}) of DeviceClass soundtouch - + playback status changed The name of the EventType ({2dd512b7-40c2-488e-8d4f-6519edaa6f74}) of DeviceClass soundtouch - + set playback status The name of the ActionType ({2dd512b7-40c2-488e-8d4f-6519edaa6f74}) of DeviceClass soundtouch From 6d99f4a8cda94cb72a35ac3e4df8d8770c80a03f Mon Sep 17 00:00:00 2001 From: Boernsman Date: Fri, 14 Feb 2020 21:28:54 +0500 Subject: [PATCH 4/4] finished preset browsing --- bose/devicepluginbose.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bose/devicepluginbose.cpp b/bose/devicepluginbose.cpp index 1dbc3638..24bcb373 100644 --- a/bose/devicepluginbose.cpp +++ b/bose/devicepluginbose.cpp @@ -559,9 +559,6 @@ void DevicePluginBose::onZoneObjectReceived(QUuid requestId, ZoneObject zone) void DevicePluginBose::onPresetsReceived(QUuid requestId, QList presets) { - //SoundTouch *soundtouch = static_cast(sender()); - //Device *device = m_soundTouch.key(soundtouch); - if (m_asyncBrowseResults.contains(requestId)) { BrowseResult *result = m_asyncBrowseResults.take(requestId); foreach (PresetObject preset, presets) { @@ -574,6 +571,12 @@ void DevicePluginBose::onPresetsReceived(QUuid requestId, QList pr } if (m_asyncBrowseItemResults.contains(requestId)) { - //TODO + BrowserItemResult *result = m_asyncBrowseItemResults.value(requestId); + foreach (PresetObject preset, presets) { + if (preset.presetId == result->itemId().split("&").last().toInt()) { + return result->finish(Device::DeviceErrorNoError); + } + } + return result->finish(Device::DeviceErrorItemNotFound); } }