Update of /cvsroot/pure-data/externals/pdogg/oggcast~ In directory sc8-pr-cvs1:/tmp/cvs-serv17605/oggcast~
Modified Files: HISTORY codec.h help-oggcast~.pd oggcast~.c readme vorbisenc.h Log Message: recommitting olaf's sources from 0.25
Index: HISTORY =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/HISTORY,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** HISTORY 23 Apr 2003 10:36:25 -0000 1.2 --- HISTORY 4 Jan 2004 12:16:07 -0000 1.3 *************** *** 1,70 **** ! Version history of oggcast~ external for pure-data ! ! v 0.2h (27th March 2003): ! - added HTTP base auth login for (alpha) Icecast2 server: ! message 'server 1' switches to Icecast2, 'server 0' back ! top JRoar and PeerCast compatibility (which is the default) ! ! v 0.2g (3rd August 2002): ! - finally fixed the bug that made oggcast~ crash after a ! while. seems to be realted with output from child thread ! using t_clocks but couldn't proove that ! ! v 0.2f (20st july 2002): ! - recompiled with the final 1.0 release of Ogg Vorbis ! - changed the URL to the new akustische-kunst.org domain ! ! v 0.2e (5th july 2002): ! - added simple downsampling to stream at lower sample rates ! ! v 0.2d (21st june 2002 - stable release!): ! - cleaned up code a bit ! - now clean disconnect in case server dies or closes ! socket ! ! v 0.2c (13th june 2002): ! - fixed some small bugs ! - buffer size now in kbytes per channel ! - some more info-printout ! ! v 0.2b (12th june 2002): ! - completetly rewritten multithreaded version, first ! sort-of-stable release ! - KNOWN BUG: eats too much CPU power ! ! v 0.1g (23rd feb. 2002, not for public use!): ! - added multithreading functionality: now sending data ! to server in a second thread ! - now included the static ogg vorbis libraries - no dll's ! needed under win any longer ! - fixed a bug that sometimes made pd crash ! ! v 0.1f (11th feb. 2002): ! - converted ringbuffer to simple buffer of fixed size ! ! v 0.1e (10th feb. 2002): ! - now really fixed the bug that made pd die when server ! disconnected ! ! v 0.1d (9th feb. 2002): ! - fixed a bug in the "vorbis" setting that made on-the-run ! changes impossible ! - introduced a function to check writeability of the socket ! - fixed the bug that crashed pd due to an access violation ! in vorbis.dll when send() returned an error (more of a ! fast workaround) ! - corrected bitrate setting, now it really is _k_bps ! ! ! v 0.1c (9th feb. 2002): ! - added support for setting / changing the comment tags in ! the ogg/vorbis header, spaces have to be replaced by '=' ! - fixed a bug in oggcast_stream() that made Pd crash - now ! it's vorbis.dll that makes Pd crash... ;-( ! ! v 0.1b (not released): ! - added support for changing encoder settings when stream ! is running (no need to disconnect), seems to be unstable ! on linux (with JRoar) ! v 0.1: first public release --- 1,83 ---- ! Version history of oggcast~ external for pure-data ! ! v 0.2k (29th Sept. 2003): ! - fixed a bug in multichannel support ! - fixed a memory leak in Icecast2 login ! ! v 0.2i (13th September 2003): ! - updated login scheme to work with latest Icecast2 server ! from CVS (tested on Windows and Debian Linux) ! - changed handling of comment tags: it's no longer necessarry ! to replace spaces with underscores! Just use spaces for spaces. ! - fixed (no: avoided!) the bug that deleted underscores from ! the Pd patch ! - made Icecast2 login the default scheme ! ! v 0.2h (27th March 2003): ! - added HTTP base auth login for (alpha) Icecast2 server: ! message 'server 1' switches to Icecast2, 'server 0' back ! top JRoar and PeerCast compatibility (which is the default) ! ! v 0.2g (3rd August 2002): ! - finally fixed the bug that made oggcast~ crash after a ! while. seems to be realted with output from child thread ! using t_clocks but couldn't proove that ! ! v 0.2f (20st july 2002): ! - recompiled with the final 1.0 release of Ogg Vorbis ! - changed the URL to the new akustische-kunst.org domain ! ! v 0.2e (5th july 2002): ! - added simple downsampling to stream at lower sample rates ! ! v 0.2d (21st june 2002 - stable release!): ! - cleaned up code a bit ! - now clean disconnect in case server dies or closes ! socket ! ! v 0.2c (13th june 2002): ! - fixed some small bugs ! - buffer size now in kbytes per channel ! - some more info-printout ! ! v 0.2b (12th june 2002): ! - completetly rewritten multithreaded version, first ! sort-of-stable release ! - KNOWN BUG: eats too much CPU power ! ! v 0.1g (23rd feb. 2002, not for public use!): ! - added multithreading functionality: now sending data ! to server in a second thread ! - now included the static ogg vorbis libraries - no dll's ! needed under win any longer ! - fixed a bug that sometimes made pd crash ! ! v 0.1f (11th feb. 2002): ! - converted ringbuffer to simple buffer of fixed size ! ! v 0.1e (10th feb. 2002): ! - now really fixed the bug that made pd die when server ! disconnected ! ! v 0.1d (9th feb. 2002): ! - fixed a bug in the "vorbis" setting that made on-the-run ! changes impossible ! - introduced a function to check writeability of the socket ! - fixed the bug that crashed pd due to an access violation ! in vorbis.dll when send() returned an error (more of a ! fast workaround) ! - corrected bitrate setting, now it really is _k_bps ! ! ! v 0.1c (9th feb. 2002): ! - added support for setting / changing the comment tags in ! the ogg/vorbis header, spaces have to be replaced by '=' ! - fixed a bug in oggcast_stream() that made Pd crash - now ! it's vorbis.dll that makes Pd crash... ;-( ! ! v 0.1b (not released): ! - added support for changing encoder settings when stream ! is running (no need to disconnect), seems to be unstable ! on linux (with JRoar) ! v 0.1: first public release
Index: codec.h =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/codec.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** codec.h 23 Apr 2003 10:36:25 -0000 1.2 --- codec.h 4 Jan 2004 12:16:07 -0000 1.3 *************** *** 1,233 **** ! /******************************************************************** ! * * ! * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * ! * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * ! * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * ! * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * ! * * ! * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * ! * by the XIPHOPHORUS Company http://www.xiph.org/ * ! ! ******************************************************************** ! ! function: libvorbis codec headers ! last mod: $Id$ ! ! ********************************************************************/ ! ! #ifndef _vorbis_codec_h_ ! #define _vorbis_codec_h_ ! ! #ifdef __cplusplus ! extern "C" ! { ! #endif /* __cplusplus */ ! ! #include <ogg/ogg.h> ! ! typedef struct vorbis_info{ ! int version; ! int channels; ! long rate; ! ! /* The below bitrate declarations are *hints*. ! Combinations of the three values carry the following implications: ! ! all three set to the same value: ! implies a fixed rate bitstream ! only nominal set: ! implies a VBR stream that averages the nominal bitrate. No hard ! upper/lower limit ! upper and or lower set: ! implies a VBR bitstream that obeys the bitrate limits. nominal ! may also be set to give a nominal rate. ! none set: ! the coder does not care to speculate. ! */ ! ! long bitrate_upper; ! long bitrate_nominal; ! long bitrate_lower; ! long bitrate_window; ! ! void *codec_setup; ! } vorbis_info; ! ! /* vorbis_dsp_state buffers the current vorbis audio ! analysis/synthesis state. The DSP state belongs to a specific ! logical bitstream ****************************************************/ ! typedef struct vorbis_dsp_state{ ! int analysisp; ! vorbis_info *vi; ! ! float **pcm; ! float **pcmret; ! int pcm_storage; ! int pcm_current; ! int pcm_returned; ! ! int preextrapolate; ! int eofflag; ! ! long lW; ! long W; ! long nW; ! long centerW; ! ! ogg_int64_t granulepos; ! ogg_int64_t sequence; ! ! ogg_int64_t glue_bits; ! ogg_int64_t time_bits; ! ogg_int64_t floor_bits; ! ogg_int64_t res_bits; ! ! void *backend_state; ! } vorbis_dsp_state; ! ! typedef struct vorbis_block{ ! /* necessary stream state for linking to the framing abstraction */ ! float **pcm; /* this is a pointer into local storage */ ! oggpack_buffer opb; ! ! long lW; ! long W; ! long nW; ! int pcmend; ! int mode; ! ! int eofflag; ! ogg_int64_t granulepos; ! ogg_int64_t sequence; ! vorbis_dsp_state *vd; /* For read-only access of configuration */ ! ! /* local storage to avoid remallocing; it's up to the mapping to ! structure it */ ! void *localstore; ! long localtop; ! long localalloc; ! long totaluse; ! struct alloc_chain *reap; ! ! /* bitmetrics for the frame */ ! long glue_bits; ! long time_bits; ! long floor_bits; ! long res_bits; ! ! void *internal; ! ! } vorbis_block; ! ! /* vorbis_block is a single block of data to be processed as part of ! the analysis/synthesis stream; it belongs to a specific logical ! bitstream, but is independant from other vorbis_blocks belonging to ! that logical bitstream. *************************************************/ ! ! struct alloc_chain{ ! void *ptr; ! struct alloc_chain *next; ! }; ! ! /* vorbis_info contains all the setup information specific to the ! specific compression/decompression mode in progress (eg, ! psychoacoustic settings, channel setup, options, codebook ! etc). vorbis_info and substructures are in backends.h. ! *********************************************************************/ ! ! /* the comments are not part of vorbis_info so that vorbis_info can be ! static storage */ ! typedef struct vorbis_comment{ ! /* unlimited user comment fields. libvorbis writes 'libvorbis' ! whatever vendor is set to in encode */ ! char **user_comments; ! int *comment_lengths; ! int comments; ! char *vendor; ! ! } vorbis_comment; ! ! ! /* libvorbis encodes in two abstraction layers; first we perform DSP ! and produce a packet (see docs/analysis.txt). The packet is then ! coded into a framed OggSquish bitstream by the second layer (see ! docs/framing.txt). Decode is the reverse process; we sync/frame ! the bitstream and extract individual packets, then decode the ! packet back into PCM audio. ! ! The extra framing/packetizing is used in streaming formats, such as ! files. Over the net (such as with UDP), the framing and ! packetization aren't necessary as they're provided by the transport ! and the streaming layer is not used */ ! ! /* Vorbis PRIMITIVES: general ***************************************/ ! ! extern void vorbis_info_init(vorbis_info *vi); ! extern void vorbis_info_clear(vorbis_info *vi); ! extern int vorbis_info_blocksize(vorbis_info *vi,int zo); ! extern void vorbis_comment_init(vorbis_comment *vc); ! extern void vorbis_comment_add(vorbis_comment *vc, char *comment); ! extern void vorbis_comment_add_tag(vorbis_comment *vc, ! char *tag, char *contents); ! extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); ! extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); ! extern void vorbis_comment_clear(vorbis_comment *vc); ! ! extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); ! extern int vorbis_block_clear(vorbis_block *vb); ! extern void vorbis_dsp_clear(vorbis_dsp_state *v); ! ! /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ ! ! extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); ! extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); ! extern int vorbis_analysis_headerout(vorbis_dsp_state *v, ! vorbis_comment *vc, ! ogg_packet *op, ! ogg_packet *op_comm, ! ogg_packet *op_code); ! extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); ! extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); ! extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); ! extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); ! ! extern int vorbis_bitrate_addblock(vorbis_block *vb); ! extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ! ogg_packet *op); ! ! /* Vorbis PRIMITIVES: synthesis layer *******************************/ ! extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, ! ogg_packet *op); ! ! extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); ! extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); ! extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); ! extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); ! extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); ! extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); ! extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); ! ! /* Vorbis ERRORS and return codes ***********************************/ ! ! #define OV_FALSE -1 ! #define OV_EOF -2 ! #define OV_HOLE -3 ! ! #define OV_EREAD -128 ! #define OV_EFAULT -129 ! #define OV_EIMPL -130 ! #define OV_EINVAL -131 ! #define OV_ENOTVORBIS -132 ! #define OV_EBADHEADER -133 ! #define OV_EVERSION -134 ! #define OV_ENOTAUDIO -135 ! #define OV_EBADPACKET -136 ! #define OV_EBADLINK -137 ! #define OV_ENOSEEK -138 ! ! #ifdef __cplusplus ! } ! #endif /* __cplusplus */ ! ! #endif ! --- 1,233 ---- ! /******************************************************************** ! * * ! * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * ! * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * ! * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * ! * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * ! * * ! * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * ! * by the XIPHOPHORUS Company http://www.xiph.org/ * ! ! ******************************************************************** ! ! function: libvorbis codec headers ! last mod: $Id$ ! ! ********************************************************************/ ! ! #ifndef _vorbis_codec_h_ ! #define _vorbis_codec_h_ ! ! #ifdef __cplusplus ! extern "C" ! { ! #endif /* __cplusplus */ ! ! #include <ogg/ogg.h> ! ! typedef struct vorbis_info{ ! int version; ! int channels; ! long rate; ! ! /* The below bitrate declarations are *hints*. ! Combinations of the three values carry the following implications: ! ! all three set to the same value: ! implies a fixed rate bitstream ! only nominal set: ! implies a VBR stream that averages the nominal bitrate. No hard ! upper/lower limit ! upper and or lower set: ! implies a VBR bitstream that obeys the bitrate limits. nominal ! may also be set to give a nominal rate. ! none set: ! the coder does not care to speculate. ! */ ! ! long bitrate_upper; ! long bitrate_nominal; ! long bitrate_lower; ! long bitrate_window; ! ! void *codec_setup; ! } vorbis_info; ! ! /* vorbis_dsp_state buffers the current vorbis audio ! analysis/synthesis state. The DSP state belongs to a specific ! logical bitstream ****************************************************/ ! typedef struct vorbis_dsp_state{ ! int analysisp; ! vorbis_info *vi; ! ! float **pcm; ! float **pcmret; ! int pcm_storage; ! int pcm_current; ! int pcm_returned; ! ! int preextrapolate; ! int eofflag; ! ! long lW; ! long W; ! long nW; ! long centerW; ! ! ogg_int64_t granulepos; ! ogg_int64_t sequence; ! ! ogg_int64_t glue_bits; ! ogg_int64_t time_bits; ! ogg_int64_t floor_bits; ! ogg_int64_t res_bits; ! ! void *backend_state; ! } vorbis_dsp_state; ! ! typedef struct vorbis_block{ ! /* necessary stream state for linking to the framing abstraction */ ! float **pcm; /* this is a pointer into local storage */ ! oggpack_buffer opb; ! ! long lW; ! long W; ! long nW; ! int pcmend; ! int mode; ! ! int eofflag; ! ogg_int64_t granulepos; ! ogg_int64_t sequence; ! vorbis_dsp_state *vd; /* For read-only access of configuration */ ! ! /* local storage to avoid remallocing; it's up to the mapping to ! structure it */ ! void *localstore; ! long localtop; ! long localalloc; ! long totaluse; ! struct alloc_chain *reap; ! ! /* bitmetrics for the frame */ ! long glue_bits; ! long time_bits; ! long floor_bits; ! long res_bits; ! ! void *internal; ! ! } vorbis_block; ! ! /* vorbis_block is a single block of data to be processed as part of ! the analysis/synthesis stream; it belongs to a specific logical ! bitstream, but is independant from other vorbis_blocks belonging to ! that logical bitstream. *************************************************/ ! ! struct alloc_chain{ ! void *ptr; ! struct alloc_chain *next; ! }; ! ! /* vorbis_info contains all the setup information specific to the ! specific compression/decompression mode in progress (eg, ! psychoacoustic settings, channel setup, options, codebook ! etc). vorbis_info and substructures are in backends.h. ! *********************************************************************/ ! ! /* the comments are not part of vorbis_info so that vorbis_info can be ! static storage */ ! typedef struct vorbis_comment{ ! /* unlimited user comment fields. libvorbis writes 'libvorbis' ! whatever vendor is set to in encode */ ! char **user_comments; ! int *comment_lengths; ! int comments; ! char *vendor; ! ! } vorbis_comment; ! ! ! /* libvorbis encodes in two abstraction layers; first we perform DSP ! and produce a packet (see docs/analysis.txt). The packet is then ! coded into a framed OggSquish bitstream by the second layer (see ! docs/framing.txt). Decode is the reverse process; we sync/frame ! the bitstream and extract individual packets, then decode the ! packet back into PCM audio. ! ! The extra framing/packetizing is used in streaming formats, such as ! files. Over the net (such as with UDP), the framing and ! packetization aren't necessary as they're provided by the transport ! and the streaming layer is not used */ ! ! /* Vorbis PRIMITIVES: general ***************************************/ ! ! extern void vorbis_info_init(vorbis_info *vi); ! extern void vorbis_info_clear(vorbis_info *vi); ! extern int vorbis_info_blocksize(vorbis_info *vi,int zo); ! extern void vorbis_comment_init(vorbis_comment *vc); ! extern void vorbis_comment_add(vorbis_comment *vc, char *comment); ! extern void vorbis_comment_add_tag(vorbis_comment *vc, ! char *tag, char *contents); ! extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); ! extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); ! extern void vorbis_comment_clear(vorbis_comment *vc); ! ! extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); ! extern int vorbis_block_clear(vorbis_block *vb); ! extern void vorbis_dsp_clear(vorbis_dsp_state *v); ! ! /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ ! ! extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); ! extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); ! extern int vorbis_analysis_headerout(vorbis_dsp_state *v, ! vorbis_comment *vc, ! ogg_packet *op, ! ogg_packet *op_comm, ! ogg_packet *op_code); ! extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); ! extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); ! extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); ! extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); ! ! extern int vorbis_bitrate_addblock(vorbis_block *vb); ! extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ! ogg_packet *op); ! ! /* Vorbis PRIMITIVES: synthesis layer *******************************/ ! extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, ! ogg_packet *op); ! ! extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); ! extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); ! extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); ! extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); ! extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); ! extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); ! extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); ! ! /* Vorbis ERRORS and return codes ***********************************/ ! ! #define OV_FALSE -1 ! #define OV_EOF -2 ! #define OV_HOLE -3 ! ! #define OV_EREAD -128 ! #define OV_EFAULT -129 ! #define OV_EIMPL -130 ! #define OV_EINVAL -131 ! #define OV_ENOTVORBIS -132 ! #define OV_EBADHEADER -133 ! #define OV_EVERSION -134 ! #define OV_ENOTAUDIO -135 ! #define OV_EBADPACKET -136 ! #define OV_EBADLINK -137 ! #define OV_ENOSEEK -138 ! ! #ifdef __cplusplus ! } ! #endif /* __cplusplus */ ! ! #endif !
Index: help-oggcast~.pd =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/help-oggcast~.pd,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** help-oggcast~.pd 23 Apr 2003 10:36:25 -0000 1.2 --- help-oggcast~.pd 4 Jan 2004 12:16:07 -0000 1.3 *************** *** 1,65 **** ! #N canvas 298 121 629 593 10; ! #X floatatom 18 36 0 40 16000 0 - - -; ! #X msg 468 508 ; pd dsp 1; ! #X floatatom 18 524 0 0 0 0 - - -; ! #X msg 185 250 disconnect; ! #X msg 213 352 print; ! #X msg 534 508 ; pd dsp 0; ! #X obj 468 482 loadbang; ! #X floatatom 97 502 10 0 0 0 - - -; ! #X text 131 154 connect <host> <mountpoint> <port>; ! #X text 272 45 get latest version at; ! #X text 168 502 ogg pages; ! #X text 48 527 connection state; ! #X text 378 337 channels: 1 or 2 (default); ! #X text 210 304 vbr <samplerate> <channels> <quality>; ! #X msg 100 57 passwd letmein; ! #X obj 18 63 osc~ 440; ! #X text 330 326 quality settings: 0 - 1 (low - hi); ! #X text 227 412 possible tags: TITLE , ARTIST , PERFORMER , DESCRIPTION ! ,; ! #X text 316 425 GENRE , LOCATION , COPYRIGHT , CONTACT , DATE; ! #X msg 163 194 connect 141.53.196.149 puredata.ogg 8000; ! #X msg 133 172 connect localhost puredata.ogg 8000; ! #X msg 170 220 connect 141.53.3.18 musicforfilms.ogg 8100; ! #X obj 18 475 oggcast~ 2 512; ! #X text 273 34 written by Olaf Matthes olaf.matthes@gmx.de; ! #X text 252 353 print current settings to console window; ! #X text 225 373 comment: <TAG> <content>; ! #X msg 225 390 ARTIST your_name; ! #X text 228 444 '_' (underline) or '=' (equal sign) will get replaced ! with spaces!; ! #X text 240 493 default is 2 channels and 512k; ! #X text 241 505 bytes buffer size; ! #X text 119 475 creation arguments: oggcast~ <channels> <buffer size> ! ; ! #X msg 195 285 vorbis 44100 2 144 128 96; ! #X obj 33 110 noise~; ! #X text 19 6 oggcast~ 0.2f - send Ogg Vorbis stream to IceCast2 or ! JRoar; ! #X text 274 59 http://www.akustische-kunst.org/puredata/; ! #X text 195 268 vorbis <samplerate> <channels> <max.br> <nom.br> <min.br> ! ; ! #X msg 210 320 vbr 44100 2 0.6; ! #X msg 117 95 server 0; ! #X msg 129 120 server 1; ! #X text 175 94 choose JRoar or old Icecast2 as server type (default) ! ; ! #X text 188 121 choose new Icecast2 (final) as server type; ! #X connect 0 0 15 0; ! #X connect 3 0 22 0; ! #X connect 4 0 22 0; ! #X connect 6 0 1 0; ! #X connect 14 0 22 0; ! #X connect 15 0 22 0; ! #X connect 19 0 22 0; ! #X connect 20 0 22 0; ! #X connect 21 0 22 0; ! #X connect 22 0 2 0; ! #X connect 22 1 7 0; ! #X connect 26 0 22 0; ! #X connect 31 0 22 0; ! #X connect 32 0 22 1; ! #X connect 36 0 22 0; ! #X connect 37 0 22 0; ! #X connect 38 0 22 0; --- 1,65 ---- ! #N canvas 298 121 629 593 10; ! #X floatatom 18 36 0 40 16000 0 - - -; ! #X msg 468 508 ; pd dsp 1; ! #X floatatom 18 524 0 0 0 0 - - -; ! #X msg 185 250 disconnect; ! #X msg 213 352 print; ! #X msg 534 508 ; pd dsp 0; ! #X obj 468 482 loadbang; ! #X floatatom 97 502 10 0 0 0 - - -; ! #X text 131 154 connect <host> <mountpoint> <port>; ! #X text 272 45 get latest version at; ! #X text 168 502 ogg pages; ! #X text 48 527 connection state; ! #X text 378 337 channels: 1 or 2 (default); ! #X text 210 304 vbr <samplerate> <channels> <quality>; ! #X msg 100 57 passwd letmein; ! #X obj 18 63 osc~ 440; ! #X text 330 326 quality settings: 0 - 1 (low - hi); ! #X text 227 412 possible tags: TITLE , ARTIST , PERFORMER , DESCRIPTION ! ,; ! #X text 316 425 GENRE , LOCATION , COPYRIGHT , CONTACT , DATE; ! #X msg 163 194 connect 141.53.196.149 puredata.ogg 8000; ! #X msg 133 172 connect localhost puredata.ogg 8000; ! #X msg 170 220 connect 141.53.3.18 musicforfilms.ogg 8100; ! #X obj 18 475 oggcast~ 2 512; ! #X text 273 34 written by Olaf Matthes olaf.matthes@gmx.de; ! #X text 252 353 print current settings to console window; ! #X text 225 373 comment: <TAG> <content>; ! #X msg 225 390 ARTIST your_name; ! #X text 228 444 '_' (underline) or '=' (equal sign) will get replaced ! with spaces!; ! #X text 240 493 default is 2 channels and 512k; ! #X text 241 505 bytes buffer size; ! #X text 119 475 creation arguments: oggcast~ <channels> <buffer size> ! ; ! #X msg 195 285 vorbis 44100 2 144 128 96; ! #X obj 33 110 noise~; ! #X text 19 6 oggcast~ 0.2f - send Ogg Vorbis stream to IceCast2 or ! JRoar; ! #X text 274 59 http://www.akustische-kunst.org/puredata/; ! #X text 195 268 vorbis <samplerate> <channels> <max.br> <nom.br> <min.br> ! ; ! #X msg 210 320 vbr 44100 2 0.6; ! #X msg 117 95 server 0; ! #X msg 129 120 server 1; ! #X text 175 94 choose JRoar or old Icecast2 as server type (default) ! ; ! #X text 188 121 choose new Icecast2 (final) as server type; ! #X connect 0 0 15 0; ! #X connect 3 0 22 0; ! #X connect 4 0 22 0; ! #X connect 6 0 1 0; ! #X connect 14 0 22 0; ! #X connect 15 0 22 0; ! #X connect 19 0 22 0; ! #X connect 20 0 22 0; ! #X connect 21 0 22 0; ! #X connect 22 0 2 0; ! #X connect 22 1 7 0; ! #X connect 26 0 22 0; ! #X connect 31 0 22 0; ! #X connect 32 0 22 1; ! #X connect 36 0 22 0; ! #X connect 37 0 22 0; ! #X connect 38 0 22 0;
Index: oggcast~.c =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/oggcast~.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** oggcast~.c 13 Sep 2003 23:04:26 -0000 1.5 --- oggcast~.c 4 Jan 2004 12:16:07 -0000 1.6 *************** *** 1,1435 **** ! /* ------------------------- oggcast~ ----------------------------------------- */ ! /* */ ! /* Tilde object to send an Ogg Vorbis stream from to IceCast2 server. */ ! /* Written by Olaf Matthes (olaf.matthes@gmx.de) */ ! /* Get source at http://www.akustische-kunst.org/puredata/pdogg/ */ ! /* */ ! /* This library is free software; you can redistribute it and/or */ ! /* modify it under the terms of the GNU Lesser General Public */ ! /* License as published by the Free Software Foundation; either */ ! /* version 2 of the License, or (at your option) any later version. */ [...2851 lines suppressed...] ! } ! ! void oggcast_tilde_setup(void) ! { ! oggcast_class = class_new(gensym("oggcast~"), (t_newmethod)oggcast_new, ! (t_method)oggcast_free, sizeof(t_oggcast), 0, A_DEFFLOAT, A_DEFFLOAT, 0); ! CLASS_MAINSIGNALIN(oggcast_class, t_oggcast, x_f ); ! class_addfloat(oggcast_class, (t_method)oggcast_float); ! class_addmethod(oggcast_class, (t_method)oggcast_disconnect, gensym("disconnect"), 0); ! class_addmethod(oggcast_class, (t_method)oggcast_dsp, gensym("dsp"), 0); ! class_addmethod(oggcast_class, (t_method)oggcast_connect, gensym("connect"), A_GIMME, 0); ! class_addmethod(oggcast_class, (t_method)oggcast_print, gensym("print"), 0); ! class_addmethod(oggcast_class, (t_method)oggcast_password, gensym("passwd"), A_SYMBOL, 0); ! class_addmethod(oggcast_class, (t_method)oggcast_vorbis, gensym("vorbis"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); ! class_addmethod(oggcast_class, (t_method)oggcast_vbr, gensym("vbr"), A_FLOAT, A_FLOAT, A_FLOAT, 0); ! class_addmethod(oggcast_class, (t_method)oggcast_server, gensym("server"), A_FLOAT, 0); ! class_addanything(oggcast_class, oggcast_comment); ! class_sethelpsymbol(oggcast_class, gensym("help-oggcast~.pd")); ! } \ No newline at end of file
Index: readme =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/readme,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** readme 23 Apr 2003 10:36:25 -0000 1.2 --- readme 4 Jan 2004 12:16:07 -0000 1.3 *************** *** 1,116 **** ! Version 0.2 ! copyright (c) 2002 by Olaf Matthes ! ! oggcast~ is a ogg/vorbis streaming external for pd (by Miller ! Puckette) that connects to an IceCast2 server. ! ! ! To run oggcast~ place the file oggcast~.dll for win or oggcast~.pd_linux ! in the directory of our patch or start pd with '-lib oggcast~' flag. ! ! To compile oggcast~ on Linux get the ogg/vorbice library from ! http://www.vorbis.com/. ! You have to modify the makefile to make it point to the place where the ! ogg/vorbis library is. ! ! ! This software is published under LGPL terms. ! ! This is software with ABSOLUTELY NO WARRANTY. ! Use it at your OWN RISK. It's possible to damage e.g. hardware or your hearing ! due to a bug or for other reasons. ! ! ***************************************************************************** ! ! oggcast~ uses the ogg/vorbice library to encode audio data. ! The latest version of ogg/vorbis can be found at http://www.vorbice.com/ ! ! Below is the original copyright information taken from the ogg/vorbis library: ! ! ! Copyright (c) 2001, Xiphophorus ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: ! ! - Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! ! - Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! ! - Neither the name of the Xiphophorus nor the names of its contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ! A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! ***************************************************************************** ! ! Usage: ! ! Use message "vbr <samplerate> <channels> <quality>" to set the vorbis ! encoding parameters. Resampling is currently not supported, so 'samplerate' ! should be the one pd is running at. 'channels' specyfies the number of channels ! to stream. This can be set to 2 (default) or 1 which means mono stream taking ! the leftmost audio input only. 'quality' can be a value between 0.0 and 1.0 ! giving the quality of the stream. 0.4 (default) results in a stream that's ! about 128kbps. ! ! Since Vorbis uses VBR encoding, bitrates vary depending on the type of audio ! signal to be encoded. A pure sine [osc~] results in the smalest stream, com- ! plex audio signals will increase this value significantly. To test the maximum ! bitrate that might occur for a quality setting use noise~ as signal input. ! ! Use message "vorbis <samplerate> <channels> <maximum bitrate> <nominal bit- ! rate> <minimal bitrate>" to set encoding quality on the basis of bitrates. ! When setting all three bitrate parameters to the same value one gets a ! constant bitrate stream. Values are in kbps! ! ! Message "connect <host> <mountpoint> <port>" connects to the IceCast2 server. ! Note that no response about succesfull connection is send by the server. All ! messages in the pd console window about connection status depend on the ability ! to send data to the server. ! The mountpoint should end with '.ogg' to indiocate to the player/client that ! it is an ogg/vorbis encoded stream. ! ! Use "passwd <passwort>" to set your password (default is 'letmein') and ! "disconnect" to disconnect from the server. "print" prints out the current ! vorbis encoder settings. ! ! To set the comment tags in the ogg/vorbis header (which can be displayed by ! the receiving client) use message "<NAMEOFTAG> <comment>". Supported tags are: ! TITLE, ARTIST, GENRE, PERFORMER, LOCATION, COPYRIGHT, CONTACT, DESCRIPTION and ! DATE (which is automatically set to the date/time the broadcast started). To ! get spaces use '=' or '_' instead. Note that under Win2k '=' sometimes get lost ! from the patch after saving!!! ! ! ! Listening to it: ! ! To listen to ogg/vorbis encoded livestreams many player need an extra plug-in. ! Have a look at http://www.vorbis.com/ to find the appropiate plug-in for your ! player. ! To play back the stream just open lacation http://<server>:<port>/<mountpoint>. ! ! Note that changing encoding parameters or header comments while oggcast~ is ! streaming to the server might result in audible dropouts. ! ! ! ! Latest version can be found at: ! http://www.akustische-kunst.de/puredata/ ! Please report any bugs to olaf.matthes@gmx.de! --- 1,116 ---- ! Version 0.2 ! copyright (c) 2002 by Olaf Matthes ! ! oggcast~ is a ogg/vorbis streaming external for pd (by Miller ! Puckette) that connects to an IceCast2 server. ! ! ! To run oggcast~ place the file oggcast~.dll for win or oggcast~.pd_linux ! in the directory of our patch or start pd with '-lib oggcast~' flag. ! ! To compile oggcast~ on Linux get the ogg/vorbice library from ! http://www.vorbis.com/. ! You have to modify the makefile to make it point to the place where the ! ogg/vorbis library is. ! ! ! This software is published under LGPL terms. ! ! This is software with ABSOLUTELY NO WARRANTY. ! Use it at your OWN RISK. It's possible to damage e.g. hardware or your hearing ! due to a bug or for other reasons. ! ! ***************************************************************************** ! ! oggcast~ uses the ogg/vorbice library to encode audio data. ! The latest version of ogg/vorbis can be found at http://www.vorbice.com/ ! ! Below is the original copyright information taken from the ogg/vorbis library: ! ! ! Copyright (c) 2001, Xiphophorus ! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: ! ! - Redistributions of source code must retain the above copyright ! notice, this list of conditions and the following disclaimer. ! ! - Redistributions in binary form must reproduce the above copyright ! notice, this list of conditions and the following disclaimer in the ! documentation and/or other materials provided with the distribution. ! ! - Neither the name of the Xiphophorus nor the names of its contributors ! may be used to endorse or promote products derived from this software ! without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ! A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ! ! ***************************************************************************** ! ! Usage: ! ! Use message "vbr <samplerate> <channels> <quality>" to set the vorbis ! encoding parameters. Resampling is currently not supported, so 'samplerate' ! should be the one pd is running at. 'channels' specyfies the number of channels ! to stream. This can be set to 2 (default) or 1 which means mono stream taking ! the leftmost audio input only. 'quality' can be a value between 0.0 and 1.0 ! giving the quality of the stream. 0.4 (default) results in a stream that's ! about 128kbps. ! ! Since Vorbis uses VBR encoding, bitrates vary depending on the type of audio ! signal to be encoded. A pure sine [osc~] results in the smalest stream, com- ! plex audio signals will increase this value significantly. To test the maximum ! bitrate that might occur for a quality setting use noise~ as signal input. ! ! Use message "vorbis <samplerate> <channels> <maximum bitrate> <nominal bit- ! rate> <minimal bitrate>" to set encoding quality on the basis of bitrates. ! When setting all three bitrate parameters to the same value one gets a ! constant bitrate stream. Values are in kbps! ! ! Message "connect <host> <mountpoint> <port>" connects to the IceCast2 server. ! Note that no response about succesfull connection is send by the server. All ! messages in the pd console window about connection status depend on the ability ! to send data to the server. ! The mountpoint should end with '.ogg' to indiocate to the player/client that ! it is an ogg/vorbis encoded stream. ! ! Use "passwd <passwort>" to set your password (default is 'letmein') and ! "disconnect" to disconnect from the server. "print" prints out the current ! vorbis encoder settings. ! ! To set the comment tags in the ogg/vorbis header (which can be displayed by ! the receiving client) use message "<NAMEOFTAG> <comment>". Supported tags are: ! TITLE, ARTIST, GENRE, PERFORMER, LOCATION, COPYRIGHT, CONTACT, DESCRIPTION and ! DATE (which is automatically set to the date/time the broadcast started). To ! get spaces use '=' or '_' instead. Note that under Win2k '=' sometimes get lost ! from the patch after saving!!! ! ! ! Listening to it: ! ! To listen to ogg/vorbis encoded livestreams many player need an extra plug-in. ! Have a look at http://www.vorbis.com/ to find the appropiate plug-in for your ! player. ! To play back the stream just open lacation http://<server>:<port>/<mountpoint>. ! ! Note that changing encoding parameters or header comments while oggcast~ is ! streaming to the server might result in audible dropouts. ! ! ! ! Latest version can be found at: ! http://www.akustische-kunst.de/puredata/ ! Please report any bugs to olaf.matthes@gmx.de!
Index: vorbisenc.h =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggcast~/vorbisenc.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** vorbisenc.h 23 Apr 2003 10:36:25 -0000 1.2 --- vorbisenc.h 4 Jan 2004 12:16:07 -0000 1.3 *************** *** 1,93 **** ! /******************************************************************** ! * * ! * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * ! * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * ! * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * ! * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * ! * * ! * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * ! * by the XIPHOPHORUS Company http://www.xiph.org/ * ! * * ! ******************************************************************** ! ! function: vorbis encode-engine setup ! last mod: $Id$ ! ! ********************************************************************/ ! ! #ifndef _OV_ENC_H_ ! #define _OV_ENC_H_ ! ! #ifdef __cplusplus ! extern "C" ! { ! #endif /* __cplusplus */ ! ! #include "codec.h" ! ! extern int vorbis_encode_init(vorbis_info *vi, ! long channels, ! long rate, ! ! long max_bitrate, ! long nominal_bitrate, ! long min_bitrate); ! ! extern int vorbis_encode_setup_managed(vorbis_info *vi, ! long channels, ! long rate, ! ! long max_bitrate, ! long nominal_bitrate, ! long min_bitrate); ! ! extern int vorbis_encode_setup_vbr(vorbis_info *vi, ! long channels, ! long rate, ! ! float /* quality level from 0. (lo) to 1. (hi) */ ! ); ! ! extern int vorbis_encode_init_vbr(vorbis_info *vi, ! long channels, ! long rate, ! ! float base_quality /* quality level from 0. (lo) to 1. (hi) */ ! ); ! ! extern int vorbis_encode_setup_init(vorbis_info *vi); ! ! extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); ! ! #define OV_ECTL_RATEMANAGE_GET 0x10 ! ! #define OV_ECTL_RATEMANAGE_SET 0x11 ! #define OV_ECTL_RATEMANAGE_AVG 0x12 ! #define OV_ECTL_RATEMANAGE_HARD 0x13 ! ! #define OV_ECTL_LOWPASS_GET 0x20 ! #define OV_ECTL_LOWPASS_SET 0x21 ! ! #define OV_ECTL_IBLOCK_GET 0x30 ! #define OV_ECTL_IBLOCK_SET 0x31 ! ! struct ovectl_ratemanage_arg { ! int management_active; ! ! long bitrate_hard_min; ! long bitrate_hard_max; ! double bitrate_hard_window; ! ! long bitrate_av_lo; ! long bitrate_av_hi; ! double bitrate_av_window; ! double bitrate_av_window_center; ! }; ! ! #ifdef __cplusplus ! } ! #endif /* __cplusplus */ ! ! #endif ! ! --- 1,93 ---- ! /******************************************************************** ! * * ! * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * ! * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * ! * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * ! * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * ! * * ! * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * ! * by the XIPHOPHORUS Company http://www.xiph.org/ * ! * * ! ******************************************************************** ! ! function: vorbis encode-engine setup ! last mod: $Id$ ! ! ********************************************************************/ ! ! #ifndef _OV_ENC_H_ ! #define _OV_ENC_H_ ! ! #ifdef __cplusplus ! extern "C" ! { ! #endif /* __cplusplus */ ! ! #include "codec.h" ! ! extern int vorbis_encode_init(vorbis_info *vi, ! long channels, ! long rate, ! ! long max_bitrate, ! long nominal_bitrate, ! long min_bitrate); ! ! extern int vorbis_encode_setup_managed(vorbis_info *vi, ! long channels, ! long rate, ! ! long max_bitrate, ! long nominal_bitrate, ! long min_bitrate); ! ! extern int vorbis_encode_setup_vbr(vorbis_info *vi, ! long channels, ! long rate, ! ! float /* quality level from 0. (lo) to 1. (hi) */ ! ); ! ! extern int vorbis_encode_init_vbr(vorbis_info *vi, ! long channels, ! long rate, ! ! float base_quality /* quality level from 0. (lo) to 1. (hi) */ ! ); ! ! extern int vorbis_encode_setup_init(vorbis_info *vi); ! ! extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); ! ! #define OV_ECTL_RATEMANAGE_GET 0x10 ! ! #define OV_ECTL_RATEMANAGE_SET 0x11 ! #define OV_ECTL_RATEMANAGE_AVG 0x12 ! #define OV_ECTL_RATEMANAGE_HARD 0x13 ! ! #define OV_ECTL_LOWPASS_GET 0x20 ! #define OV_ECTL_LOWPASS_SET 0x21 ! ! #define OV_ECTL_IBLOCK_GET 0x30 ! #define OV_ECTL_IBLOCK_SET 0x31 ! ! struct ovectl_ratemanage_arg { ! int management_active; ! ! long bitrate_hard_min; ! long bitrate_hard_max; ! double bitrate_hard_window; ! ! long bitrate_av_lo; ! long bitrate_av_hi; ! double bitrate_av_window; ! double bitrate_av_window_center; ! }; ! ! #ifdef __cplusplus ! } ! #endif /* __cplusplus */ ! ! #endif ! !