Blame src/libmpg123/reader.h

Packit c32a2d
/*
Packit c32a2d
	reader: reading input data
Packit c32a2d
Packit c32a2d
	copyright ?-2007 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Thomas Orgis (after code from Michael Hipp)
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef MPG123_READER_H
Packit c32a2d
#define MPG123_READER_H
Packit c32a2d
Packit c32a2d
#include "config.h"
Packit c32a2d
#include "mpg123.h"
Packit c32a2d
Packit c32a2d
#ifndef NO_FEEDER
Packit c32a2d
struct buffy
Packit c32a2d
{
Packit c32a2d
	unsigned char *data;
Packit c32a2d
	ssize_t size;
Packit c32a2d
	ssize_t realsize;
Packit c32a2d
	struct buffy *next;
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
Packit c32a2d
struct bufferchain
Packit c32a2d
{
Packit c32a2d
	struct buffy* first; /* The beginning of the chain. */
Packit c32a2d
	struct buffy* last;  /* The end...    of the chain. */
Packit c32a2d
	ssize_t size;        /* Aggregated size of all buffies. */
Packit c32a2d
	/* These positions are relative to buffer chain beginning. */
Packit c32a2d
	ssize_t pos;         /* Position in whole chain. */
Packit c32a2d
	ssize_t firstpos;    /* The point of return on non-forget() */
Packit c32a2d
	/* The "real" filepos is fileoff + pos. */
Packit c32a2d
	off_t fileoff;       /* Beginning of chain is at this file offset. */
Packit c32a2d
	size_t bufblock;     /* Default (minimal) size of buffers. */
Packit c32a2d
	size_t pool_size;    /* Keep that many buffers in storage. */
Packit c32a2d
	size_t pool_fill;    /* That many buffers are there. */
Packit c32a2d
	/* A pool of buffers to re-use, if activated. It's a linked list that is worked on from the front. */
