[BACK]Return to aproc.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / aucat

Annotation of src/usr.bin/aucat/aproc.h, Revision 1.31

1.30      ratchov     1: /*     $OpenBSD: aproc.h,v 1.29 2010/01/11 13:06:32 ratchov Exp $      */
1.1       ratchov     2: /*
                      3:  * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17: #ifndef APROC_H
                     18: #define APROC_H
                     19:
                     20: #include <sys/queue.h>
                     21:
                     22: #include "aparams.h"
1.17      ratchov    23: #include "file.h"
1.1       ratchov    24:
                     25: struct abuf;
                     26: struct aproc;
                     27: struct file;
                     28:
                     29: struct aproc_ops {
                     30:        /*
                     31:         * Name of the ops structure, ie type of the unit.
                     32:         */
                     33:        char *name;
                     34:
                     35:        /*
                     36:         * The state of the given input abuf changed (eg. an input block
                     37:         * is ready for processing). This function must get the block
                     38:         * from the input, process it and remove it from the buffer.
                     39:         *
                     40:         * Processing the block will result in a change of the state of
                     41:         * OTHER buffers that are attached to the aproc (eg. the output
                     42:         * buffer was filled), thus this routine MUST notify ALL aproc
                     43:         * structures that are waiting on it; most of the time this
                     44:         * means just calling abuf_flush() on the output buffer.
                     45:         */
                     46:        int (*in)(struct aproc *, struct abuf *);
                     47:
                     48:        /*
                     49:         * The state of the given output abuf changed (eg. space for a
                     50:         * new output block was made available) so processing can
                     51:         * continue.  This function must process more input in order to
                     52:         * fill the output block.
                     53:         *
                     54:         * Producing a block will result in the change of the state of
                     55:         * OTHER buffers that are attached to the aproc, thus this
                     56:         * routine MUST notify ALL aproc structures that are waiting on
                     57:         * it; most of the time this means calling abuf_fill() on the
                     58:         * source buffers.
                     59:         *
                     60:         * Before filling input buffers (using abuf_fill()), this
                     61:         * routine must ALWAYS check for eof condition, and if needed,
                     62:         * handle it appropriately and call abuf_hup() to free the input
                     63:         * buffer.
                     64:         */
                     65:        int (*out)(struct aproc *, struct abuf *);
                     66:
                     67:        /*
                     68:         * The input buffer is empty and we can no more receive data
                     69:         * from it. The buffer will be destroyed as soon as this call
                     70:         * returns so the abuf pointer will stop being valid after this
                     71:         * call returns. There's no need to drain the buffer because the
                     72:         * in() call-back was just called before.
                     73:         *
                     74:         * If this call reads and/or writes data on other buffers,
                     75:         * abuf_flush() and abuf_fill() must be called appropriately.
                     76:         */
                     77:        void (*eof)(struct aproc *, struct abuf *);
                     78:
                     79:        /*
                     80:         * The output buffer can no more accept data (it should be
                     81:         * considered as full). After this function returns, it will be
                     82:         * destroyed and the "abuf" pointer will be no more valid.
                     83:         */
                     84:        void (*hup)(struct aproc *, struct abuf *);
                     85:
                     86:        /*
                     87:         * A new input was connected.
                     88:         */
                     89:        void (*newin)(struct aproc *, struct abuf *);
                     90:
                     91:        /*
                     92:         * A new output was connected
                     93:         */
                     94:        void (*newout)(struct aproc *, struct abuf *);
1.3       ratchov    95:
                     96:        /*
1.6       ratchov    97:         * Real-time record position changed (for input buffer),
1.18      ratchov    98:         * by the given amount of _frames_.
1.6       ratchov    99:         */
                    100:        void (*ipos)(struct aproc *, struct abuf *, int);
                    101:
                    102:        /*
                    103:         * Real-time play position changed (for output buffer),
1.18      ratchov   104:         * by the given amount of _frames_.
1.6       ratchov   105:         */
                    106:        void (*opos)(struct aproc *, struct abuf *, int);
                    107:
                    108:        /*
1.18      ratchov   109:         * Destroy the aproc, called just before to free the
                    110:         * aproc structure.
1.3       ratchov   111:         */
                    112:        void (*done)(struct aproc *);
