|
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 |
|