@@ -30,6 +30,8 @@ import CocoaAsyncSocket
3030/// An E1.31-2018 sACN Source which Transmits sACN Messages.
3131final public class sACNSource {
3232
33+ private typealias UniverseData = ( universeNumber: UInt16 , data: Data )
34+
3335 // MARK: Socket
3436
3537 /// The Internet Protocol version(s) used by the source.
@@ -464,11 +466,7 @@ final public class sACNSource {
464466
465467 if _isListening {
466468 if let internalUniverse = universes. first ( where: { $0. number == number } ) {
467- // terminate this universe on all sockets, removing the universe, but keeping the sockets
468- let socketIds = sockets. reduce ( into: [ String: Bool] ( ) ) { dict, socket in
469- dict [ socket. key] = false
470- }
471- socketsShouldTerminate = socketIds
469+ // terminate this universe on all sockets
472470 internalUniverse. terminate ( remove: true )
473471 }
474472 } else {
@@ -809,6 +807,8 @@ private extension sACNSource {
809807 }
810808 }
811809
810+ socketsShouldTerminate. removeAll ( )
811+
812812 // termination of all universes to be removed is complete
813813 if self . shouldTerminate {
814814 // the source should terminate
@@ -847,8 +847,8 @@ private extension sACNSource {
847847 universesReadyForSocketRemoval. forEach { $0. terminateSocketsComplete ( ) }
848848 }
849849
850- var universeMessages = [ ( universeNumber : UInt16 , data : Data ) ] ( )
851- var socketTerminationMessages = [ ( universeNumber : UInt16 , data : Data ) ] ( )
850+ var universeMessages = [ UniverseData ] ( )
851+ var socketTerminationMessages = [ UniverseData ] ( )
852852
853853 let rootLayer = rootLayer
854854
@@ -883,17 +883,27 @@ private extension sACNSource {
883883
884884 let levels = rootLayer+ framingLayer+ dmpLayer
885885
886- if !socketsShouldTerminate. isEmpty {
886+ let terminationUniverse : UniverseData ?
887+ if !socketsShouldTerminate. isEmpty || ( universe. shouldTerminate && universe. dirtyCounter > 0 ) {
887888 let framingOptions : DataFramingLayer . Options = [ . terminated]
888889 var framingLayer = universe. framingLayer
889890 framingLayer. replacingSequence ( with: universe. sequence)
890891 framingLayer. replacingOptions ( with: framingOptions)
891892 let levels = rootLayer+ framingLayer+ dmpLayer
892- socketTerminationMessages. append ( ( universeNumber: universe. number, data: levels) )
893+ terminationUniverse = UniverseData ( universeNumber: universe. number, data: levels)
894+ } else {
895+ terminationUniverse = nil
893896 }
894897
895- if _shouldOutput || ( universe. shouldTerminate && universe. dirtyCounter > 0 ) {
896- universeMessages. append ( ( universeNumber: universe. number, data: levels) )
898+ if !socketsShouldTerminate. isEmpty, let terminationUniverse {
899+ socketTerminationMessages. append ( terminationUniverse)
900+ }
901+
902+ if universe. shouldTerminate && universe. dirtyCounter > 0 , let terminationUniverse {
903+ universeMessages. append ( terminationUniverse)
904+ universe. incrementSequence ( )
905+ } else if _shouldOutput {
906+ universeMessages. append ( UniverseData ( universeNumber: universe. number, data: levels) )
897907 universe. incrementSequence ( )
898908 }
899909 universe. decrementDirty ( )
0 commit comments