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;


Reply via email to