tomwalters@0: /* tomwalters@0: source.h tomwalters@0: ======== tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: */ tomwalters@0: tomwalters@0: #ifndef _SOURCE_H_ tomwalters@0: #define _SOURCE_H_ tomwalters@0: tomwalters@0: #include "buffer.h" tomwalters@0: tomwalters@0: /* standard entry points */ tomwalters@0: tomwalters@0: #define PullSome( _source, _bytes ) ( _SPTR( _source )->returned = _SPTR( _source )->pull( _SPTR( _source ), (ByteCount *) ( _bytes ) ) ) tomwalters@0: #define FillSome( _source, _bytes, _buffer ) ( _SPTR( _source )->returned = _SPTR( _source )->fill( _SPTR( _source ), (ByteCount *) ( _bytes ), (Pointer ) ( _buffer ) ) ) tomwalters@0: #define RollSome( _source, _bytes, _kept ) ( _SPTR( _source )->returned = _SPTR( _source )->roll( _SPTR( _source ), (ByteCount *) ( _bytes ), (ByteCount) ( _kept ) ) ) tomwalters@0: tomwalters@0: /* for compatability */ tomwalters@0: tomwalters@0: #define Pull( _source, _bytes ) ( _SPTR( _source )->returned = oldPull( _SPTR( _source ), (ByteCount ) ( _bytes ) ) ) tomwalters@0: #define Fill( _source, _bytes, _buffer ) ( _SPTR( _source )->returned = oldFill( _SPTR( _source ), (ByteCount ) ( _bytes ), (Pointer ) ( _buffer ) ) ) tomwalters@0: #define Roll( _source, _bytes, _kept ) ( _SPTR( _source )->returned = oldRoll( _SPTR( _source ), (ByteCount ) ( _bytes ), (ByteCount) ( _kept ) ) ) tomwalters@0: tomwalters@0: /* for more compatability */ tomwalters@0: tomwalters@0: #define Shift( _source, _bytes, _kept ) Roll( _source, _bytes, _kept ) tomwalters@0: tomwalters@0: /* count conversions */ tomwalters@0: tomwalters@0: #define ToPoints( _type, _bytes ) ( ( _bytes ) >> ( sizeof(_type) >> 1 ) ) tomwalters@0: #define ToBytes( _type, _points ) ( ( char *) ( (_type *) 0l + ( _points ) ) - ( char *) 0l ) tomwalters@0: tomwalters@0: /* for convenience */ tomwalters@0: tomwalters@0: #define PullItems( _source, _number, _type ) ( (_type *) Pull( _source, ToBytes( _type, _number ) ) ) tomwalters@0: tomwalters@0: #define PullChars( _source, _number ) PullItems( _source, _number, char ) tomwalters@0: #define PullShorts( _source, _number ) PullItems( _source, _number, short ) tomwalters@0: #define PullInts( _source, _number ) PullItems( _source, _number, int ) tomwalters@0: #define PullDoubles( _source, _number ) PullItems( _source, _number, double ) tomwalters@0: tomwalters@0: tomwalters@0: #define FillItems( _source, _number, _buffer, _type ) ( (_type *) Fill( _source, ToBytes( _type, _number ), (Pointer) ( _buffer ) ) ) tomwalters@0: tomwalters@0: #define FillChars( _source, _number, _buffer ) FillItems( _source, _number, _buffer, char ) tomwalters@0: #define FillShorts( _source, _number, _buffer ) FillItems( _source, _number, _buffer, short ) tomwalters@0: #define FillInts( _source, _number, _buffer ) FillItems( _source, _number, _buffer, int ) tomwalters@0: #define FillDoubles( _source, _number, _buffer ) FillItems( _source, _number, _buffer, double ) tomwalters@0: tomwalters@0: tomwalters@0: #define RollItems( _source, _number, _keep, _type ) ( (_type *) Roll( _source, ToBytes( _type, _number ), ( _keep ) * sizeof ( _type ) ) ) tomwalters@0: tomwalters@0: #define RollChars( _source, _number, _keep ) RollItems( _source, _number, _keep, char ) tomwalters@0: #define RollShorts( _source, _number, _keep ) RollItems( _source, _number, _keep, short ) tomwalters@0: #define RollInts( _source, _number, _keep ) RollItems( _source, _number, _keep, int ) tomwalters@0: #define RollDoubles( _source, _number, _keep ) RollItems( _source, _number, _keep, double ) tomwalters@0: tomwalters@0: /* operators on sources */ tomwalters@0: tomwalters@0: #define SetSource( _src, _puller, _filler, _roller, _name ) setSource( (struct _source *) _src, _puller, _filler, _roller, _name ) tomwalters@0: #define TypeSource( _src, _type ) typeSource( (struct _source *) _src, _type ) tomwalters@0: #define SourceType( _src ) sourceType( (struct _source *) _src ) tomwalters@0: #define SourceName( _src ) sourceName( (struct _source *) _src ) tomwalters@0: #define DeleteSource( _src ) deleteSource( (struct _source *) _src ) tomwalters@0: tomwalters@0: #if 00 tomwalters@0: #define NameOfClass BasicSourceClass tomwalters@0: tomwalters@0: #define SetSource( _source, _puller, _filler, _roller, _name ) NameOfClass.set( (struct _source *) _source, _puller, _filler, _roller, _name ) tomwalters@0: #define TypeSource( _source, _type ) NameOfClass.setType( (struct _source *) _source, _type ) tomwalters@0: #define SourceType( _source ) NameOfClass.getType( (struct _source *) _source ) tomwalters@0: #define SourceName( _source ) NameOfClass.getName( (struct _source *) _source ) tomwalters@0: #define DeleteSource( _source ) NameOfClass.delete( (struct _source *) _source ) tomwalters@0: #endif tomwalters@0: tomwalters@0: tomwalters@0: tomwalters@0: #define SinkSource( _source, _framebytes , _frames ) \ tomwalters@0: sinkSource( _source, (ByteCount) ( _framebytes ), (long) _frames ) tomwalters@0: tomwalters@0: #define SinkAndCloseSource( _source, _framebytes , _frames ) \ tomwalters@0: sinkAndCloseSource( _source, (ByteCount) ( _framebytes ), (long) _frames ) tomwalters@0: tomwalters@0: /* moving towards buffer abstraction, slowly */ tomwalters@0: tomwalters@0: #define SourceBuffer( _source ) ( ( _source )->buffer ) tomwalters@0: #define SetSourceBuffer( _source, _buffer ) ( ( _source )->buffer = _buffer ) tomwalters@0: tomwalters@0: /* only pure source */ tomwalters@0: tomwalters@0: #define NewTappingSource( _source , _state, _callback, _close, _name ) \ tomwalters@0: newTappingSource( (Pointer) ( _source ), _state, _callback, _close, _name ) tomwalters@0: tomwalters@0: #define NewRollableSource( _source ) \ tomwalters@0: newRollableSource( _source ) tomwalters@0: tomwalters@0: #if 0 tomwalters@0: /* for compatability */ tomwalters@0: tomwalters@0: #define NewShiftableSource( _source ) \ tomwalters@0: NewRollableSource( _source ) tomwalters@0: #endif tomwalters@0: tomwalters@0: /* for binding with C++ perhaps someday */ tomwalters@0: tomwalters@0: #if defined(__cplusplus) || defined(c_plusplus) tomwalters@0: #define CPLPL 1 tomwalters@0: #else tomwalters@0: #define CPLPL 0 tomwalters@0: #endif tomwalters@0: tomwalters@0: #if CPLPL tomwalters@0: tomwalters@0: #define _SPTR( _s ) ((_s).ptr) tomwalters@0: #define _MANY_ARGS ... tomwalters@0: #define _ONE_SOURCE Source source tomwalters@0: #define _TWO_SOURCES Source source1, Source source2 tomwalters@0: #define _ONE_SOURCE_PLUS Source source... tomwalters@0: tomwalters@0: typedef class _source &Source ; /* ?? or something */ tomwalters@0: tomwalters@0: #else tomwalters@0: tomwalters@0: #define _SPTR( _s ) _s tomwalters@0: #define _MANY_ARGS /* ... */ tomwalters@0: #define _ONE_SOURCE /* Source source */ tomwalters@0: #define _TWO_SOURCES /* Source source1, Source source2 */ tomwalters@0: #define _ONE_SOURCE_PLUS /* Source source... */ tomwalters@0: tomwalters@0: /* basic types */ tomwalters@0: tomwalters@0: typedef struct _source *Source, *SourceArray[1] ; tomwalters@0: tomwalters@0: #endif tomwalters@0: tomwalters@0: typedef Source CharSource, ShortSource, IntSource, FloatSource, DoubleSource, ComplexSource ; tomwalters@0: typedef SourceArray CharSourceArray, ShortSourceArray, IntSourceArray, FloatSourceArray, DoubleSourceArray, ComplexSourceArray ; tomwalters@0: tomwalters@0: typedef int ByteCount ; tomwalters@0: tomwalters@0: /* dependant on type of source */ tomwalters@0: tomwalters@0: struct _source { Pointer (*pull)(), (*fill)(), (*roll)(), returned ; char *name, *type ; int opened ; Source (*open)() ; } ; tomwalters@0: struct _source_operators { Source (*set)() ; Pointer (*delete)() ; Source (*setType)() ; char *(*getType)() ; char *(*getName)() ; } ; tomwalters@0: tomwalters@0: struct _pullable_source { struct _source parent ; } ; tomwalters@0: struct _fillable_source { struct _source parent ; Buffer buffer ; } ; tomwalters@0: tomwalters@0: #if 00 tomwalters@0: extern struct _source_operators NameOfClass ; tomwalters@0: extern struct _source *call_conversions ; tomwalters@0: #endif tomwalters@0: tomwalters@0: extern Source setSource() ; tomwalters@0: extern Source typeSource() ; tomwalters@0: extern char *sourceType() ; tomwalters@0: extern char *sourceName() ; tomwalters@0: extern Pointer deleteSource() ; tomwalters@0: tomwalters@0: extern Pointer oldPull(), oldFill(), oldRoll() ; tomwalters@0: tomwalters@0: tomwalters@0: extern void sinkSource() ; tomwalters@0: extern void CloseSource() ; tomwalters@0: extern void sinkAndCloseSource() ; tomwalters@0: tomwalters@0: /* derived source types for different purposes */ tomwalters@0: tomwalters@0: extern Source newTappingSource() ; tomwalters@0: extern Source newRollableSource() ; tomwalters@0: tomwalters@0: extern Pointer nonRoller() ; tomwalters@0: tomwalters@0: #include "pullable.h" tomwalters@0: tomwalters@0: #include "fillable.h" tomwalters@0: tomwalters@0: extern Source *BindSources() ; tomwalters@0: tomwalters@0: /* for compatability... for now */ tomwalters@0: tomwalters@0: extern Source stdStaticSource() ; tomwalters@0: extern Source stdSlaveSource() ; tomwalters@0: extern Source stdAutoSource() ; tomwalters@0: extern Source stdSelfSource() ; tomwalters@0: tomwalters@0: #endif tomwalters@0: tomwalters@0: extern Source EmptySource ;