Skip to content

Commit 57dd9a8

Browse files
committed
Use dedicated send and receive buffer to allow simultaneous read/write
1 parent 30b7837 commit 57dd9a8

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

modules/core/src/main/java/com/illposed/osc/transport/channel/OSCDatagramChannel.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,58 +52,60 @@ public OSCDatagramChannel(
5252
this.serializerBuilder = serializerAndParserBuilder;
5353
}
5454

55-
public OSCPacket read(final ByteBuffer buffer) throws IOException, OSCParseException {
55+
public OSCPacket read(final ByteBuffer recvBuffer) throws IOException, OSCParseException {
5656

5757
boolean completed = false;
5858
OSCPacket oscPacket;
5959
try {
6060
begin();
6161

62-
buffer.clear();
62+
recvBuffer.clear();
6363
// NOTE From the doc of `read()` and `receive()`:
6464
// "If there are fewer bytes remaining in the buffer
6565
// than are required to hold the datagram
6666
// then the remainder of the datagram is silently discarded."
6767
if (underlyingChannel.isConnected()) {
68-
underlyingChannel.read(buffer);
68+
underlyingChannel.read(recvBuffer);
6969
} else {
70-
underlyingChannel.receive(buffer);
70+
underlyingChannel.receive(recvBuffer);
7171
}
7272
// final int readBytes = buffer.position();
7373
// if (readBytes == buffer.capacity()) {
7474
// // TODO In this case it is very likely that the buffer was actually too small, and the remainder of the datagram/packet was silently discarded. We might want to give a warning, like throw an exception in this case, but whether this happens should probably be user configurable.
7575
// }
76-
buffer.flip();
77-
if (buffer.limit() == 0) {
78-
throw new OSCParseException("Received a packet without any data", buffer);
76+
recvBuffer.flip();
77+
if (recvBuffer.limit() == 0) {
78+
throw new OSCParseException("Received a packet without any data", recvBuffer);
7979
} else {
80-
oscPacket = parser.convert(buffer);
80+
oscPacket = parser.convert(recvBuffer);
8181
completed = true;
8282
}
83+
recvBuffer.flip();
8384
} finally {
8485
end(completed);
8586
}
8687

8788
return oscPacket;
8889
}
8990

90-
public void send(final ByteBuffer buffer, final OSCPacket packet, final SocketAddress remoteAddress) throws IOException, OSCSerializeException {
91+
public void send(final ByteBuffer sendBuffer, final OSCPacket packet, final SocketAddress remoteAddress) throws IOException, OSCSerializeException {
9192

9293
boolean completed = false;
9394
try {
9495
begin();
9596

96-
final OSCSerializer serializer = serializerBuilder.buildSerializer(new BufferBytesReceiver(buffer));
97-
buffer.rewind();
97+
final OSCSerializer serializer = serializerBuilder.buildSerializer(new BufferBytesReceiver(sendBuffer));
98+
sendBuffer.rewind();
9899
serializer.write(packet);
99-
buffer.flip();
100+
sendBuffer.flip();
100101
if (underlyingChannel.isConnected()) {
101-
underlyingChannel.write(buffer);
102+
underlyingChannel.write(sendBuffer);
102103
} else if (remoteAddress == null) {
103104
throw new IllegalStateException("Not connected and no remote address is given");
104105
} else {
105-
underlyingChannel.send(buffer, remoteAddress);
106+
underlyingChannel.send(sendBuffer, remoteAddress);
106107
}
108+
sendBuffer.flip();
107109
completed = true;
108110
} finally {
109111
end(completed);

modules/core/src/main/java/com/illposed/osc/transport/udp/UDPTransport.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public class UDPTransport implements Transport {
3434
* incoming datagram data size.
3535
*/
3636
public static final int BUFFER_SIZE = 65507;
37-
private final ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
37+
private final ByteBuffer recvBuffer = ByteBuffer.allocate(BUFFER_SIZE);
38+
private final ByteBuffer sendBuffer = ByteBuffer.allocate(BUFFER_SIZE);
3839

3940
private final SocketAddress local;
4041
private final SocketAddress remote;
@@ -131,12 +132,12 @@ public void close() throws IOException {
131132

132133
@Override
133134
public void send(final OSCPacket packet) throws IOException, OSCSerializeException {
134-
oscChannel.send(buffer, packet, remote);
135+
oscChannel.send(sendBuffer, packet, remote);
135136
}
136137

137138
@Override
138139
public OSCPacket receive() throws IOException, OSCParseException {
139-
return oscChannel.read(buffer);
140+
return oscChannel.read(recvBuffer);
140141
}
141142

142143
@Override

0 commit comments

Comments
 (0)