Hello community, here is the log from the commit of package noson for openSUSE:Factory checked in at 2020-01-19 20:56:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/noson (Old) and /work/SRC/openSUSE:Factory/.noson.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "noson" Sun Jan 19 20:56:59 2020 rev:7 rq:765503 version:2.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/noson/noson.changes 2019-12-16 15:19:54.987150460 +0100 +++ /work/SRC/openSUSE:Factory/.noson.new.26092/noson.changes 2020-01-19 20:58:20.008078486 +0100 @@ -1,0 +2,9 @@ +Thu Jan 16 20:38:36 UTC 2020 - Bo Simonsen <[email protected]> + +- Update to 2.3.0 + * Discard any obsolete event according to the last stamped. + That fixes some cases when rendering update events are caught + out of order (i.e swiping the volume up/down). + * Discard some device models during discovery + +------------------------------------------------------------------- Old: ---- 2.2.0.tar.gz New: ---- 2.3.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ noson.spec ++++++ --- /var/tmp/diff_new_pack.GAshYz/_old 2020-01-19 20:58:20.484078736 +0100 +++ /var/tmp/diff_new_pack.GAshYz/_new 2020-01-19 20:58:20.488078738 +0100 @@ -17,7 +17,7 @@ Name: noson -Version: 2.2.0 +Version: 2.3.0 Release: 0 Summary: C++ library for accessing sonos devices License: GPL-3.0-or-later @@ -45,7 +45,7 @@ C++ library for accessing sonos devices The API supports basic features to browse music index and control playback in any zones. -https://codeload.github.com/janbar/noson/tar.gz/2.2.0 + %package devel Summary: Development files for noson library Group: Development/Libraries/C and C++ ++++++ 2.2.0.tar.gz -> 2.3.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/CMakeLists.txt new/noson-2.3.0/noson/CMakeLists.txt --- old/noson-2.2.0/noson/CMakeLists.txt 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/CMakeLists.txt 2020-01-03 13:34:28.000000000 +0100 @@ -8,7 +8,7 @@ ############################################################################### # set lib version here set (noson_VERSION_MAJOR 2) -set (noson_VERSION_MINOR 2) +set (noson_VERSION_MINOR 3) set (noson_VERSION_PATCH 0) set (noson_VERSION ${noson_VERSION_MAJOR}.${noson_VERSION_MINOR}.${noson_VERSION_PATCH}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/alarmclock.cpp new/noson-2.3.0/noson/src/alarmclock.cpp --- old/noson-2.2.0/noson/src/alarmclock.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/alarmclock.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -32,6 +32,10 @@ const std::string AlarmClock::EventURL("/AlarmClock/Event"); const std::string AlarmClock::SCPDURL("/xml/AlarmClock1.xml"); +ACProperty::~ACProperty() +{ +} + AlarmClock::AlarmClock(const std::string& serviceHost, unsigned servicePort) : Service(serviceHost, servicePort) , m_subscriptionPool() @@ -135,6 +139,22 @@ Locked<ACProperty>::pointer prop = m_property.Get(); DBG(DBG_DEBUG, "%s: %s SEQ=%s %s\n", __FUNCTION__, msg->subject[0].c_str(), msg->subject[1].c_str(), msg->subject[2].c_str()); + + // check for higher sequence + uint32_t seq = 0; + string_to_uint32(msg->subject[1].c_str(), &seq); + if (msg->subject[0] != prop->EventSID) + { + prop->EventSID = msg->subject[0]; + } + else if (seq < prop->EventSEQ) + { + DBG(DBG_DEBUG, "%s: %s SEQ=%u , discarding %u\n", __FUNCTION__, prop->EventSID.c_str(), prop->EventSEQ, seq); + return; + } + // tracking serial of the event + prop->EventSEQ = seq; + std::vector<std::string>::const_iterator it = msg->subject.begin(); while (it != msg->subject.end()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/alarmclock.h new/noson-2.3.0/noson/src/alarmclock.h --- old/noson-2.2.0/noson/src/alarmclock.h 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/alarmclock.h 2020-01-03 13:34:28.000000000 +0100 @@ -39,11 +39,14 @@ { public: ACProperty() - : timeGeneration(0) + : EventSEQ(0) + , timeGeneration(0) { } - virtual ~ACProperty() { } + virtual ~ACProperty(); + unsigned EventSEQ; + std::string EventSID; std::string timeZone; std::string timeServer; unsigned timeGeneration; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/avtransport.cpp new/noson-2.3.0/noson/src/avtransport.cpp --- old/noson-2.2.0/noson/src/avtransport.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/avtransport.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -491,6 +491,22 @@ Locked<AVTProperty>::pointer prop = m_property.Get(); DBG(DBG_DEBUG, "%s: %s SEQ=%s %s\n", __FUNCTION__, msg->subject[0].c_str(), msg->subject[1].c_str(), msg->subject[2].c_str()); + + // check for higher sequence + uint32_t seq = 0; + string_to_uint32(msg->subject[1].c_str(), &seq); + if (msg->subject[0] != prop->EventSID) + { + prop->EventSID = msg->subject[0]; + } + else if (seq < prop->EventSEQ) + { + DBG(DBG_DEBUG, "%s: %s SEQ=%u , discarding %u\n", __FUNCTION__, prop->EventSID.c_str(), prop->EventSEQ, seq); + return; + } + // tracking serial of the event + prop->EventSEQ = seq; + std::vector<std::string>::const_iterator it = msg->subject.begin(); while (it != msg->subject.end()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/contentdirectory.cpp new/noson-2.3.0/noson/src/contentdirectory.cpp --- old/noson-2.2.0/noson/src/contentdirectory.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/contentdirectory.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -129,6 +129,22 @@ Locked<ContentProperty>::pointer prop = m_property.Get(); DBG(DBG_DEBUG, "%s: %s SEQ=%s %s\n", __FUNCTION__, msg->subject[0].c_str(), msg->subject[1].c_str(), msg->subject[2].c_str()); + + // check for higher sequence + uint32_t seq = 0; + string_to_uint32(msg->subject[1].c_str(), &seq); + if (msg->subject[0] != prop->EventSID) + { + prop->EventSID = msg->subject[0]; + } + else if (seq < prop->EventSEQ) + { + DBG(DBG_DEBUG, "%s: %s SEQ=%u , discarding %u\n", __FUNCTION__, prop->EventSID.c_str(), prop->EventSEQ, seq); + return; + } + // tracking serial of the event + prop->EventSEQ = seq; + std::vector<std::string>::const_iterator it = msg->subject.begin(); while (it != msg->subject.end()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/renderingcontrol.cpp new/noson-2.3.0/noson/src/renderingcontrol.cpp --- old/noson-2.2.0/noson/src/renderingcontrol.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/renderingcontrol.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -279,6 +279,22 @@ Locked<RCSProperty>::pointer prop = m_property.Get(); DBG(DBG_DEBUG, "%s: %s SEQ=%s %s\n", __FUNCTION__, msg->subject[0].c_str(), msg->subject[1].c_str(), msg->subject[2].c_str()); + + // check for higher sequence + uint32_t seq = 0; + string_to_uint32(msg->subject[1].c_str(), &seq); + if (msg->subject[0] != prop->EventSID) + { + prop->EventSID = msg->subject[0]; + } + else if (seq < prop->EventSEQ) + { + DBG(DBG_DEBUG, "%s: %s SEQ=%u , discarding %u\n", __FUNCTION__, prop->EventSID.c_str(), prop->EventSEQ, seq); + return; + } + // tracking serial of the event + prop->EventSEQ = seq; + std::vector<std::string>::const_iterator it = msg->subject.begin(); while (it != msg->subject.end()) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/sonossystem.cpp new/noson-2.3.0/noson/src/sonossystem.cpp --- old/noson-2.2.0/noson/src/sonossystem.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/sonossystem.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -615,6 +615,28 @@ return m_eventHandler.GetRequestBroker(name); } +bool System::DeviceMatches(const char * serverString) +{ + // All models within the array will be discarded + static const char * discarded[] = { "WD", "CR", "BR", "ANVI", "" }; + + const char * vendor = strstr(serverString, "Sonos/"); + if (!vendor) + return false; + const char * model_s = strstr(vendor, "("); + if (!model_s) + return false; + const char * model_e = strstr(model_s, ")"); + if (!model_e) + return false; + std::string model(&model_s[1], (size_t)(model_e - model_s - 1)); + for (int i = 0; *discarded[i] != '\0'; ++i) { + if (strncmp(discarded[i], model.c_str(), strlen(discarded[i])) == 0) + return false; + } + return true; +} + bool System::FindDeviceDescription(std::string& url) { #define IPBC_ADDR "255.255.255.255" @@ -697,7 +719,7 @@ { DBG(DBG_INFO, "%s: server string found (%s)\n", __FUNCTION__, val); _context |= 0x2; - if (strstr(val, "Sonos/")) + if (DeviceMatches(val)) { DBG(DBG_INFO, "%s: search target matches\n", __FUNCTION__); _context |= 0x4; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/sonossystem.h new/noson-2.3.0/noson/src/sonossystem.h --- old/noson-2.2.0/noson/src/sonossystem.h 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/sonossystem.h 2020-01-03 13:34:28.000000000 +0100 @@ -195,6 +195,7 @@ SMServiceList m_smservices; + static bool DeviceMatches(const char * serverString); static bool FindDeviceDescription(std::string& url); void RevokePlayers(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/sonostypes.cpp new/noson-2.3.0/noson/src/sonostypes.cpp --- old/noson-2.2.0/noson/src/sonostypes.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/sonostypes.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -62,3 +62,20 @@ "RINCON_AssociatedZPUDN", "" }; + +AVTProperty::~AVTProperty() +{ +} + +ContentProperty::~ContentProperty() +{ +} + +RCSProperty::~RCSProperty() +{ +} + +SRProperty::~SRProperty() +{ +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/sonostypes.h new/noson-2.3.0/noson/src/sonostypes.h --- old/noson-2.2.0/noson/src/sonostypes.h 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/sonostypes.h 2020-01-03 13:34:28.000000000 +0100 @@ -105,42 +105,45 @@ { public: AVTProperty() - : NumberOfTracks(0) + : EventSEQ(0) + , NumberOfTracks(0) , CurrentTrack(0) , CurrentSection(0) { } - virtual ~AVTProperty() { } + virtual ~AVTProperty(); - std::string TransportState; // PLAYING, STOPPED - std::string CurrentPlayMode; // NORMAL - std::string CurrentCrossfadeMode; // 0 - unsigned NumberOfTracks; // 13 - unsigned CurrentTrack; // 9 - unsigned CurrentSection; // 0 - std::string CurrentTrackURI; // x-file-cifs://server/share/music/track.flac - std::string CurrentTrackDuration; // 0:03:14 - DigitalItemPtr CurrentTrackMetaData; - std::string r_NextTrackURI; // x-file-cifs://server/share/music/track.flac - DigitalItemPtr r_NextTrackMetaData; - std::string r_EnqueuedTransportURI; // x-rincon-playlist:RINCON_000E58343F7201400#A:ALBUMARTIST/artist/album - DigitalItemPtr r_EnqueuedTransportURIMetaData; - std::string PlaybackStorageMedium; // NETWORK - std::string AVTransportURI; // x-rincon-queue:RINCON_000E583F284001400#0 - DigitalItemPtr AVTransportURIMetaData; - std::string NextAVTransportURI; - std::string NextAVTransportURIMetaData; - std::string CurrentTransportActions; // Set, Play, Stop, Pause, Seek, Next, Previous - std::string r_CurrentValidPlayModes; // SHUFFLE,REPEAT,CROSSFADE - std::string r_MuseSessions; - std::string TransportStatus; // OK - std::string r_SleepTimerGeneration; // 0 - std::string r_AlarmRunning; // 0 - std::string r_AlarmIDRunning; - std::string r_AlarmLoggedStartTime; - std::string r_AlarmState; - std::string r_SnoozeRunning; // 0 - std::string r_RestartPending; // 0 - std::string PossiblePlaybackStorageMedia; // NONE, NETWORK + unsigned EventSEQ; + std::string EventSID; + std::string TransportState; // PLAYING, STOPPED + std::string CurrentPlayMode; // NORMAL + std::string CurrentCrossfadeMode; // 0 + unsigned NumberOfTracks; // 13 + unsigned CurrentTrack; // 9 + unsigned CurrentSection; // 0 + std::string CurrentTrackURI; // x-file-cifs://server/share/music/track.flac + std::string CurrentTrackDuration; // 0:03:14 + DigitalItemPtr CurrentTrackMetaData; + std::string r_NextTrackURI; // x-file-cifs://server/share/music/track.flac + DigitalItemPtr r_NextTrackMetaData; + std::string r_EnqueuedTransportURI; // x-rincon-playlist:XXXX#A:ALBUMARTIST/artist/album + DigitalItemPtr r_EnqueuedTransportURIMetaData; + std::string PlaybackStorageMedium; // NETWORK + std::string AVTransportURI; // x-rincon-queue:XX:XXXX + DigitalItemPtr AVTransportURIMetaData; + std::string NextAVTransportURI; + std::string NextAVTransportURIMetaData; + std::string CurrentTransportActions; // Set, Play, Stop, Pause, Seek, Next, Previous + std::string r_CurrentValidPlayModes; // SHUFFLE,REPEAT,CROSSFADE + std::string r_MuseSessions; + std::string TransportStatus; // OK + std::string r_SleepTimerGeneration; // 0 + std::string r_AlarmRunning; // 0 + std::string r_AlarmIDRunning; + std::string r_AlarmLoggedStartTime; + std::string r_AlarmState; + std::string r_SnoozeRunning; // 0 + std::string r_RestartPending; // 0 + std::string PossiblePlaybackStorageMedia; // NONE, NETWORK // NOT IMPLEMENTED //std::string TransportPlaySpeed @@ -156,10 +159,13 @@ { public: ContentProperty() - : ShareIndexInProgress(false) { } + : EventSEQ(0) + , ShareIndexInProgress(false) { } - virtual ~ContentProperty() { } + virtual ~ContentProperty(); + unsigned EventSEQ; + std::string EventSID; std::string SystemUpdateID; bool ShareIndexInProgress; std::string ShareIndexLastError; @@ -178,7 +184,8 @@ { public: RCSProperty() - : VolumeMaster(0) + : EventSEQ(0) + , VolumeMaster(0) , VolumeLF(0) , VolumeRF(0) , MuteMaster(0) @@ -191,8 +198,10 @@ , LoudnessMaster(0) { } - virtual ~RCSProperty() { } + virtual ~RCSProperty(); + unsigned EventSEQ; + std::string EventSID; int VolumeMaster; int VolumeLF; int VolumeRF; @@ -211,7 +220,7 @@ public: SRProperty() {} - virtual ~SRProperty() { } + virtual ~SRProperty(); std::string uuid; std::string subordinateName; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/zonegrouptopology.cpp new/noson-2.3.0/noson/src/zonegrouptopology.cpp --- old/noson-2.2.0/noson/src/zonegrouptopology.cpp 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/zonegrouptopology.cpp 2020-01-03 13:34:28.000000000 +0100 @@ -56,6 +56,7 @@ , m_eventCB(nullptr) , m_msgCount(0) , m_topologyKey(0) +, m_eventSEQ(0) , m_zones(ZoneList()) , m_zonePlayers(ZonePlayerList()) { @@ -69,6 +70,7 @@ , m_eventCB(eventCB) , m_msgCount(0) , m_topologyKey(0) +, m_eventSEQ(0) , m_zones(ZoneList()) , m_zonePlayers(ZonePlayerList()) { @@ -105,8 +107,24 @@ if (m_subscription.GetSID() == msg->subject[0] && msg->subject[2] == "PROPERTY") { DBG(DBG_DEBUG, "%s: %s SEQ=%s %s\n", __FUNCTION__, msg->subject[0].c_str(), msg->subject[1].c_str(), msg->subject[2].c_str()); + + // check for higher sequence + uint32_t seq = 0; + string_to_uint32(msg->subject[1].c_str(), &seq); + if (msg->subject[0] != m_eventSID) + { + m_eventSID = msg->subject[0]; + } + else if (seq < m_eventSEQ) + { + DBG(DBG_DEBUG, "%s: %s SEQ=%u , discarding %u\n", __FUNCTION__, m_eventSID.c_str(), m_eventSEQ, seq); + return; + } + // tracking serial of the event + m_eventSEQ = seq; + std::vector<std::string>::const_iterator it = msg->subject.begin(); - unsigned _key = m_topologyKey; + unsigned _oldKey = m_topologyKey; while (it != msg->subject.end()) { if (*it == "ZoneGroupState") @@ -119,7 +137,7 @@ ++it; } // Event is signaled only on first or any change - if (m_msgCount && _key == m_topologyKey) + if (m_msgCount && _oldKey == m_topologyKey) return; // Signal ++m_msgCount; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/noson-2.2.0/noson/src/zonegrouptopology.h new/noson-2.3.0/noson/src/zonegrouptopology.h --- old/noson-2.2.0/noson/src/zonegrouptopology.h 2019-12-14 18:03:54.000000000 +0100 +++ new/noson-2.3.0/noson/src/zonegrouptopology.h 2020-01-03 13:34:28.000000000 +0100 @@ -69,6 +69,8 @@ EventCB m_eventCB; unsigned m_msgCount; unsigned m_topologyKey; + unsigned m_eventSEQ; + std::string m_eventSID; Locked<ZoneList> m_zones; Locked<ZonePlayerList> m_zonePlayers;
