go-osc: github.com/hypebeast/go-osc/osc Index | Files

package osc

import "github.com/hypebeast/go-osc/osc"

Package osc provides a client and server for sending and receiving OpenSoundControl messages.

The package is implemented in pure Go.

The implementation is based on the Open Sound Control 1.0 Specification (http://opensoundcontrol.org/spec-1_0).

Open Sound Control (OSC) is an open, transport-independent, message-based protocol developed for communication among computers, sound synthesizers, and other multimedia devices.

Features: - Supports OSC messages with 'i' (Int32), 'f' (Float32),

's' (string), 'b' (blob / binary data), 'h' (Int64), 't' (OSC timetag),
 'd' (Double/int64), 'T' (True), 'F' (False), 'N' (Nil) types.

- OSC bundles, including timetags - Support for OSC address pattern including '*', '?', '{,}' and '[]' wildcards - TODO: Describe registering methods

This OSC implementation uses the UDP protocol for sending and receiving OSC packets.

The unit of transmission of OSC is an OSC Packet. Any application that sends OSC Packets is an OSC Client; any application that receives OSC Packets is an OSC Server.

An OSC packet consists of its contents, a contiguous block of binary data, and its size, the number of 8-bit bytes that comprise the contents. The size of an OSC packet is always a multiple of 4.

OSC packets come in two flavors:

OSC Messages: An OSC message consists of an OSC address pattern, followed by an OSC Type Tag String, and finally by zero or more OSC arguments.

OSC Bundles: An OSC Bundle consists of the string "#bundle" followed by an OSC Time Tag, followed by zero or more OSC bundle elements. Each bundle element can be another OSC bundle (note this recursive definition: bundle may contain bundles) or OSC message.

An OSC bundle element consists of its size and its contents. The size is an int32 representing the number of 8-bit bytes in the contents, and will always be a multiple of 4. The contents are either an OSC Message or an OSC Bundle.

The following argument types are supported: 'i' (Int32), 'f' (Float32), 's' (string), 'b' (blob / binary data), 'h' (Int64), 't' (OSC timetag), 'd' (Double/int64), 'T' (True), 'F' (False), 'N' (Nil).

go-osc supports the following OSC address patterns: - '*', '?', '{,}' and '[]' wildcards.

Usage

OSC client example:

client := osc.NewClient("localhost", 8765)
msg := osc.NewMessage("/osc/address")
msg.Append(int32(111))
msg.Append(true)
msg.Append("hello")
client.Send(msg)

OSC server example:

addr := "127.0.0.1:8765"
server := &osc.Server{Addr: addr}

server.Handle("/message/address", func(msg *osc.Message) {
   osc.PrintMessage(msg)
})

server.ListenAndServe()

Package osc provides a package for sending and receiving OpenSoundControl messages. The package is implemented in pure Go.

Index

Package Files

doc.go osc.go

func PrintMessage Uses

func PrintMessage(msg *Message)

PrintMessage pretty prints an OSC message to the standard output.

type Bundle Uses

type Bundle struct {
    Timetag  Timetag
    Messages []*Message
    Bundles  []*Bundle
}

Bundle represents an OSC bundle. It consists of the OSC-string "#bundle" followed by an OSC Time Tag, followed by zero or more OSC bundle/message elements. The OSC-timetag is a 64-bit fixed point time tag. See http://opensoundcontrol.org/spec-1_0 for more information.

func NewBundle Uses

func NewBundle(time time.Time) *Bundle

NewBundle returns an OSC Bundle. Use this function to create a new OSC Bundle.

func (*Bundle) Append Uses

func (b *Bundle) Append(pck Packet) error

Append appends an OSC bundle or OSC message to the bundle.

func (*Bundle) MarshalBinary Uses

func (b *Bundle) MarshalBinary() ([]byte, error)

MarshalBinary serializes the OSC bundle to a byte array with the following format: 1. Bundle string: '#bundle' 2. OSC timetag 3. Length of first OSC bundle element 4. First bundle element 5. Length of n OSC bundle element 6. n bundle element

type Client Uses

type Client struct {
    // contains filtered or unexported fields
}

Client enables you to send OSC packets. It sends OSC messages and bundles to the given IP address and port.

func NewClient Uses

func NewClient(ip string, port int) *Client

NewClient creates a new OSC client. The Client is used to send OSC messages and OSC bundles over an UDP network connection. The `ip` argument specifies the IP address and `port` defines the target port where the messages and bundles will be send to.

func (*Client) IP Uses

func (c *Client) IP() string

IP returns the IP address.

func (*Client) Port Uses

func (c *Client) Port() int

Port returns the port.

func (*Client) Send Uses

func (c *Client) Send(packet Packet) error

Send sends an OSC Bundle or an OSC Message.

func (*Client) SetIP Uses

func (c *Client) SetIP(ip string)

SetIP sets a new IP address.

func (*Client) SetLocalAddr Uses

func (c *Client) SetLocalAddr(ip string, port int) error

SetLocalAddr sets the local address.

func (*Client) SetPort Uses

func (c *Client) SetPort(port int)

SetPort sets a new port.

type Dispatcher Uses

type Dispatcher interface {
    Dispatch(packet Packet)
}

Dispatcher is an interface for an OSC message dispatcher. A dispatcher is responsible for dispatching received OSC messages.

type Handler Uses

type Handler interface {
    HandleMessage(msg *Message)
}

Handler is an interface for message handlers. Every handler implementation for an OSC message must implement this interface.

type HandlerFunc Uses

type HandlerFunc func(msg *Message)

HandlerFunc implements the Handler interface. Type definition for an OSC handler function.

func (HandlerFunc) HandleMessage Uses

func (f HandlerFunc) HandleMessage(msg *Message)

HandleMessage calls itself with the given OSC Message. Implements the Handler interface.

type Message Uses

type Message struct {
    Address   string
    Arguments []interface{}
}

Message represents a single OSC message. An OSC message consists of an OSC address pattern and zero or more arguments.

func NewMessage Uses

func NewMessage(addr string, args ...interface{}) *Message

NewMessage returns a new Message. The address parameter is the OSC address.

func (*Message) Append Uses

func (msg *Message) Append(args ...interface{})

Append appends the given arguments to the arguments list.

func (*Message) Clear Uses

func (msg *Message) Clear()

Clear clears the OSC address and all arguments.

func (*Message) ClearData Uses

func (msg *Message) ClearData()

ClearData removes all arguments from the OSC Message.

func (*Message) CountArguments Uses

func (msg *Message) CountArguments() int

CountArguments returns the number of arguments.

func (*Message) Equals Uses

func (msg *Message) Equals(m *Message) bool

Equals returns true if the given OSC Message `m` is equal to the current OSC Message. It checks if the OSC address and the arguments are equal. Returns true if the current object and `m` are equal.

func (*Message) MarshalBinary Uses

func (msg *Message) MarshalBinary() ([]byte, error)

MarshalBinary serializes the OSC message to a byte buffer. The byte buffer has the following format: 1. OSC Address Pattern 2. OSC Type Tag String 3. OSC Arguments

func (*Message) Match Uses

func (msg *Message) Match(addr string) bool

Match returns true, if the address of the OSC Message matches the given address. The match is case sensitive!

func (*Message) String Uses

func (msg *Message) String() string

String implements the fmt.Stringer interface.

func (*Message) TypeTags Uses

func (msg *Message) TypeTags() (string, error)

TypeTags returns the type tag string.

type OscDispatcher Uses

type OscDispatcher struct {
    // contains filtered or unexported fields
}

OscDispatcher is a dispatcher for OSC packets. It handles the dispatching of received OSC packets.

func NewOscDispatcher Uses

func NewOscDispatcher() *OscDispatcher

NewOscDispatcher returns an OscDispatcher.

func (*OscDispatcher) AddMsgHandler Uses

func (s *OscDispatcher) AddMsgHandler(addr string, handler HandlerFunc) error

AddMsgHandler adds a new message handler for the given OSC address.

func (*OscDispatcher) Dispatch Uses

func (s *OscDispatcher) Dispatch(packet Packet)

Dispatch dispatches OSC packets. Implements the Dispatcher interface.

type Packet Uses

type Packet interface {
    encoding.BinaryMarshaler
}

Packet is the interface for Message and Bundle.

func ParsePacket Uses

func ParsePacket(msg string) (Packet, error)

ParsePacket parses the given msg string and returns a Packet

type Server Uses

type Server struct {
    Addr        string
    Dispatcher  *OscDispatcher
    ReadTimeout time.Duration
}

Server represents an OSC server. The server listens on Address and Port for incoming OSC packets and bundles.

func (*Server) Handle Uses

func (s *Server) Handle(addr string, handler HandlerFunc) error

Handle registers a new message handler function for an OSC address. The handler is the function called for incoming OscMessages that match 'address'.

func (*Server) ListenAndServe Uses

func (s *Server) ListenAndServe() error

ListenAndServe retrieves incoming OSC packets and dispatches the retrieved OSC packets.

func (*Server) ReceivePacket Uses

func (s *Server) ReceivePacket(c net.PacketConn) (Packet, error)

ReceivePacket listens for incoming OSC packets and returns the packet if one is received.

func (*Server) Serve Uses

func (s *Server) Serve(c net.PacketConn) error

Serve retrieves incoming OSC packets from the given connection and dispatches retrieved OSC packets. If something goes wrong an error is returned.

type Timetag Uses

type Timetag struct {
    MinValue uint64 // Minimum value of an OSC Time Tag. Is always 1.
    // contains filtered or unexported fields
}

Timetag represents an OSC Time Tag. An OSC Time Tag is defined as follows: Time tags are represented by a 64 bit fixed point number. The first 32 bits specify the number of seconds since midnight on January 1, 1900, and the last 32 bits specify fractional parts of a second to a precision of about 200 picoseconds. This is the representation used by Internet NTP timestamps.

func NewTimetag Uses

func NewTimetag(timeStamp time.Time) *Timetag

NewTimetag returns a new OSC time tag object.

func NewTimetagFromTimetag Uses

func NewTimetagFromTimetag(timetag uint64) *Timetag

NewTimetagFromTimetag creates a new Timetag from the given `timetag`.

func (*Timetag) ExpiresIn Uses

func (t *Timetag) ExpiresIn() time.Duration

ExpiresIn calculates the number of seconds until the current time is the same as the value of the time tag. It returns zero if the value of the time tag is in the past.

func (*Timetag) FractionalSecond Uses

func (t *Timetag) FractionalSecond() uint32

FractionalSecond returns the last 32 bits of the OSC time tag. Specifies the fractional part of a second.

func (*Timetag) MarshalBinary Uses

func (t *Timetag) MarshalBinary() ([]byte, error)

MarshalBinary converts the OSC time tag to a byte array.

func (*Timetag) SecondsSinceEpoch Uses

func (t *Timetag) SecondsSinceEpoch() uint32

SecondsSinceEpoch returns the first 32 bits (the number of seconds since the midnight 1900) from the OSC time tag.

func (*Timetag) SetTime Uses

func (t *Timetag) SetTime(time time.Time)

SetTime sets the value of the OSC time tag.

func (*Timetag) Time Uses

func (t *Timetag) Time() time.Time

Time returns the time.

func (*Timetag) TimeTag Uses

func (t *Timetag) TimeTag() uint64

TimeTag returns the time tag value

Package osc imports 11 packages (graph) and is imported by 6 packages. Updated 2018-12-01. Refresh now. Tools for package owners.