@@ -20,6 +20,7 @@ type UDPConn struct {
20
20
udpConn
21
21
closeChan chan struct {}
22
22
ctx context.Context
23
+ errChan chan error
23
24
}
24
25
25
26
// DialUDP creates a new OSC connection over UDP.
@@ -37,6 +38,7 @@ func DialUDPContext(ctx context.Context, network string, laddr, raddr *net.UDPAd
37
38
udpConn : conn ,
38
39
closeChan : make (chan struct {}),
39
40
ctx : ctx ,
41
+ errChan : make (chan error ),
40
42
}, nil
41
43
}
42
44
@@ -55,6 +57,7 @@ func ListenUDPContext(ctx context.Context, network string, laddr *net.UDPAddr) (
55
57
udpConn : conn ,
56
58
closeChan : make (chan struct {}),
57
59
ctx : ctx ,
60
+ errChan : make (chan error ),
58
61
}, nil
59
62
}
60
63
@@ -94,9 +97,7 @@ func (conn *UDPConn) Serve(dispatcher Dispatcher) error {
94
97
95
98
go func () {
96
99
for {
97
- if err := conn .serve (dispatcher ); err != nil {
98
- errChan <- err
99
- }
100
+ conn .serve (dispatcher , errChan )
100
101
}
101
102
}()
102
103
@@ -112,36 +113,38 @@ func (conn *UDPConn) Serve(dispatcher Dispatcher) error {
112
113
}
113
114
114
115
// serve retrieves OSC packets.
115
- func (conn * UDPConn ) serve (dispatcher Dispatcher ) error {
116
+ func (conn * UDPConn ) serve (dispatcher Dispatcher , errChan chan error ) {
116
117
data := make ([]byte , readBufSize )
117
118
118
119
_ , sender , err := conn .ReadFromUDP (data )
119
120
if err != nil {
120
- return err
121
+ errChan <- err
121
122
}
122
123
123
124
switch data [0 ] {
124
125
case BundleTag [0 ]:
125
- bundle , err := ParseBundle (data , sender )
126
- if err != nil {
127
- return err
128
- }
129
- if err := dispatcher .Dispatch (bundle ); err != nil {
130
- return errors .Wrap (err , "dispatch bundle" )
131
- }
126
+ go func () {
127
+ bundle , err := ParseBundle (data , sender )
128
+ if err != nil {
129
+ errChan <- err
130
+ }
131
+ if err := dispatcher .Dispatch (bundle ); err != nil {
132
+ errChan <- errors .Wrap (err , "dispatch bundle" )
133
+ }
134
+ }()
132
135
case MessageChar :
133
- msg , err := ParseMessage (data , sender )
134
- if err != nil {
135
- return err
136
- }
137
- if err := dispatcher .Invoke (msg ); err != nil {
138
- return errors .Wrap (err , "dispatch message" )
139
- }
136
+ go func () {
137
+ msg , err := ParseMessage (data , sender )
138
+ if err != nil {
139
+ errChan <- err
140
+ }
141
+ if err := dispatcher .Invoke (msg ); err != nil {
142
+ errChan <- errors .Wrap (err , "dispatch message" )
143
+ }
144
+ }()
140
145
default :
141
- return ErrParse
146
+ errChan <- ErrParse
142
147
}
143
-
144
- return nil
145
148
}
146
149
147
150
// SetContext sets the context associated with the conn.
0 commit comments