Blame src/libout123/out123_int.h

Packit c32a2d
/*
Packit c32a2d
	out123_int: internal header for libout123
Packit c32a2d
Packit c32a2d
	copyright ?-2016 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 Michael Hipp (some traces left)
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#ifndef _MPG123_OUT123_INT_H_
Packit c32a2d
#define _MPG123_OUT123_INT_H_
Packit c32a2d
Packit c32a2d
#include "config.h"
Packit c32a2d
#include "intsym.h"
Packit c32a2d
#include "abi_align.h"
Packit c32a2d
#include "compat.h"
Packit c32a2d
#include "out123.h"
Packit c32a2d
#include "module.h"
Packit c32a2d
Packit c32a2d
#ifndef NOXFERMEM
Packit c32a2d
#include "xfermem.h"
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* 3% rate tolerance */
Packit c32a2d
#define AUDIO_RATE_TOLERANCE	  3
Packit c32a2d
Packit c32a2d
/* Keep those internally? To the outside, it's just a selection of
Packit c32a2d
   driver modules. */
Packit c32a2d
enum {
Packit c32a2d
	DECODE_TEST,  /* "test" */
Packit c32a2d
	DECODE_AUDIO, /* gone */
Packit c32a2d
	DECODE_FILE,  /* "raw" */
Packit c32a2d
	DECODE_BUFFER, /* internal use only, if at all */
Packit c32a2d
	DECODE_WAV,    /* wav */
Packit c32a2d
	DECODE_AU,     /* au */
Packit c32a2d
	DECODE_CDR,    /* cdr */
Packit c32a2d
	DECODE_AUDIOFILE /* internal use only, if at all */
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* Playback states mostly for the buffer process.
Packit c32a2d
   Maybe also used in main program. */
Packit c32a2d
enum playstate
Packit c32a2d
{
Packit c32a2d
	play_dead = 0 /* nothing playing, nothing loaded */
Packit c32a2d
,	play_stopped  /* driver present, but no device configured/opened */
Packit c32a2d
/* The ordering is used, state > play_stopped means some device is opened. */
Packit c32a2d
,	play_paused   /* paused, ready to continue, device still active */
Packit c32a2d
,	play_live     /* playing right now */
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
struct out123_struct
Packit c32a2d
{
Packit c32a2d
	enum out123_error errcode;
Packit c32a2d
#ifndef NOXFERMEM
Packit c32a2d
	/* If buffer_pid >= 0, there is a separate buffer process actually
Packit c32a2d
	   handling everything, this instance here is then only a proxy. */
Packit c32a2d
	int buffer_pid;
Packit c32a2d
	int buffer_fd[2];
Packit c32a2d
	txfermem *buffermem;
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
	int fn;			/* filenumber */
Packit c32a2d
	void *userptr;	/* driver specific pointer */
Packit c32a2d
	
Packit c32a2d
	/* Callbacks */
Packit c32a2d
	int (*open)(out123_handle *);
Packit c32a2d
	int (*get_formats)(out123_handle *);
Packit c32a2d
	int (*write)(out123_handle *, unsigned char *,int);
Packit c32a2d
	void (*flush)(out123_handle *); /* flush == drop != drain */
Packit c32a2d
	void (*drain)(out123_handle *);
Packit c32a2d
	int (*close)(out123_handle *);
Packit c32a2d
	int (*deinit)(out123_handle *);
Packit c32a2d
	
Packit c32a2d
	/* the loaded that has set the above */
Packit c32a2d
	mpg123_module_t *module;
Packit c32a2d
Packit c32a2d
	char *name;	    /* optional name of this instance */
Packit c32a2d
	char *realname; /* name possibly changed by backend */
Packit c32a2d
	char *driver;	/* driver (module) name */
Packit c32a2d
	char *device;	/* device name */
Packit c32a2d
	int   flags;	/* some bits; namely headphone/speaker/line */
Packit c32a2d
	long rate;		/* sample rate */
Packit c32a2d
	long gain;		/* output gain */
Packit c32a2d
	int channels;	/* number of channels */
Packit c32a2d
	int format;		/* encoding (TODO: rename this to "encoding"!) */
Packit c32a2d
	int framesize;	/* Output needs data in chunks of framesize bytes. */
Packit c32a2d
	enum playstate state; /* ... */
Packit c32a2d
	int auxflags;	/* For now just one: quiet mode (for probing). */
Packit c32a2d
	int propflags;	/* Property flags, set by driver. */
Packit c32a2d
	double preload;	/* buffer fraction to preload before play */
Packit c32a2d
	int verbose;	/* verbosity to stderr */
Packit c32a2d
	double device_buffer; /* device buffer in seconds */
Packit c32a2d
	char *bindir;	/* OUT123_BINDIR */
Packit c32a2d
/* TODO int intflag;   ... is it really useful/necessary from the outside? */
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
/* Lazy. */
Packit c32a2d
#define AOQUIET ((ao->auxflags | ao->flags) & OUT123_QUIET)
Packit c32a2d
#define AOVERBOSE(v) (!AOQUIET && ao->verbose >= (v))
Packit c32a2d
#define GOOD_WRITEVAL(fd, val)     (unintr_write(fd, &(val), sizeof((val))) == sizeof((val)))
Packit c32a2d
#define GOOD_WRITEBUF(fd, addr, n) (unintr_write(fd, (addr), (n)) == (n))
Packit c32a2d
#define GOOD_READVAL(fd, val)      (unintr_read(fd, &(val), sizeof((val))) == sizeof((val)))
Packit c32a2d
#define GOOD_READBUF(fd, addr, n)  (unintr_read(fd, (addr), (n)) == (n))
Packit c32a2d
Packit c32a2d
struct audio_format_name {
Packit c32a2d
	int  val;
Packit c32a2d
	char *name;
Packit c32a2d
	char *sname;
Packit c32a2d
};
Packit c32a2d
Packit c32a2d
int write_parameters(out123_handle *ao, int fd);
Packit c32a2d
int read_parameters(out123_handle *ao
Packit c32a2d
,	int fd, byte *prebuf, int *preoff, int presize);
Packit c32a2d
Packit c32a2d
#endif
Packit c32a2d