Packit c32a2d
	struct buffy *pool;
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* Call this before any buffer chain use (even bc_init()). */
Packit c32a2d
void bc_prepare(struct bufferchain *, size_t pool_size, size_t bufblock);
Packit c32a2d
/* Free persistent data in the buffer chain, after bc_reset(). */
Packit c32a2d
void bc_cleanup(struct bufferchain *);
Packit c32a2d
/* Change pool size. This does not actually allocate/free anything on itself, just instructs later operations to free less / allocate more buffers. */
Packit c32a2d
void bc_poolsize(struct bufferchain *, size_t pool_size, size_t bufblock);
Packit c32a2d
/* Return available byte count in the buffer. */
Packit c32a2d
size_t bc_fill(struct bufferchain *bc);
Packit c32a2d
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
struct reader_data
Packit c32a2d
{
Packit c32a2d
	off_t filelen; /* total file length or total buffer size */
Packit c32a2d
	off_t filepos; /* position in file or position in buffer chain */
Packit c32a2d
	int   filept;
Packit c32a2d
	/* Custom opaque I/O handle from the client. */
Packit c32a2d
	void *iohandle;
Packit c32a2d
	int   flags;
Packit c32a2d
	long timeout_sec;
Packit c32a2d
	ssize_t (*fdread) (mpg123_handle *, void *, size_t);
Packit c32a2d
	/* User can replace the read and lseek functions. The r_* are the stored replacement functions or NULL. */
Packit c32a2d
	ssize_t (*r_read) (int fd, void *buf, size_t count);
Packit c32a2d
	off_t   (*r_lseek)(int fd, off_t offset, int whence);
Packit c32a2d
	/* These are custom I/O routines for opaque user handles.
Packit c32a2d
	   They get picked if there's some iohandle set. */
Packit c32a2d
	ssize_t (*r_read_handle) (void *handle, void *buf, size_t count);
Packit c32a2d
	off_t   (*r_lseek_handle)(void *handle, off_t offset, int whence);
Packit c32a2d
	/* An optional cleaner for the handle on closing the stream. */
Packit c32a2d
	void    (*cleanup_handle)(void *handle);
Packit c32a2d
	/* These two pointers are the actual workers (default map to POSIX read/lseek). */
Packit c32a2d
	ssize_t (*read) (int fd, void *buf, size_t count);
Packit c32a2d
	off_t   (*lseek)(int fd, off_t offset, int whence);
Packit c32a2d
	/* Buffered readers want that abstracted, set internally. */
Packit c32a2d
	ssize_t (*fullread)(mpg123_handle *, unsigned char *, ssize_t);
Packit c32a2d
#ifndef NO_FEEDER
Packit c32a2d
	struct bufferchain buffer; /* Not dynamically allocated, these few struct bytes aren't worth the trouble. */
Packit c32a2d
#endif
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* start to use off_t to properly do LFS in future ... used to be long */
Packit c32a2d
struct reader
Packit c32a2d
{
Packit c32a2d
	int     (*init)           (mpg123_handle *);
Packit c32a2d
	void    (*close)          (mpg123_handle *);
Packit c32a2d
	ssize_t (*fullread)       (mpg123_handle *, unsigned char *, ssize_t);
Packit c32a2d
	int     (*head_read)      (mpg123_handle *, unsigned long *newhead);    /* succ: TRUE, else <= 0 (FALSE or READER_MORE) */
Packit c32a2d
	int     (*head_shift)     (mpg123_handle *, unsigned long *head);       /* succ: TRUE, else <= 0 (FALSE or READER_MORE) */
Packit c32a2d
	off_t   (*skip_bytes)     (mpg123_handle *, off_t len);                 /* succ: >=0, else error or READER_MORE         */
Packit c32a2d
	int     (*read_frame_body)(mpg123_handle *, unsigned char *, int size);
Packit c32a2d
	int     (*back_bytes)     (mpg123_handle *, off_t bytes);
Packit c32a2d
	int     (*seek_frame)     (mpg123_handle *, off_t num);
Packit c32a2d
	off_t   (*tell)           (mpg123_handle *);
Packit c32a2d
	void    (*rewind)         (mpg123_handle *);
Packit c32a2d
	void    (*forget)         (mpg123_handle *);
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* Open a file by path or use an opened file descriptor. */
Packit c32a2d
int open_stream(mpg123_handle *, const char *path, int fd);
Packit c32a2d
/* Open an external handle. */
Packit c32a2d
int open_stream_handle(mpg123_handle *, void *iohandle);
Packit c32a2d
Packit c32a2d
/* feed based operation has some specials */
Packit c32a2d
int open_feed(mpg123_handle *);
Packit c32a2d
/* externally called function, returns 0 on success, -1 on error */
Packit c32a2d
int  feed_more(mpg123_handle *fr, const unsigned char *in, long count);
Packit c32a2d
void feed_forget(mpg123_handle *fr);  /* forget the data that has been read (free some buffers) */
Packit c32a2d
off_t feed_set_pos(mpg123_handle *fr, off_t pos); /* Set position (inside available data if possible), return wanted byte offset of next feed. */
Packit c32a2d
Packit c32a2d
void open_bad(mpg123_handle *);
Packit c32a2d
Packit c32a2d
#define READER_FD_OPENED 0x1
Packit c32a2d
#define READER_ID3TAG    0x2
Packit c32a2d
#define READER_SEEKABLE  0x4
Packit c32a2d
#define READER_BUFFERED  0x8
Packit c32a2d
#define READER_NONBLOCK  0x20
Packit c32a2d
#define READER_HANDLEIO  0x40
Packit c32a2d
Packit c32a2d
#define READER_STREAM 0
Packit c32a2d
#define READER_ICY_STREAM 1
Packit c32a2d
#define READER_FEED       2
Packit c32a2d
/* These two add a little buffering to enable small seeks for peek ahead. */
Packit c32a2d
#define READER_BUF_STREAM 3
Packit c32a2d
#define READER_BUF_ICY_STREAM 4
Packit c32a2d
Packit c32a2d
#ifdef READ_SYSTEM
Packit c32a2d
#define READER_SYSTEM 5
Packit c32a2d
#define READERS 6
Packit c32a2d
#else
Packit c32a2d
#define READERS 5
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
#define READER_ERROR MPG123_ERR
Packit c32a2d
#define READER_MORE  MPG123_NEED_MORE
Packit c32a2d
Packit c32a2d
#endif