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