mirror of
https://github.com/jwetzell/osc-go.git
synced 2026-07-26 10:28:42 +00:00
70 lines
1.3 KiB
Go
70 lines
1.3 KiB
Go
package osc
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
func (m *OSCMessage) ToBytes() []byte {
|
|
//TODO(jwetzell): add error handling
|
|
oscBuffer := []byte{}
|
|
|
|
oscBuffer = append(oscBuffer, stringToOSCBytes(m.Address)...)
|
|
|
|
var sb strings.Builder
|
|
|
|
sb.WriteString(",")
|
|
|
|
for _, arg := range m.Args {
|
|
sb.WriteString(arg.Type)
|
|
}
|
|
|
|
oscBuffer = append(oscBuffer, stringToOSCBytes(sb.String())...)
|
|
oscBuffer = append(oscBuffer, argsToBuffer(m.Args)...)
|
|
|
|
return oscBuffer
|
|
}
|
|
|
|
func MessageFromBytes(bytes []byte) (*OSCMessage, error) {
|
|
if len(bytes) == 0 {
|
|
return nil, errors.New("cannot create OSC Message from empty byte array")
|
|
}
|
|
if bytes[0] != 47 {
|
|
return nil, errors.New("OSC Message must start with /")
|
|
}
|
|
|
|
address, typeAndArgBytes, err := readOSCString(bytes)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
oscMessage := OSCMessage{
|
|
Address: address,
|
|
Args: []OSCArg{},
|
|
}
|
|
|
|
typeString, argBytes, err := readOSCString(typeAndArgBytes)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for index, oscType := range typeString {
|
|
if index == 0 {
|
|
if oscType != ',' {
|
|
return nil, errors.New("type string is malformed")
|
|
}
|
|
} else {
|
|
oscArg, remainingBytes, error := readOSCArg(argBytes, string(oscType))
|
|
if error != nil {
|
|
return nil, error
|
|
}
|
|
argBytes = remainingBytes
|
|
oscMessage.Args = append(oscMessage.Args, oscArg)
|
|
}
|
|
}
|
|
|
|
return &oscMessage, nil
|
|
}
|