[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.5

1.5     ! ratchov     1: /*     $OpenBSD: aproc.h,v 1.4 2008/08/14 09:47:51 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"
                     23:
                     24: struct abuf;
                     25: struct aproc;
                     26: struct file;
                     27:
                     28: struct aproc_ops {
                     29:        /*
                     30:         * Name of the ops structure, ie type of the unit.
                     31:         */
                     32:        char *name;
                     33:
                     34:        /*
                     35:         * The state of the given input abuf changed (eg. an input block
                     36:         * is ready for processing). This function must get the block
                     37:         * from the input, process it and remove it from the buffer.
                     38:         *
                     39:         * Processing the block will result in a change of the state of
                     40:         * OTHER buffers that are attached to the aproc (eg. the output
                     41:         * buffer was filled), thus this routine MUST notify ALL aproc
                     42:         * structures that are waiting on it; most of the time this
                     43:         * means just calling abuf_flush() on the output buffer.
                     44:         */
                     45:        int (*in)(struct aproc *, struct abuf *);
                     46:
                     47:        /*
                     48:         * The state of the given output abuf changed (eg. space for a
                     49:         * new output block was made available) so processing can
                     50:         * continue.  This function must process more input in order to
                     51:         * fill the output block.
                     52:         *
                     53:         * Producing a block will result in the change of the state of
                     54:         * OTHER buffers that are attached to the aproc, thus this
                     55:         * routine MUST notify ALL aproc structures that are waiting on
                     56:         * it; most of the time this means calling abuf_fill() on the
                     57:         * source buffers.
                     58:         *
                     59:         * Before filling input buffers (using abuf_fill()), this
                     60:         * routine must ALWAYS check for eof condition, and if needed,
                     61:         * handle it appropriately and call abuf_hup() to free the input
                     62:         * buffer.
                     63:         */
                     64:        int (*out)(struct aproc *, struct abuf *);
                     65:
                     66:        /*
                     67:         * The input buffer is empty and we can no more receive data
                     68:         * from it. The buffer will be destroyed as soon as this call
                     69:         * returns so the abuf pointer will stop being valid after this
                     70:         * call returns. There's no need to drain the buffer because the
                     71:         * in() call-back was just called before.
                     72:         *
                     73:         * If this call reads and/or writes data on other buffers,
                     74:         * abuf_flush() and abuf_fill() must be called appropriately.
                     75:         */
                     76:        void (*eof)(struct aproc *, struct abuf *);
                     77:
                     78:        /*
                     79:         * The output buffer can no more accept data (it should be
                     80:         * considered as full). After this function returns, it will be
                     81:         * destroyed and the "abuf" pointer will be no more valid.
                     82:         */
                     83:        void (*hup)(struct aproc *, struct abuf *);
                     84:
                     85:        /*
                     86:         * A new input was connected.
                     87:         */
                     88:        void (*newin)(struct aproc *, struct abuf *);
                     89:
                     90:        /*
                     91:         * A new output was connected
                     92:         */
                     93:        void (*newout)(struct aproc *, struct abuf *);
1.3       ratchov    94:
                     95:        /*
                     96:         * destroy the aproc, called just before to free the
                     97:         * aproc structure
                     98:         */
                     99:        void (*done)(struct aproc *);
1.1       ratchov   100: };
                    101:
                    102: struct aconv {
                    103:        /*
                    104:         * Format of the buffer. This part is used by conversion code.
                    105:         */
                    106:
                    107:        int bfirst;             /* bytes to skip at startup */
                    108:        unsigned rate;          /* frames per second */
                    109:        unsigned pos;           /* current position in the stream */
                    110:        unsigned nch;           /* number of channels: nch = cmax - cmin + 1 */
                    111:        unsigned bps;           /* bytes per sample (padding included) */
                    112:        unsigned shift;         /* shift to get 32bit MSB-justified int */
                    113:        int sigbit;             /* sign bits to XOR to unsigned samples */
                    114:        int bnext;              /* bytes to skip to reach the next byte */
                    115:        int snext;              /* bytes to skip to reach the next sample */
                    116:        unsigned cmin;          /* provided/consumed channels */
                    117:        unsigned bpf;           /* bytes per frame: bpf = nch * bps */
                    118:        int ctx[CHAN_MAX];      /* current frame (for resampling) */
                    119: };
                    120:
                    121: /*
                    122:  * The aproc structure represents a simple audio processing unit; they are
                    123:  * interconnected by abuf structures and form a kind of "circuit". The circuit
                    124:  * cannot have loops.
                    125:  */
                    126: struct aproc {
                    127:        char *name;                             /* for debug purposes */
                    128:        struct aproc_ops *ops;                  /* call-backs */
                    129:        LIST_HEAD(, abuf) ibuflist;             /* list of inputs */
                    130:        LIST_HEAD(, abuf) obuflist;             /* list of outputs */
                    131:        union {                                 /* follow type-specific data */
                    132:                struct {                        /* file/device io */
                    133:                        struct file *file;      /* file to read/write */
                    134:                } io;
                    135:                struct {
                    136:                        struct aconv ist, ost;
                    137:                } conv;
1.2       ratchov   138:                struct {
1.4       ratchov   139: #define MIX_DROP       1
                    140: #define MIX_AUTOQUIT   2
1.2       ratchov   141:                        unsigned flags;
                    142:                } mix;
                    143:                struct {
1.4       ratchov   144: #define SUB_DROP       1
                    145: #define SUB_AUTOQUIT   2
1.2       ratchov   146:                        unsigned flags;
                    147:                } sub;
1.1       ratchov   148:        } u;
                    149: };
                    150:
1.3       ratchov   151: struct aproc *aproc_new(struct aproc_ops *, char *);
1.1       ratchov   152: void aproc_del(struct aproc *);
                    153: void aproc_setin(struct aproc *, struct abuf *);
                    154: void aproc_setout(struct aproc *, struct abuf *);
                    155:
                    156: struct aproc *rpipe_new(struct file *);
1.3       ratchov   157: int rpipe_in(struct aproc *, struct abuf *);
                    158: int rpipe_out(struct aproc *, struct abuf *);
                    159: void rpipe_done(struct aproc *);
                    160: void rpipe_eof(struct aproc *, struct abuf *);
                    161: void rpipe_hup(struct aproc *, struct abuf *);
                    162:
1.1       ratchov   163: struct aproc *wpipe_new(struct file *);
1.3       ratchov   164: void wpipe_done(struct aproc *);
                    165: int wpipe_in(struct aproc *, struct abuf *);
                    166: int wpipe_out(struct aproc *, struct abuf *);
                    167: void wpipe_eof(struct aproc *, struct abuf *);
                    168: void wpipe_hup(struct aproc *, struct abuf *);
                    169:
1.1       ratchov   170: struct aproc *mix_new(void);
                    171: struct aproc *sub_new(void);
                    172: struct aproc *conv_new(char *, struct aparams *, struct aparams *);
1.5     ! ratchov   173:
        !           174: void mix_pushzero(struct aproc *);
        !           175: void mix_setmaster(struct aproc *);
1.1       ratchov   176:
                    177: #endif /* !defined(FIFO_H) */