Update of /cvsroot/pure-data/externals/pdogg/oggread~ In directory sc8-pr-cvs1:/tmp/cvs-serv17605/oggread~
Modified Files: codec.h help-oggread~.pd oggread~.c readme Log Message: recommitting olaf's sources from 0.25
Index: codec.h =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggread~/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:08 -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-oggread~.pd =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggread~/help-oggread~.pd,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** help-oggread~.pd 23 Apr 2003 10:36:25 -0000 1.2 --- help-oggread~.pd 4 Jan 2004 12:16:08 -0000 1.3 *************** *** 1,44 **** ! #N canvas 280 107 572 464 12; ! #X obj 27 411 dac~; ! #X floatatom 75 412 8 0 0 0 - - -; ! #X obj 36 343 oggread~; ! #X msg 71 170 start; ! #X msg 110 226 stop; ! #X msg 118 287 resume; ! #X msg 36 45 open myfile.ogg; ! #X text 119 168 play file from beginning; ! #X text 152 226 stop (pause) playing; ! #X text 179 288 resume playing at current position; ! #X msg 396 394 ; pd dsp 1; ! #X msg 472 394 ; pd dsp 0; ! #X obj 396 368 loadbang; ! #X text 185 52 get latest version at; ! #X text 152 411 position in file (seconds); ! #X text 186 38 written by Olaf Matthes olaf.matthes@gmx.de; ! #X text 17 16 oggread~ version 0.2 - Ogg Vorbis file player; ! #X msg 126 250 0; ! #X msg 95 195 1; ! #X text 230 318 set new playing position (in seconds); ! #X obj 95 375 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X text 121 375 bang at end of file; ! #X text 186 67 http://www.akustische-kunst.org/puredata/; ! #X obj 55 102 openpanel; ! #X msg 55 74 bang; ! #X msg 55 129 open $1; ! #X msg 149 317 seek 60; ! #X connect 2 0 0 0; ! #X connect 2 1 0 1; ! #X connect 2 2 1 0; ! #X connect 2 3 20 0; ! #X connect 3 0 2 0; ! #X connect 4 0 2 0; ! #X connect 5 0 2 0; ! #X connect 6 0 2 0; ! #X connect 12 0 10 0; ! #X connect 17 0 2 0; ! #X connect 18 0 2 0; ! #X connect 23 0 25 0; ! #X connect 24 0 23 0; ! #X connect 25 0 2 0; ! #X connect 26 0 2 0; --- 1,44 ---- ! #N canvas 280 107 572 464 12; ! #X obj 27 411 dac~; ! #X floatatom 75 412 8 0 0 0 - - -; ! #X obj 36 343 oggread~; ! #X msg 71 170 start; ! #X msg 110 226 stop; ! #X msg 118 287 resume; ! #X msg 36 45 open myfile.ogg; ! #X text 119 168 play file from beginning; ! #X text 152 226 stop (pause) playing; ! #X text 179 288 resume playing at current position; ! #X msg 396 394 ; pd dsp 1; ! #X msg 472 394 ; pd dsp 0; ! #X obj 396 368 loadbang; ! #X text 185 52 get latest version at; ! #X text 152 411 position in file (seconds); ! #X text 186 38 written by Olaf Matthes olaf.matthes@gmx.de; ! #X text 17 16 oggread~ version 0.2 - Ogg Vorbis file player; ! #X msg 126 250 0; ! #X msg 95 195 1; ! #X text 230 318 set new playing position (in seconds); ! #X obj 95 375 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X text 121 375 bang at end of file; ! #X text 186 67 http://www.akustische-kunst.org/puredata/; ! #X obj 55 102 openpanel; ! #X msg 55 74 bang; ! #X msg 55 129 open $1; ! #X msg 149 317 seek 60; ! #X connect 2 0 0 0; ! #X connect 2 1 0 1; ! #X connect 2 2 1 0; ! #X connect 2 3 20 0; ! #X connect 3 0 2 0; ! #X connect 4 0 2 0; ! #X connect 5 0 2 0; ! #X connect 6 0 2 0; ! #X connect 12 0 10 0; ! #X connect 17 0 2 0; ! #X connect 18 0 2 0; ! #X connect 23 0 25 0; ! #X connect 24 0 23 0; ! #X connect 25 0 2 0; ! #X connect 26 0 2 0;
Index: oggread~.c =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggread~/oggread~.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** oggread~.c 23 Jun 2003 13:16:22 -0000 1.4 --- oggread~.c 4 Jan 2004 12:16:08 -0000 1.5 *************** *** 1,414 **** ! /* ------------------------- oggread~ ------------------------------------------ */ ! /* */ ! /* Tilde object to read and play back Ogg Vorbis files. */ ! /* Written by Olaf Matthes (olaf.matthes@gmx.de) */ ! /* Get source at http://www.akustische-kunst.de/puredata/ */ ! /* */ ! /* 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. */ ! /* */ ! /* This library is distributed in the hope that it will be useful, */ ! /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ ! /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ ! /* Lesser General Public License for more details. */ ! /* */ ! /* You should have received a copy of the GNU Lesser General Public */ ! /* License along with this library; if not, write to the */ ! /* Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ ! /* Boston, MA 02111-1307, USA. */ ! /* */ ! /* Based on PureData by Miller Puckette and others. */ ! /* Uses the Ogg Vorbis decoding library which can be found at */ ! /* http://www.vorbis.com/ */ ! /* */ ! /* ---------------------------------------------------------------------------- */ ! ! #include "m_pd.h" ! #include "s_stuff.h" ! #include "codec.h" ! #include "vorbis/vorbisfile.h" ! ! #include <sys/types.h> ! #include <string.h> ! #include <stdio.h> ! #include <errno.h> ! #include <fcntl.h> ! #ifdef UNIX ! #include <sys/socket.h> ! #include <netinet/in.h> ! #include <netinet/tcp.h> ! #include <arpa/inet.h> ! #include <netdb.h> ! #include <sys/time.h> ! #include <unistd.h> ! #define SOCKET_ERROR -1 ! #else ! #include <io.h> ! #include <stdlib.h> ! #endif ! ! #ifdef NT ! #pragma warning( disable : 4244 ) ! #pragma warning( disable : 4305 ) ! #endif ! ! #define READ 4096 /* amount of data we pass on to decoder */ ! #define MIN_AUDIO_INPUT READ*8 /* this is completely guessed! we just fill half the buffer */ ! #define OUTPUT_BUFFER_SIZE 65536 /* audio output buffer: 64k */ ! ! static char *oggread_version = "oggread~: ogg/vorbis file reader version 0.2c, written by Olaf Matthes"; ! ! /* ------------------------ oggread~ ----------------------------- */ ! ! static t_class *oggread_class; ! ! typedef struct _oggread ! { ! t_object x_obj; ! t_clock *x_clock; ! /* ogg/vorbis related stuff */ ! OggVorbis_File x_ov; ! ogg_stream_state x_os; /* take physical pages, weld into a logical stream of packets */ ! ogg_sync_state x_oy; /* sync and verify incoming physical bitstream */ ! ogg_page x_og; /* one Ogg bitstream page. Vorbis packets are inside */ ! ogg_packet x_op; /* one raw packet of data for decode */ ! vorbis_info *x_vi; /* struct that stores all the static vorbis bitstream settings */ ! vorbis_comment x_vc; /* struct that stores all the user comments */ ! vorbis_dsp_state x_vd; /* central working state for the packet->PCM decoder */ ! vorbis_block x_vb; /* local working space for packet->PCM decode */ ! t_int x_eos; /* end of stream */ ! char *x_buffer;/* buffer used to pass on data to ogg/vorbis */ ! ! t_float x_position; /* current playing position */ ! t_outlet *x_out_position; /* output to send them to */ ! t_outlet *x_out_end; /* signal end of file */ ! ! t_outlet *x_connection; ! t_int x_fd; /* the file handle */ ! FILE *x_file; ! int x_current_section; ! t_int x_blocksize; /* size of a dsp block */ ! t_int x_decoded; /* number of samples we got from decoder on last call */ ! ! t_float *x_outbuffer; /* buffer to store audio decoded data */ ! t_int x_outwriteposition; ! t_int x_outreadposition; ! t_int x_outunread; ! t_int x_outbuffersize; ! ! t_int x_samplerate; /* pd's samplerate, might differ from stream */ ! t_int x_stream; /* indicates if a stream gets output */ ! } t_oggread; ! ! /* output playing position */ ! static void oggread_tick(t_oggread *x) ! { ! outlet_float(x->x_out_position, x->x_position); ! clock_delay(x->x_clock, 250); ! } ! ! static int oggread_decode_input(t_oggread *x) ! { ! long ret; /* bytes per channel returned by decoder */ ! int i; ! float **pcm; ! ! x->x_vi = ov_info(&x->x_ov, x->x_current_section); ! ! while(!x->x_eos) ! { ! ret = ov_read_float(&x->x_ov, &pcm, READ, &x->x_current_section); ! if (ret == 0) ! { ! /* EOF */ ! x->x_eos = 1; ! x->x_stream = 0; ! clock_unset(x->x_clock); ! // post("oggread~: end of file detected, stopping"); ! outlet_bang(x->x_out_end); ! } ! else if (ret < 0) ! { ! /* error in the stream. Not a problem, just reporting it in ! case we (the app) cares. In this case, we don't. */ ! } ! else ! { ! /* we don't bother dealing with sample rate changes, etc, but ! you'll have to */ ! long j; ! for(j = 0; j < ret; j++) ! { ! for(i = 0; i < x->x_vi->channels; i++) ! { ! x->x_outbuffer[x->x_outwriteposition] = pcm[i][j]; ! x->x_outwriteposition = (x->x_outwriteposition + 1)%x->x_outbuffersize; ! } ! } ! x->x_outunread += (t_int)ret * x->x_vi->channels; ! ! } ! break; ! } ! x->x_decoded = (t_int)ret * x->x_vi->channels; /* num. of samples we got from decoder */ ! ! x->x_position = (t_float)ov_time_tell(&x->x_ov); ! ! /* exit decoding 'loop' here, we'll get called again by perform() */ ! return 1; ! } ! ! ! static t_int *oggread_perform(t_int *w) ! { ! t_oggread *x = (t_oggread*) (w[1]); ! t_float *out1 = (t_float *)(w[2]); ! t_float *out2 = (t_float *)(w[3]); ! int n = (int)(w[4]); ! int ret; ! int i = 0; ! ! x->x_blocksize = n; ! ! while( n-- ) ! { /* check that the stream provides enough data */ ! if((x->x_stream == 1) && (x->x_outunread > (x->x_blocksize * x->x_vi->channels))) ! { ! if(x->x_vi->channels != 1) /* play stereo */ ! { ! *out1++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! *out2++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! x->x_outunread-=2; ! } ! else /* play mono on both sides */ ! { ! *out1++=*(x->x_outbuffer+x->x_outreadposition); ! *out2++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! x->x_outunread--; ! } ! } ! else /* silence in case of buffer underrun */ ! { ! *out1++=0.0; ! *out2++=0.0; ! } ! } ! ! /* decode data whenever we used up some samples from outbuffer */ ! if((x->x_fd > 0) && (x->x_stream) /* only go when file is open and ready */ ! && (x->x_outunread < (MIN_AUDIO_INPUT - x->x_decoded))) /* we used up data from last decode */ ! { ! // post("oggread~: decoding..."); ! if(oggread_decode_input(x) != 1) ! { ! post("oggread~: decoder error"); ! } ! // else post("oggread~: decoder returned %d samples", x->x_decoded); ! } ! return (w+5); ! } ! ! static void oggread_dsp(t_oggread *x, t_signal **sp) ! { ! dsp_add(oggread_perform, 4, x, sp[1]->s_vec, sp[2]->s_vec, sp[1]->s_n); ! } ! ! ! /* start playing */ ! static void oggread_start(t_oggread *x) ! { ! if(x->x_fd > 0) ! { ! if(ov_time_seek(&x->x_ov, 0) < 0) ! { ! post("oggread~: could not rewind file to beginning"); ! } ! post("oggread~: START"); ! x->x_eos = 0; ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! x->x_position = 0; ! clock_delay(x->x_clock, 0); ! x->x_stream = 1; ! } ! else post("oggread~: no file open (ignored)"); ! } ! ! /* resume file reading */ ! static void oggread_resume(t_oggread *x) ! { ! if(x->x_fd > 0) ! { ! x->x_stream = 1; ! clock_delay(x->x_clock, 0); ! post("oggread~: RESUME"); ! } ! else post("oggread~: encoder not initialised"); ! } ! ! /* seek in file */ ! static void oggread_seek(t_oggread *x, t_floatarg f) ! { ! if(x->x_fd > 0) ! if(ov_time_seek(&x->x_ov, f) < 0) ! { ! post("oggread~: could not set playing position to %g seconds", f); ! } ! else post("oggread~: playing position set to %g seconds", f); ! } ! ! /* stop playing */ ! static void oggread_stop(t_oggread *x) ! { ! if(x->x_stream)post("oggread~: STOP"); ! x->x_stream = 0; ! clock_unset(x->x_clock); ! } ! ! static void oggread_float(t_oggread *x, t_floatarg f) ! { ! if(f == 0) oggread_stop(x); ! else oggread_start(x); ! } ! ! /* open ogg/vorbis file */ ! static void oggread_open(t_oggread *x, t_symbol *filename) ! { ! int i; ! ! x->x_stream = 0; ! /* first close previous file */ ! if(x->x_fd > 0) ! { ! ov_clear(&x->x_ov); ! post("oggread~: previous file closed"); ! } ! /* open file for reading */ ! #ifdef UNIX ! if((x->x_file = fopen(filename->s_name, "r")) < 0) ! #else ! if((x->x_file = fopen(filename->s_name, "rb")) < 0) ! #endif ! { ! post("oggread~: could not open file "%s"", filename->s_name); ! x->x_eos = 1; ! x->x_fd = -1; ! } ! else ! { ! x->x_stream = 0; ! x->x_eos = 0; ! x->x_fd = 1; ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! post("oggread~: file "%s" opened", filename->s_name); ! outlet_float( x->x_out_position, 0); ! ! /* try to open as ogg vorbis file */ ! if(ov_open(x->x_file, &x->x_ov, NULL, -1) < 0) ! { /* an error occured (no ogg vorbis file ?) */ ! post("oggread~: error: could not open "%s" as an OggVorbis file", filename->s_name); ! ov_clear(&x->x_ov); ! post("oggread~: file closed due to error"); ! } ! ! /* print details about each logical bitstream in the input */ ! if(ov_seekable(&x->x_ov)) ! { ! post("oggread~: input bitstream contained %ld logical bitstream section(s)", ov_streams(&x->x_ov)); ! post("oggread~: total bitstream playing time: %ld seconds", (long)ov_time_total(&x->x_ov,-1)); ! post("oggread~: encoded by: %s\n",ov_comment(&x->x_ov,-1)->vendor); ! } ! else ! { ! post("oggread~: file "%s" was not seekable" ! "oggread~: first logical bitstream information:", filename->s_name); ! } ! ! for(i = 0; i < ov_streams(&x->x_ov); i++) ! { ! x->x_vi = ov_info(&x->x_ov,i); ! post("\tlogical bitstream section %d information:",i+1); ! post("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld", ! x->x_vi->rate,x->x_vi->channels,ov_bitrate(&x->x_ov,i)/1000, ov_serialnumber(&x->x_ov,i)); ! post("\t\theader length: %ld bytes",(long) ! (x->x_ov.dataoffsets[i] - x->x_ov.offsets[i])); ! post("\t\tcompressed length: %ld bytes",(long)(ov_raw_total(&x->x_ov,i))); ! post("\t\tplay time: %ld seconds\n",(long)ov_time_total(&x->x_ov,i)); ! } ! ! } ! } ! ! ! static void oggread_free(t_oggread *x) ! { ! if (x->x_fd > 0) { ! post( "oggread~: closing file" ); ! ov_clear(&x->x_ov); ! x->x_fd = -1; ! } ! freebytes(x->x_outbuffer, OUTPUT_BUFFER_SIZE*sizeof(t_float)); ! clock_free(x->x_clock); ! } ! ! static void *oggread_new(t_floatarg fdographics) ! { ! t_oggread *x = NULL; ! ! x = (t_oggread *)pd_new(oggread_class); ! outlet_new(&x->x_obj, gensym("signal")); ! outlet_new(&x->x_obj, gensym("signal")); ! x->x_out_position = outlet_new(&x->x_obj, gensym("float")); ! x->x_out_end = outlet_new(&x->x_obj, gensym("bang")); ! x->x_clock = clock_new(x, (t_method)oggread_tick); ! ! x->x_fd = -1; ! x->x_eos = 1; ! x->x_stream = 0; ! x->x_position = 0; ! x->x_samplerate = sys_getsr(); ! ! x->x_outbuffersize = OUTPUT_BUFFER_SIZE; ! x->x_outbuffer = (t_float*) getbytes(OUTPUT_BUFFER_SIZE*sizeof(t_float)); ! ! if(!x->x_outbuffer) ! { ! post( "oggread~: could not allocate buffer" ); ! return NULL; ! } ! memset(x->x_outbuffer, 0x0, OUTPUT_BUFFER_SIZE); ! ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! x->x_decoded = 0; ! ! post(oggread_version); ! ! return (x); ! } ! ! ! void oggread_tilde_setup(void) ! { ! oggread_class = class_new(gensym("oggread~"), ! (t_newmethod) oggread_new, (t_method) oggread_free, ! sizeof(t_oggread), 0, A_DEFFLOAT, A_NULL); ! class_addfloat(oggread_class, (t_method)oggread_float); ! class_addmethod(oggread_class, nullfn, gensym("signal"), 0); ! class_addmethod(oggread_class, (t_method)oggread_dsp, gensym("dsp"), 0); ! class_addmethod(oggread_class, (t_method)oggread_open, gensym("open"), A_SYMBOL, 0); ! class_addmethod(oggread_class, (t_method)oggread_start, gensym("start"), 0); ! class_addmethod(oggread_class, (t_method)oggread_resume, gensym("resume"), 0); ! class_addmethod(oggread_class, (t_method)oggread_seek, gensym("seek"), A_DEFFLOAT, 0); ! class_addmethod(oggread_class, (t_method)oggread_stop, gensym("stop"), 0); ! class_sethelpsymbol(oggread_class, gensym("help-oggread~.pd")); ! } --- 1,414 ---- ! /* ------------------------- oggread~ ------------------------------------------ */ ! /* */ ! /* Tilde object to read and play back Ogg Vorbis files. */ ! /* Written by Olaf Matthes (olaf.matthes@gmx.de) */ ! /* Get source at http://www.akustische-kunst.de/puredata/ */ ! /* */ ! /* 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. */ ! /* */ ! /* This library is distributed in the hope that it will be useful, */ ! /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ ! /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ ! /* Lesser General Public License for more details. */ ! /* */ ! /* You should have received a copy of the GNU Lesser General Public */ ! /* License along with this library; if not, write to the */ ! /* Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ ! /* Boston, MA 02111-1307, USA. */ ! /* */ ! /* Based on PureData by Miller Puckette and others. */ ! /* Uses the Ogg Vorbis decoding library which can be found at */ ! /* http://www.vorbis.com/ */ ! /* */ ! /* ---------------------------------------------------------------------------- */ ! ! #include "m_pd.h" ! #include "s_stuff.h" ! #include "codec.h" ! #include "vorbis/vorbisfile.h" ! ! #include <sys/types.h> ! #include <string.h> ! #include <stdio.h> ! #include <errno.h> ! #include <fcntl.h> ! #ifdef UNIX ! #include <sys/socket.h> ! #include <netinet/in.h> ! #include <netinet/tcp.h> ! #include <arpa/inet.h> ! #include <netdb.h> ! #include <sys/time.h> ! #include <unistd.h> ! #define SOCKET_ERROR -1 ! #else ! #include <io.h> ! #include <stdlib.h> ! #endif ! ! #ifdef NT ! #pragma warning( disable : 4244 ) ! #pragma warning( disable : 4305 ) ! #endif ! ! #define READ 4096 /* amount of data we pass on to decoder */ ! #define MIN_AUDIO_INPUT READ*8 /* this is completely guessed! we just fill half the buffer */ ! #define OUTPUT_BUFFER_SIZE 65536 /* audio output buffer: 64k */ ! ! static char *oggread_version = "oggread~: ogg/vorbis file reader version 0.2c, written by Olaf Matthes"; ! ! /* ------------------------ oggread~ ----------------------------- */ ! ! static t_class *oggread_class; ! ! typedef struct _oggread ! { ! t_object x_obj; ! t_clock *x_clock; ! /* ogg/vorbis related stuff */ ! OggVorbis_File x_ov; ! ogg_stream_state x_os; /* take physical pages, weld into a logical stream of packets */ ! ogg_sync_state x_oy; /* sync and verify incoming physical bitstream */ ! ogg_page x_og; /* one Ogg bitstream page. Vorbis packets are inside */ ! ogg_packet x_op; /* one raw packet of data for decode */ ! vorbis_info *x_vi; /* struct that stores all the static vorbis bitstream settings */ ! vorbis_comment x_vc; /* struct that stores all the user comments */ ! vorbis_dsp_state x_vd; /* central working state for the packet->PCM decoder */ ! vorbis_block x_vb; /* local working space for packet->PCM decode */ ! t_int x_eos; /* end of stream */ ! char *x_buffer;/* buffer used to pass on data to ogg/vorbis */ ! ! t_float x_position; /* current playing position */ ! t_outlet *x_out_position; /* output to send them to */ ! t_outlet *x_out_end; /* signal end of file */ ! ! t_outlet *x_connection; ! t_int x_fd; /* the file handle */ ! FILE *x_file; ! int x_current_section; ! t_int x_blocksize; /* size of a dsp block */ ! t_int x_decoded; /* number of samples we got from decoder on last call */ ! ! t_float *x_outbuffer; /* buffer to store audio decoded data */ ! t_int x_outwriteposition; ! t_int x_outreadposition; ! t_int x_outunread; ! t_int x_outbuffersize; ! ! t_int x_samplerate; /* pd's samplerate, might differ from stream */ ! t_int x_stream; /* indicates if a stream gets output */ ! } t_oggread; ! ! /* output playing position */ ! static void oggread_tick(t_oggread *x) ! { ! outlet_float(x->x_out_position, x->x_position); ! clock_delay(x->x_clock, 250); ! } ! ! static int oggread_decode_input(t_oggread *x) ! { ! long ret; /* bytes per channel returned by decoder */ ! int i; ! float **pcm; ! ! x->x_vi = ov_info(&x->x_ov, x->x_current_section); ! ! while(!x->x_eos) ! { ! ret = ov_read_float(&x->x_ov, &pcm, READ, &x->x_current_section); ! if (ret == 0) ! { ! /* EOF */ ! x->x_eos = 1; ! x->x_stream = 0; ! clock_unset(x->x_clock); ! // post("oggread~: end of file detected, stopping"); ! outlet_bang(x->x_out_end); ! } ! else if (ret < 0) ! { ! /* error in the stream. Not a problem, just reporting it in ! case we (the app) cares. In this case, we don't. */ ! } ! else ! { ! /* we don't bother dealing with sample rate changes, etc, but ! you'll have to */ ! long j; ! for(j = 0; j < ret; j++) ! { ! for(i = 0; i < x->x_vi->channels; i++) ! { ! x->x_outbuffer[x->x_outwriteposition] = pcm[i][j]; ! x->x_outwriteposition = (x->x_outwriteposition + 1)%x->x_outbuffersize; ! } ! } ! x->x_outunread += (t_int)ret * x->x_vi->channels; ! ! } ! break; ! } ! x->x_decoded = (t_int)ret * x->x_vi->channels; /* num. of samples we got from decoder */ ! ! x->x_position = (t_float)ov_time_tell(&x->x_ov); ! ! /* exit decoding 'loop' here, we'll get called again by perform() */ ! return 1; ! } ! ! ! static t_int *oggread_perform(t_int *w) ! { ! t_oggread *x = (t_oggread*) (w[1]); ! t_float *out1 = (t_float *)(w[2]); ! t_float *out2 = (t_float *)(w[3]); ! int n = (int)(w[4]); ! int ret; ! int i = 0; ! ! x->x_blocksize = n; ! ! while( n-- ) ! { /* check that the stream provides enough data */ ! if((x->x_stream == 1) && (x->x_outunread > (x->x_blocksize * x->x_vi->channels))) ! { ! if(x->x_vi->channels != 1) /* play stereo */ ! { ! *out1++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! *out2++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! x->x_outunread-=2; ! } ! else /* play mono on both sides */ ! { ! *out1++=*(x->x_outbuffer+x->x_outreadposition); ! *out2++=*(x->x_outbuffer+x->x_outreadposition); ! x->x_outreadposition = (x->x_outreadposition + 1)%x->x_outbuffersize; ! x->x_outunread--; ! } ! } ! else /* silence in case of buffer underrun */ ! { ! *out1++=0.0; ! *out2++=0.0; ! } ! } ! ! /* decode data whenever we used up some samples from outbuffer */ ! if((x->x_fd > 0) && (x->x_stream) /* only go when file is open and ready */ ! && (x->x_outunread < (MIN_AUDIO_INPUT - x->x_decoded))) /* we used up data from last decode */ ! { ! // post("oggread~: decoding..."); ! if(oggread_decode_input(x) != 1) ! { ! post("oggread~: decoder error"); ! } ! // else post("oggread~: decoder returned %d samples", x->x_decoded); ! } ! return (w+5); ! } ! ! static void oggread_dsp(t_oggread *x, t_signal **sp) ! { ! dsp_add(oggread_perform, 4, x, sp[1]->s_vec, sp[2]->s_vec, sp[1]->s_n); ! } ! ! ! /* start playing */ ! static void oggread_start(t_oggread *x) ! { ! if(x->x_fd > 0) ! { ! if(ov_time_seek(&x->x_ov, 0) < 0) ! { ! post("oggread~: could not rewind file to beginning"); ! } ! post("oggread~: START"); ! x->x_eos = 0; ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! x->x_position = 0; ! clock_delay(x->x_clock, 0); ! x->x_stream = 1; ! } ! else post("oggread~: no file open (ignored)"); ! } ! ! /* resume file reading */ ! static void oggread_resume(t_oggread *x) ! { ! if(x->x_fd > 0) ! { ! x->x_stream = 1; ! clock_delay(x->x_clock, 0); ! post("oggread~: RESUME"); ! } ! else post("oggread~: encoder not initialised"); ! } ! ! /* seek in file */ ! static void oggread_seek(t_oggread *x, t_floatarg f) ! { ! if(x->x_fd > 0) ! if(ov_time_seek(&x->x_ov, f) < 0) ! { ! post("oggread~: could not set playing position to %g seconds", f); ! } ! else post("oggread~: playing position set to %g seconds", f); ! } ! ! /* stop playing */ ! static void oggread_stop(t_oggread *x) ! { ! if(x->x_stream)post("oggread~: STOP"); ! x->x_stream = 0; ! clock_unset(x->x_clock); ! } ! ! static void oggread_float(t_oggread *x, t_floatarg f) ! { ! if(f == 0) oggread_stop(x); ! else oggread_start(x); ! } ! ! /* open ogg/vorbis file */ ! static void oggread_open(t_oggread *x, t_symbol *filename) ! { ! int i; ! ! x->x_stream = 0; ! /* first close previous file */ ! if(x->x_fd > 0) ! { ! ov_clear(&x->x_ov); ! post("oggread~: previous file closed"); ! } ! /* open file for reading */ ! #ifdef UNIX ! if((x->x_file = fopen(filename->s_name, "r")) < 0) ! #else ! if((x->x_file = fopen(filename->s_name, "rb")) < 0) ! #endif ! { ! post("oggread~: could not open file "%s"", filename->s_name); ! x->x_eos = 1; ! x->x_fd = -1; ! } ! else ! { ! x->x_stream = 0; ! x->x_eos = 0; ! x->x_fd = 1; ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! post("oggread~: file "%s" opened", filename->s_name); ! outlet_float( x->x_out_position, 0); ! ! /* try to open as ogg vorbis file */ ! if(ov_open(x->x_file, &x->x_ov, NULL, -1) < 0) ! { /* an error occured (no ogg vorbis file ?) */ ! post("oggread~: error: could not open "%s" as an OggVorbis file", filename->s_name); ! ov_clear(&x->x_ov); ! post("oggread~: file closed due to error"); ! } ! ! /* print details about each logical bitstream in the input */ ! if(ov_seekable(&x->x_ov)) ! { ! post("oggread~: input bitstream contained %ld logical bitstream section(s)", ov_streams(&x->x_ov)); ! post("oggread~: total bitstream playing time: %ld seconds", (long)ov_time_total(&x->x_ov,-1)); ! post("oggread~: encoded by: %s\n",ov_comment(&x->x_ov,-1)->vendor); ! } ! else ! { ! post("oggread~: file "%s" was not seekable" ! "oggread~: first logical bitstream information:", filename->s_name); ! } ! ! for(i = 0; i < ov_streams(&x->x_ov); i++) ! { ! x->x_vi = ov_info(&x->x_ov,i); ! post("\tlogical bitstream section %d information:",i+1); ! post("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld", ! x->x_vi->rate,x->x_vi->channels,ov_bitrate(&x->x_ov,i)/1000, ov_serialnumber(&x->x_ov,i)); ! post("\t\theader length: %ld bytes",(long) ! (x->x_ov.dataoffsets[i] - x->x_ov.offsets[i])); ! post("\t\tcompressed length: %ld bytes",(long)(ov_raw_total(&x->x_ov,i))); ! post("\t\tplay time: %ld seconds\n",(long)ov_time_total(&x->x_ov,i)); ! } ! ! } ! } ! ! ! static void oggread_free(t_oggread *x) ! { ! if (x->x_fd > 0) { ! post( "oggread~: closing file" ); ! ov_clear(&x->x_ov); ! x->x_fd = -1; ! } ! freebytes(x->x_outbuffer, OUTPUT_BUFFER_SIZE*sizeof(t_float)); ! clock_free(x->x_clock); ! } ! ! static void *oggread_new(t_floatarg fdographics) ! { ! t_oggread *x = NULL; ! ! x = (t_oggread *)pd_new(oggread_class); ! outlet_new(&x->x_obj, gensym("signal")); ! outlet_new(&x->x_obj, gensym("signal")); ! x->x_out_position = outlet_new(&x->x_obj, gensym("float")); ! x->x_out_end = outlet_new(&x->x_obj, gensym("bang")); ! x->x_clock = clock_new(x, (t_method)oggread_tick); ! ! x->x_fd = -1; ! x->x_eos = 1; ! x->x_stream = 0; ! x->x_position = 0; ! x->x_samplerate = sys_getsr(); ! ! x->x_outbuffersize = OUTPUT_BUFFER_SIZE; ! x->x_outbuffer = (t_float*) getbytes(OUTPUT_BUFFER_SIZE*sizeof(t_float)); ! ! if(!x->x_outbuffer) ! { ! post( "oggread~: could not allocate buffer" ); ! return NULL; ! } ! memset(x->x_outbuffer, 0x0, OUTPUT_BUFFER_SIZE); ! ! x->x_outreadposition = 0; ! x->x_outwriteposition = 0; ! x->x_outunread = 0; ! x->x_decoded = 0; ! ! post(oggread_version); ! ! return (x); ! } ! ! ! void oggread_tilde_setup(void) ! { ! oggread_class = class_new(gensym("oggread~"), ! (t_newmethod) oggread_new, (t_method) oggread_free, ! sizeof(t_oggread), 0, A_DEFFLOAT, A_NULL); ! class_addfloat(oggread_class, (t_method)oggread_float); ! class_addmethod(oggread_class, nullfn, gensym("signal"), 0); ! class_addmethod(oggread_class, (t_method)oggread_dsp, gensym("dsp"), 0); ! class_addmethod(oggread_class, (t_method)oggread_open, gensym("open"), A_SYMBOL, 0); ! class_addmethod(oggread_class, (t_method)oggread_start, gensym("start"), 0); ! class_addmethod(oggread_class, (t_method)oggread_resume, gensym("resume"), 0); ! class_addmethod(oggread_class, (t_method)oggread_seek, gensym("seek"), A_DEFFLOAT, 0); ! class_addmethod(oggread_class, (t_method)oggread_stop, gensym("stop"), 0); ! class_sethelpsymbol(oggread_class, gensym("help-oggread~.pd")); ! }
Index: readme =================================================================== RCS file: /cvsroot/pure-data/externals/pdogg/oggread~/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:08 -0000 1.3 *************** *** 1,75 **** ! oggread~ version 0.2c ! copyright (c) 2002 by Olaf Matthes ! ! oggread~ is an ogg/vorbis file player external for pd (by Miller ! Puckette). ! ! ! To run oggread~ place the file oggread~.dll for win or oggread~.pd_linux ! in the directory of our patch or start pd with '-lib oggread~' flag. ! ! To compile oggread~ 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. ! ! ***************************************************************************** ! ! oggread~ 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. ! ! ***************************************************************************** ! ! Listening to it: ! ! To listen to ogg/vorbis encoded audio files many player need an extra plug-in. ! Have a look at http://www.vorbis.com/ to find the appropiate plug-in for your ! player. ! ! ! ! ! ! Latest version can be found at: ! http://www.akustische-kunst.de/puredata/ ! Please report any bugs to olaf.matthes@gmx.de! --- 1,75 ---- ! oggread~ version 0.2c ! copyright (c) 2002 by Olaf Matthes ! ! oggread~ is an ogg/vorbis file player external for pd (by Miller ! Puckette). ! ! ! To run oggread~ place the file oggread~.dll for win or oggread~.pd_linux ! in the directory of our patch or start pd with '-lib oggread~' flag. ! ! To compile oggread~ 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. ! ! ***************************************************************************** ! ! oggread~ 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. ! ! ***************************************************************************** ! ! Listening to it: ! ! To listen to ogg/vorbis encoded audio files many player need an extra plug-in. ! Have a look at http://www.vorbis.com/ to find the appropiate plug-in for your ! player. ! ! ! ! ! ! Latest version can be found at: ! http://www.akustische-kunst.de/puredata/ ! Please report any bugs to olaf.matthes@gmx.de!