/// <summary> /// Send an OscMessage or OscBundle. Data is serialized and no reference is stored, so you can safely /// change values and send packet immediately again. /// Returns success status. /// </summary> public bool Send( OscPacket packet ) { if( !isOpen ) return false; // On any message. if( _onAnyMessage != null ) InvokeAnyMessageEventRecursively( packet ); // Individual messages are always send in bundles at end of frame. if( packet is OscMessage ){ _endOfFrameBuffer.Add( packet as OscMessage ); return true; // Assume success. } // Split bundle case. if( packet.Size() > _udpBufferSize ){ ExtractMessages( packet, _tempMessageQueue ); int bundleByteCount = OscConst.bundleHeaderSize; OscBundle splitBundle = OscPool.GetBundle(); while( _tempMessageQueue.Count > 0 ) { OscMessage message = _tempMessageQueue.Dequeue(); // Check if message is too big. int messageSize = message.Size() + FourByteOscData.byteCount; // Bundle stores size of each message in a 4 byte integer. if( messageSize > _udpBufferSize ){ StringBuilder sb = OscDebug.BuildText( this ); sb.Append( "Failed to send message. Message size at " ); sb.Append( messageSize ); sb.Append( " bytes exceeds udp buffer size at " ); sb.Append( _udpBufferSize ); sb.Append( " bytes. Try increasing the buffer size.'\n" ); Debug.LogWarning( sb.ToString() ); return false; } // If bundle is full, send it and prepare for new bundle. if( bundleByteCount + messageSize > _udpBufferSize ) { if( !Send( splitBundle ) ) return false; bundleByteCount = OscConst.bundleHeaderSize; splitBundle.Clear(); } splitBundle.packets.Add( message ); bundleByteCount += messageSize; } if( splitBundle.packets.Count > 0 && !Send( splitBundle ) ) return false; OscPool.Recycle( splitBundle ); return true; } // Try to pack the message. int index = 0; if( !packet.TryWriteTo( _cache, ref index ) ) return false; //Debug.Log( $"Sending byte count {index}" ); // Send data! return TrySendCache( index ); }