1.1       ratchov   113: };
                    114:
                    115: /*
                    116:  * The aproc structure represents a simple audio processing unit; they are
                    117:  * interconnected by abuf structures and form a kind of "circuit". The circuit
                    118:  * cannot have loops.
                    119:  */
                    120: struct aproc {
                    121:        char *name;                             /* for debug purposes */
                    122:        struct aproc_ops *ops;                  /* call-backs */
                    123:        LIST_HEAD(, abuf) ibuflist;             /* list of inputs */
                    124:        LIST_HEAD(, abuf) obuflist;             /* list of outputs */
1.15      ratchov   125:        unsigned refs;                          /* extern references */
1.27      ratchov   126: #define APROC_ZOMB     1                       /* destroyed but not freed */
                    127: #define APROC_QUIT     2                       /* try to terminate if unused */
                    128: #define APROC_DROP     4                       /* xrun if capable */
                    129:        unsigned flags;
1.1       ratchov   130:        union {                                 /* follow type-specific data */
                    131:                struct {                        /* file/device io */
                    132:                        struct file *file;      /* file to read/write */
                    133:                } io;
                    134:                struct {
1.12      ratchov   135:                        unsigned idle;          /* frames since idleing */
1.6       ratchov   136:                        int lat;                /* current latency */
1.27      ratchov   137:                        int maxlat;             /* max latency allowed */
1.31    ! ratchov   138:                        struct aproc *ctl;
1.2       ratchov   139:                } mix;
                    140:                struct {
1.12      ratchov   141:                        unsigned idle;          /* frames since idleing */
1.6       ratchov   142:                        int lat;                /* current latency */
1.27      ratchov   143:                        int maxlat;             /* max latency allowed */
                    144:                        struct aproc *ctl;
1.2       ratchov   145:                } sub;
1.7       ratchov   146:                struct {
1.14      ratchov   147: #define RESAMP_NCTX    2
                    148:                        unsigned ctx_start;
                    149:                        short ctx[NCHAN_MAX * RESAMP_NCTX];
1.13      ratchov   150:                        unsigned iblksz, oblksz;
1.14      ratchov   151:                        int diff;
1.31    ! ratchov   152:                        int idelta, odelta;     /* remainder of resamp_[io]pos */
1.7       ratchov   153:                } resamp;
1.9       ratchov   154:                struct {
                    155:                        short ctx[NCHAN_MAX];
                    156:                } cmap;
1.11      ratchov   157:                struct {
                    158:                        int bfirst;             /* bytes to skip at startup */
                    159:                        unsigned bps;           /* bytes per sample */
                    160:                        unsigned shift;         /* shift to get 32bit MSB */
                    161:                        int sigbit;             /* sign bits to XOR */
                    162:                        int bnext;              /* to reach the next byte */
                    163:                        int snext;              /* to reach the next sample */
                    164:                } conv;
1.17      ratchov   165:                struct {
                    166:                        struct abuf *owner;     /* current input stream */
                    167:                        struct timo timo;       /* timout for throtteling */
                    168:                } thru;
1.19      ratchov   169:                struct {
                    170: #define CTL_NSLOT      8
                    171: #define CTL_NAMEMAX    8
1.21      ratchov   172:                        unsigned serial;
1.27      ratchov   173: #define CTL_OFF                0                       /* ignore MMC messages */
                    174: #define CTL_STOP       1                       /* stopped, can't start */
                    175: #define CTL_START      2                       /* attempting to start */
                    176: #define CTL_RUN                3                       /* started */
                    177:                        unsigned tstate;
                    178:                        unsigned origin;        /* MTC start time */
                    179:                        unsigned fps;           /* MTC frames per second */
                    180: #define MTC_FPS_24     0
                    181: #define MTC_FPS_25     1
                    182: #define MTC_FPS_30     3
                    183:                        unsigned fps_id;        /* one of above */
                    184:                        unsigned hr;            /* MTC hours */
                    185:                        unsigned min;           /* MTC minutes */
                    186:                        unsigned sec;           /* MTC seconds */
                    187:                        unsigned fr;            /* MTC frames */
                    188:                        unsigned qfr;           /* MTC quarter frames */
                    189:                        int delta;              /* rel. to the last MTC tick */
1.19      ratchov   190:                        struct ctl_slot {
1.26      ratchov   191:                                struct ctl_ops {
                    192:                                        void (*vol)(void *, unsigned);
1.27      ratchov   193:                                        void (*start)(void *);
1.26      ratchov   194:                                } *ops;
1.20      ratchov   195:                                void *arg;
1.19      ratchov   196:                                unsigned unit;
                    197:                                char name[CTL_NAMEMAX];
1.21      ratchov   198:                                unsigned serial;
1.22      ratchov   199:                                unsigned vol;
1.27      ratchov   200:                                unsigned tstate;
1.19      ratchov   201:                        } slot[CTL_NSLOT];
                    202:                } ctl;
1.1       ratchov   203:        } u;
                    204: };
                    205:
1.3       ratchov   206: struct aproc *aproc_new(struct aproc_ops *, char *);
1.1       ratchov   207: void aproc_del(struct aproc *);
1.23      ratchov   208: void aproc_dbg(struct aproc *);
1.1       ratchov   209: void aproc_setin(struct aproc *, struct abuf *);
                    210: void aproc_setout(struct aproc *, struct abuf *);
1.17      ratchov   211: int aproc_depend(struct aproc *, struct aproc *);
1.1       ratchov   212:
1.28      ratchov   213: struct aproc *rfile_new(struct file *);
                    214: struct aproc *wfile_new(struct file *);
1.31    ! ratchov   215: struct aproc *mix_new(char *, int, struct aproc *);
        !           216: struct aproc *sub_new(char *, int, struct aproc *);
1.13      ratchov   217: struct aproc *resamp_new(char *, unsigned, unsigned);
1.9       ratchov   218: struct aproc *cmap_new(char *, struct aparams *, struct aparams *);
1.11      ratchov   219: struct aproc *enc_new(char *, struct aparams *);
                    220: struct aproc *dec_new(char *, struct aparams *);
1.5       ratchov   221:
                    222: void mix_setmaster(struct aproc *);
1.12      ratchov   223: void mix_clear(struct aproc *);
1.29      ratchov   224: void mix_prime(struct aproc *);
1.12      ratchov   225: void sub_clear(struct aproc *);
1.1       ratchov   226:
1.11      ratchov   227: #endif /* !defined(APROC_H) */