Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ZOSC(3)				  CZMQ Manual			       ZOSC(3)

NAME
       zosc - Class for	work with Open Sound Control messages

SYNOPSIS
       //  This	is a draft class, and may change without notice. It is disabled	in
       //  stable builds by default. If	you use	this in	applications, please ask
       //  for it to be	pushed to stable state.	Use --enable-drafts to enable.
       #ifdef CZMQ_BUILD_DRAFT_API
       //  *** Draft method, for development use, may change without warning ***
       //  Create a new	empty OSC message with the specified address string.
       CZMQ_EXPORT zosc_t *
	   zosc_new (const char	*address);

       //  *** Draft method, for development use, may change without warning ***
       //  Create a new	OSC message from the specified zframe. Takes ownership of
       //  the zframe.
       CZMQ_EXPORT zosc_t *
	   zosc_fromframe (zframe_t *frame);

       //  *** Draft method, for development use, may change without warning ***
       //  Create a new	zosc message from memory. Take ownership of the	memory
       //  and calling free on the data	after construction.
       CZMQ_EXPORT zosc_t *
	   zosc_frommem	(char *data, size_t size);

       //  *** Draft method, for development use, may change without warning ***
       //  Create a new	zosc message from the given format and arguments.
       //  The format type tags	are as follows:
       //    i - 32bit integer
       //    h - 64bit integer
       //    f - 32bit floating	point number (IEEE)
       //    d - 64bit (double)	floating point number
       //    s - string	(NULL terminated)
       //    t = timetag: an OSC timetag in NTP	format (uint64_t)
       //    S - symbol
       //    c - char
       //    m - 4 byte	midi packet (8 digits hexadecimal)
       //    T - TRUE (no value	required)
       //    F - FALSE (no value required)
       //    N - NIL (no value required)
       //    I - Impulse (for triggers)	or INFINITUM (no value required)
       //    b - binary	blob
       CZMQ_EXPORT zosc_t *
	   zosc_create (const char *address, const char	*format, ...);

       //  *** Draft method, for development use, may change without warning ***
       //  Destroy an OSC message
       CZMQ_EXPORT void
	   zosc_destroy	(zosc_t	**self_p);

       //  *** Draft method, for development use, may change without warning ***
       //  Return chunk	data size
       CZMQ_EXPORT size_t
	   zosc_size (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Return OSC chunk data. Caller does not own the data!
       CZMQ_EXPORT byte	*
	   zosc_data (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Return the OSC address string
       CZMQ_EXPORT const char *
	   zosc_address	(zosc_t	*self);

       //  *** Draft method, for development use, may change without warning ***
       //  Return the OSC format of the	message.
       //    i - 32bit integer
       //    h - 64bit integer
       //    f - 32bit floating	point number (IEEE)
       //    d - 64bit (double)	floating point number
       //    s - string	(NULL terminated)
       //    t = timetag: an OSC timetag in NTP	format (uint64_t)
       //    S - symbol
       //    c - char
       //    m - 4 byte	midi packet (8 digits hexadecimal)
       //    T - TRUE (no value	required)
       //    F - FALSE (no value required)
       //    N - NIL (no value required)
       //    I - Impulse (for triggers)	or INFINITUM (no value required)
       //    b - binary	blob
       CZMQ_EXPORT const char *
	   zosc_format (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Append data to the osc message. The format describes	the data that
       //  needs to be appended	in the message.	This essentially relocates all
       //  data!
       //  The format type tags	are as follows:
       //    i - 32bit integer
       //    h - 64bit integer
       //    f - 32bit floating	point number (IEEE)
       //    d - 64bit (double)	floating point number
       //    s - string	(NULL terminated)
       //    t = timetag: an OSC timetag in NTP	format (uint64_t)
       //    S - symbol
       //    c - char
       //    m - 4 byte	midi packet (8 digits hexadecimal)
       //    T - TRUE (no value	required)
       //    F - FALSE (no value required)
       //    N - NIL (no value required)
       //    I - Impulse (for triggers)	or INFINITUM (no value required)
       //    b - binary	blob
       CZMQ_EXPORT int
	   zosc_append (zosc_t *self, const char *format, ...);

       //  *** Draft method, for development use, may change without warning ***
       //  Retrieve the	values provided	by the given format. Note that zosc_retr
       //  creates the objects and the caller must destroy them	when finished.
       //  The supplied	pointers do not	need to	be initialized.	Returns	0 if
       //  successful, or -1 if	it failed to retrieve a	value in which case the
       //  pointers are	not modified. If an argument pointer is	NULL is	skips the
       //  value. See the format method	for a detailed list op type tags for the
       //  format string.
       CZMQ_EXPORT int
	   zosc_retr (zosc_t *self, const char *format,	...);

       //  *** Draft method, for development use, may change without warning ***
       //  Create copy of the message, as new chunk object. Returns a fresh zosc_t
       //  object, or null if there was	not enough heap	memory.	If chunk is null,
       //  returns null.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zosc_t *
	   zosc_dup (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Transform zosc into a zframe	that can be sent in a message.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zframe_t *
	   zosc_pack (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Transform zosc into a zframe	that can be sent in a message.
       //  Take	ownership of the chunk.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zframe_t *
	   zosc_packx (zosc_t **self_p);

       //  *** Draft method, for development use, may change without warning ***
       //  Transform a zframe into a zosc.
       //  Caller owns return value and	must destroy it	when done.
       CZMQ_EXPORT zosc_t *
	   zosc_unpack (zframe_t *frame);

       //  *** Draft method, for development use, may change without warning ***
       //  Dump	OSC message to stdout, for debugging and tracing.
       CZMQ_EXPORT void
	   zosc_print (zosc_t *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Probe the supplied object, and report if it looks like a zosc_t.
       CZMQ_EXPORT bool
	   zosc_is (void *self);

       //  *** Draft method, for development use, may change without warning ***
       //  Return a pointer to the item	at the head of the OSC data.
       //  Sets	the given char argument	to the type tag	of the data.
       //  If the message is empty, returns NULL and the sets the
       //  given char to NULL.
       CZMQ_EXPORT const void *
	   zosc_first (zosc_t *self, char *type);

       //  *** Draft method, for development use, may change without warning ***
       //  Return the next item	of the OSC message. If the list	is empty, returns
       //  NULL. To move to the	start of the OSC message call zosc_first ().
       CZMQ_EXPORT const void *
	   zosc_next (zosc_t *self, char *type);

       //  *** Draft method, for development use, may change without warning ***
       //  Return a pointer to the item	at the tail of the OSC message.
       //  Sets	the given char argument	to the type tag	of the data. If
       //  the message is empty, returns NULL.
       CZMQ_EXPORT const void *
	   zosc_last (zosc_t *self, char *type);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided 32 bit integer from	value at the current cursor position in	the message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_int32 (zosc_t *self, int *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided 64 bit integer from	the value at the current cursor	position in the	message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_int64 (zosc_t *self, int64_t *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided float from the value at the	current	cursor position	in the message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_float (zosc_t *self, float *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided double from	the value at the current cursor	position in the	message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_double (zosc_t *self, double *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided string from	the value at the current cursor	position in the	message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success. Caller owns	the string!
       CZMQ_EXPORT int
	   zosc_pop_string (zosc_t *self, char **val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided char from the value	at the current cursor position in the message.
       //  If the type tag at the current position does	not correspond it will fail and
       //  return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_char (zosc_t *self,	char *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided boolean from the type tag in the message. Booleans are not represented
       //  in the data in the message, only in the type	tag. If	the type tag at	the current
       //  position does not correspond	it will	fail and return	-1. Returns 0 on success.
       CZMQ_EXPORT int
	   zosc_pop_bool (zosc_t *self,	bool *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Set the provided 4 bytes (unsigned 32bit int) from the value	at the current
       //  cursor position in the message. If the type tag at the current position does
       //  not correspond it will fail and return -1. Returns 0	on success.
       CZMQ_EXPORT int
	   zosc_pop_midi (zosc_t *self,	uint32_t *val);

       //  *** Draft method, for development use, may change without warning ***
       //  Self	test of	this class.
       CZMQ_EXPORT void
	   zosc_test (bool verbose);

       #endif // CZMQ_BUILD_DRAFT_API
       Please add '@interface' section in './../src/zosc.c'.

DESCRIPTION
       zosc - work with	Open Sound Control messages

       Please add @discuss section in ./../src/zosc.c.

EXAMPLE
       From zosc_test method.

	   // we need to have packets on the heap
	   char	*p1 = (char *)malloc(40);
	   memcpy(p1, oscpacket, 40);
	   zosc_t *self	= zosc_frommem(p1, 40);
	   assert (self);
	   assert ( zosc_is( self ));
	   assert(streq	( zosc_address(self), "/sample/address"));
	   assert(streq	( zosc_format(self), "iTfs"));
	   // check value
	   uint32_t test = 0;
	   bool	b = false;
	   float f = 0.f;
	   char	*s = "BLA";
	   zosc_retr(self, "iTfs", &test, &b, &f, &s);
	   assert(test == 1);
	   assert(b);
	   assert(fabsf(f - 3.14f) < FLT_EPSILON); // float equal
	   assert(streq(s, "hello"));
	   zstr_free(&s);

	   zosc_destroy	(&self);

	   zframe_t *frame = zframe_new(oscpacket, 40);
	   assert(frame);
	   assert(zframe_size(frame) ==	40);
	   zosc_t *fosc	= zosc_fromframe(frame);
	   assert (fosc);
	   assert(streq	( zosc_address(fosc), "/sample/address"));
	   assert(streq	( zosc_format(fosc), "iTfs"));
	   // test skipping retrieving values
	   zosc_retr(fosc, "iTfs", NULL, NULL, NULL, NULL);
	   char	*fstr =	"";
	   zosc_retr(fosc, "iTfs", NULL, NULL, NULL, &fstr);
	   assert( streq(fstr, "hello")	);
	   zstr_free(&fstr);
	   zosc_destroy	(&fosc);

	   // to the heap, otherwise we	can't destroy
	   char	*p2 = (char *)malloc(48);
	   memcpy(p2, testpack,	48);
	   zosc_t *testmsg = zosc_frommem(p2, 48);
	   assert( testmsg );
	   assert(streq	( zosc_address(testmsg), "/test"));
	   assert(streq	( zosc_format(testmsg),	"ihTfds" ) );
	   // test duplicate
	   zosc_t *testmsgdup =	zosc_dup(NULL);
	   assert( testmsgdup == NULL );
	   testmsgdup =	zosc_dup(testmsg);
	   assert( testmsgdup );
	   assert(streq	( zosc_address(testmsgdup), "/test"));
	   assert(streq	( zosc_format(testmsgdup), "ihTfds" ) );
	   zosc_destroy(&testmsgdup);
	   // check value
	   int itest = -1;
	   int64_t ltest = -1;
	   bool	btest =	false;
	   float ftest = -1.f;
	   double dtest	= -1.;
	   char	*stest;
	   const char *format =	zosc_format(testmsg);
	   zosc_retr(testmsg, format, &itest, &ltest, &btest, &ftest, &dtest, &stest);
	   assert( itest == 2 );
	   assert( ltest == 1844674407370 );
	   assert( btest );
	   assert( fabsf(ftest - 3.14f)	< FLT_EPSILON ); // float equal
	   assert( fabs(dtest -	3.1415926535897932) < DBL_EPSILON );
	   assert( streq(stest,	"hello") );
	   zstr_free(&stest);
	   zosc_destroy(&testmsg);

	   // test constructing	messages
	   int64_t prez	= 3;
	   zosc_t* conm	= zosc_create("/construct", "iihfdscF",	-2,2, prez, 3.14,6.283185307179586, "greetings", 'q');
	   assert(conm);
	   assert(streq(zosc_address(conm), "/construct"));
	   assert(streq(zosc_format(conm), "iihfdscF"));
	   if (verbose)	zosc_print(conm);
	   int x,y;
	   int64_t z;
	   float zz;
	   double zzz;
	   char	*ss = "aliens";
	   char	q = 'z';
	   bool	Ftest =	true;
	   zosc_retr(conm, "iihfdscF", &x, &y, &z, &zz,	&zzz, &ss, &q, &Ftest);
	   assert( x==-2 );
	   assert( y==2	);
	   assert( z==3	);
	   assert( fabsf(zz-3.14f) < FLT_EPSILON );
	   assert( fabs(zzz-6.283185307179586) < DBL_EPSILON );
	   assert( streq( ss, "greetings") );
	   assert( q ==	'q');
	   assert( !Ftest );
	   zstr_free(&ss);

	   // test iterating
	   char	type = '0';
	   const void *data = zosc_first(conm, &type);
	   while ( data	)
	   {
	       if (verbose)
		   zsys_info("type tag is %c", type);

	       switch (type)
	       {
	       case('i'):
	       {
		   int32_t test	= 9;
		   int rc = zosc_pop_int32(conm, &test);
		   assert(rc ==	0);
		   assert( test	== -2 || test == 2);
		   break;
	       }
	       case('h'):
	       {
		   int32_t fail	= 9;
		   int rc = zosc_pop_int32(conm, &fail); // this will fail
		   assert(rc ==	-1);
		   int64_t test	= 9;
		   rc =	zosc_pop_int64(conm, &test);
		   assert(rc ==	0);
		   assert( test	== 3 );
		   break;
	       }
	       case('f'):
	       {
		   float flt_v = 0.f;
		   int rc = zosc_pop_float(conm, &flt_v);
		   assert(rc ==	0);
		   assert( fabsf(flt_v-3.14f) <	FLT_EPSILON );
		   break;
	       }
	       case 'd':
	       {
		   double dbl_v	= 0.;
		   int rc = zosc_pop_double(conm, &dbl_v);
		   assert(rc ==	0);
		   assert( fabs(dbl_v-6.283185307179586) < DBL_EPSILON );
		   break;
	       }
	       case 's':
	       {
		   char	*str;
		   int rc = zosc_pop_string(conm, &str);
		   assert(rc ==	0);
		   assert(streq(str, "greetings"));
		   zstr_free(&str);
		   break;
	       }
	       case 'c':
	       {
		   char	chr;
		   int rc = zosc_pop_char(conm,	&chr);
		   assert(rc ==	0);
		   assert(chr == 'q');
		   break;
	       }
	       case 'F':
	       {
		   bool	bl;
		   int rc = zosc_pop_bool(conm,	&bl);
		   assert(rc ==	0);
		   assert( !bl );
		   break;
	       }
	       default:
		   assert(0);
	       }
	       data = zosc_next(conm, &type);
	   }

	   // test append
	   int64_t preal = -80000;
	   zosc_append(conm, "ih", -200, preal);
	   int ax,ay;
	   int64_t az;
	   float azz;
	   double azzz;
	   char	*ass = "aliens";
	   char	aq = 'z';
	   bool	aFtest = true;
	   int ai = 0;
	   int64_t al =	0;
	   zosc_retr(conm, "iihfdscFih", &ax, &ay, &az,	&azz, &azzz, &ass, &aq,	&aFtest, &ai, &al);
	   assert( ax==-2 );
	   assert( ay==2 );
	   assert( az==3 );
	   assert( fabsf(azz-3.14f) < FLT_EPSILON );
	   assert( fabs(azzz-6.283185307179586)	< DBL_EPSILON );
	   assert( streq( ass, "greetings") );
	   assert( aq == 'q');
	   assert( !aFtest );
	   assert( ai==-200 );
	   assert( al==-80000 );
	   zstr_free(&ass);

	   #ifdef ZMQ_DGRAM
	   zsock_t *dgrams = zsock_new_dgram("udp://*:*");
	   assert (dgrams);
	   zframe_t *t = zosc_pack(conm);
	   zstr_sendm( dgrams, "127.0.0.1:7777"	);
	   zframe_send(	&t, dgrams, 0);
	   zclock_sleep(10); //	slow down, otherwise we've cleaned up before async send
	   zsock_destroy( &dgrams );
	   #else
	   int sockfd;
	   struct sockaddr_in	  servaddr;

	   // Creating socket file descriptor
	   if (	(sockfd	= (int)socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
	       zsys_error("socket creation failed");
	   }

	   memset(&servaddr, 0,	sizeof(servaddr));
	   // Filling server information
	   servaddr.sin_family = AF_INET;
	   servaddr.sin_port = htons(7777);
	   servaddr.sin_addr.s_addr = INADDR_ANY;
	   #ifdef __WINDOWS__
	   sendto(sockfd, (const char *)zosc_data(conm), (int)zosc_size(conm),
		   0, (const struct sockaddr *)	&servaddr,
		       sizeof(servaddr));
	   #else
	   sendto(sockfd, zosc_data(conm), zosc_size(conm),
		   0, (const struct sockaddr *)	&servaddr,
		       sizeof(servaddr));
	   #endif
	   #endif
	   zosc_destroy(&conm);
	   #ifdef __WINDOWS__
	   zsys_shutdown();
	   #endif

AUTHORS
       The czmq	manual was written by the authors in the AUTHORS file.

RESOURCES
       Main web	site:

       Report bugs to the email	<zeromq-dev@lists.zeromq.org[1]>

COPYRIGHT
       Copyright (c) the Contributors as noted in the AUTHORS file. This file
       is part of CZMQ,	the high-level C binding for 0MQ:
       http://czmq.zeromq.org. This Source Code	Form is	subject	to the terms
       of the Mozilla Public License, v. 2.0. If a copy	of the MPL was not
       distributed with	this file, You can obtain one at
       http://mozilla.org/MPL/2.0/. LICENSE included with the czmq
       distribution.

NOTES
	1. zeromq-dev@lists.zeromq.org
	   mailto:zeromq-dev@lists.zeromq.org

CZMQ 4.2.1			  11/01/2025			       ZOSC(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=zosc&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help