- java.lang.Object
-
- org.praxislive.internal.osc.OSCPacket
-
- org.praxislive.internal.osc.OSCBundle
-
public class OSCBundle extends OSCPacket
Implementation of the OSC-Bundle which assembles several OSC-Packets under the same timetag. See opensoundcontrol.org/spec-1_0 for the specification of the bundle format.The bundle time can be calculated in different ways: specifying a
longwhich represents the milliseconds since 1 jan 1970 as returned bySystem.currentTimeMillis(), produces the required network time tag as required by the OSC specification. Alternatively, using afloatfor a relative time offset in seconds can be used when running SuperCollider in offline mode. Third, there is a version that calculates a sample accurate time tag. However, scsynth doesn't process bundles with this accuracy, so it's kind of useless.To assemble a bundle, you create a new instance of
OSCBundle, calladdPacketone or several times, then write the contents of the bundle to aByteBufferusing the methodencode. The byte buffer can then be written to aDatagramChannel. Here is an example:OSCBundle bndl; DatagramChannel dch = null; final ByteBuffer buf = ByteBuffer.allocateDirect( 1024 ); final SocketAddress addr = new InetSocketAddress( "localhost", 57110 ); final long serverLatency = 50; final long now = System.currentTimeMillis() + serverLatency; try { dch = DatagramChannel.open(); dch.configureBlocking( true ); bndl = new OSCBundle( now ); bndl.addPacket( new OSCMessage( "/s_new", new Object[] { "default", new Integer( 1001 ), new Integer( 1 ), new Integer( 0 ), "out", new Integer( 0 ), "freq", new Float( 666 ), "amp", new Float( 0.1f )})); bndl.encode( buf ); buf.flip(); dch.send( buf, addr ); buf.clear(); bndl = new OSCBundle( now + 2000 ); // two seconds later bndl.addPacket( new OSCMessage( "/n_free", new Object[] { new Integer( 1001 )})); bndl.encode( buf ); buf.flip(); dch.send( buf, addr ); } catch( IOException e2 ) { System.err.println( e2.getLocalizedMessage() ); } finally { if( dch != null ) { try { dch.close(); } catch( IOException e4 ) {}; } }Note that this example uses the old way of sending messages. A easier way is to create anOSCTransmitterwhich handles the byte buffer for you. See theOSCReceiverdoc for an example using a dedicated transmitter.- Version:
- 0.33, 28-Apr-07
- Author:
- Hanns Holger Rutz
- See Also:
OSCReceiver
-
-
Field Summary
Fields Modifier and Type Field Description protected ListcollPacketsstatic longNOWThe special timetag value to indicate that the bundle be processed as soon as possiblestatic StringTAGThis is the initial string of an OSC bundle datagram
-
Constructor Summary
Constructors Constructor Description OSCBundle()Creates a new empty OSCBundle with timetag set to "immediately".OSCBundle(double when)Creates a new empty OSCBundle with timetag specified by 'when' which is seconds relative to start of session.OSCBundle(long when)Creates a new empty OSCBundle with timetag specified by 'when' which is milliseconds since 1 jan 1970 as returned by System.currentTimeMillis().OSCBundle(long absMillisOffset, long sampleFrames, int sampleRate)Creates a new empty OSCBundle with timetag specified by a sample frame offset and an absolute time in milliseconds since 1 jan 1970 as returned bySystem.currentTimeMillis()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddPacket(OSCPacket p)Adds a newOSCPacketto the tail of the bundle.OSCPacketgetPacket(int idx)Gets theOSCPacketat the provided index which must be between 0 inclusive andgetPacketCount()exclusive.intgetPacketCount()Returns the number of packets currently assembled in this bundle.longgetTimeTag()Returns the raw format time tag of the bundlevoidremovePacket(int idx)Removes the specified packetvoidsetTimeTagAbsMillis(long when)Sets the bundle's timetag specified by a long which is milliseconds since 1 jan 1970 as returned bySystem.currentTimeMillis().voidsetTimeTagRaw(long raw)voidsetTimeTagRelSecs(double when)Sets the bundle's timetag specified by a double which is seconds relative to start of session.voidsetTimeTagSamples(long absMillisOffset, long sampleFrames, int sampleRate)Sets the bundle's timetag as a combination of system absolute time and sample offset.-
Methods inherited from class org.praxislive.internal.osc.OSCPacket
decode, encode, encode, getSize, getSize, printHexOn, printTextOn
-
-
-
-
Field Detail
-
TAG
public static final String TAG
This is the initial string of an OSC bundle datagram- See Also:
- Constant Field Values
-
NOW
public static final long NOW
The special timetag value to indicate that the bundle be processed as soon as possible- See Also:
- Constant Field Values
-
collPackets
protected final List collPackets
-
-
Constructor Detail
-
OSCBundle
public OSCBundle()
Creates a new empty OSCBundle with timetag set to "immediately". SuperCollider recognizes this special timetime to process the bundle just when it arrives.
-
OSCBundle
public OSCBundle(long when)
Creates a new empty OSCBundle with timetag specified by 'when' which is milliseconds since 1 jan 1970 as returned by System.currentTimeMillis(). This is converted into an absolute time offset since 1 jan 1900 as required by the OSC specs.- Parameters:
when- absolute time tag for the bundle- See Also:
System.currentTimeMillis()
-
OSCBundle
public OSCBundle(double when)
Creates a new empty OSCBundle with timetag specified by 'when' which is seconds relative to start of session. This relative time offset with origin of zero is understood by SuperCollider in NonRealTime mode. (see example in Non-Realtime-Synthesis.rtf).- Parameters:
when- relative time tag for the bundle
-
OSCBundle
public OSCBundle(long absMillisOffset, long sampleFrames, int sampleRate)Creates a new empty OSCBundle with timetag specified by a sample frame offset and an absolute time in milliseconds since 1 jan 1970 as returned bySystem.currentTimeMillis()- Parameters:
absMillisOffset- time offset as returned bySystem.currentTimeMillissampleFrames- this offset is added to the milli second offset.sampleRate- used in conjunction withsampleFramesto calculate the time offset.
-
-
Method Detail
-
addPacket
public void addPacket(OSCPacket p)
Adds a newOSCPacketto the tail of the bundle. Passingnullis allowed in which case no action is performed.- Parameters:
p- the packet to add to the tail of the bundle
-
getPacket
public OSCPacket getPacket(int idx)
Gets theOSCPacketat the provided index which must be between 0 inclusive andgetPacketCount()exclusive. If bundles are nested, each nested bundle will count as one packet of course.- Parameters:
idx- index of the packet to get- Returns:
- packet at index
idx
-
getPacketCount
public int getPacketCount()
Returns the number of packets currently assembled in this bundle. If bundles are nested, each nested bundle will count as one packet of course.- Returns:
- number of packets assembled in this bundle
-
removePacket
public void removePacket(int idx)
Removes the specified packet- Parameters:
idx- the index of the packet to remove
-
setTimeTagAbsMillis
public void setTimeTagAbsMillis(long when)
Sets the bundle's timetag specified by a long which is milliseconds since 1 jan 1970 as returned bySystem.currentTimeMillis(). This is converted into an absolute time offset since 1 jan 1900 as required by the OSC specs.- Parameters:
when- absolute time tag for the bundle- See Also:
System.currentTimeMillis()
-
setTimeTagRaw
public void setTimeTagRaw(long raw)
-
setTimeTagRelSecs
public void setTimeTagRelSecs(double when)
Sets the bundle's timetag specified by a double which is seconds relative to start of session. This relative time offset with origin of zero is understood by SuperCollider in NonRealTime mode. (see example in Non-Realtime-Synthesis.rtf).- Parameters:
when- relative time tag for the bundle
-
setTimeTagSamples
public void setTimeTagSamples(long absMillisOffset, long sampleFrames, int sampleRate)Sets the bundle's timetag as a combination of system absolute time and sample offset. note that this is not too useful, because supercollider will execute OSC bundles not with audiorate but controlrate precision!!- Parameters:
absMillisOffset- time offset as returned bySystem.currentTimeMillissampleFrames- this offset is added to the milli second offset.sampleRate- used in conjunction withsampleFramesto calculate the time offset.
-
getTimeTag
public long getTimeTag()
Returns the raw format time tag of the bundle- Returns:
- the bundle's timetag in OSC format
-
-