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

1.1     ! ratchov     1: /*     $OpenBSD$       */
        !             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 *);
        !            94: };
        !            95:
        !            96: struct aconv {
        !            97:        /*
        !            98:         * Format of the buffer. This part is used by conversion code.
        !            99:         */
        !           100:
        !           101:        int bfirst;             /* bytes to skip at startup */
        !           102:        unsigned rate;          /* frames per second */
        !           103:        unsigned pos;           /* current position in the stream */
        !           104:        unsigned nch;           /* number of channels: nch = cmax - cmin + 1 */
        !           105:        unsigned bps;           /* bytes per sample (padding included) */
        !           106:        unsigned shift;         /* shift to get 32bit MSB-justified int */
        !           107:        int sigbit;             /* sign bits to XOR to unsigned samples */
        !           108:        int bnext;              /* bytes to skip to reach the next byte */
        !           109:        int snext;              /* bytes to skip to reach the next sample */
        !           110:        unsigned cmin;          /* provided/consumed channels */
        !           111:        unsigned bpf;           /* bytes per frame: bpf = nch * bps */
        !           112:        int ctx[CHAN_MAX];      /* current frame (for resampling) */
        !           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 */
        !           125:        union {                                 /* follow type-specific data */
        !           126:                struct {                        /* file/device io */
        !           127:                        struct file *file;      /* file to read/write */
        !           128:                } io;
        !           129:                struct {
        !           130:                        struct aconv ist, ost;
        !           131:                } conv;
        !           132:        } u;
        !           133: };
        !           134:
        !           135: void aproc_del(struct aproc *);
        !           136: void aproc_setin(struct aproc *, struct abuf *);
        !           137: void aproc_setout(struct aproc *, struct abuf *);
        !           138:
        !           139: struct aproc *rpipe_new(struct file *);
        !           140: struct aproc *wpipe_new(struct file *);
        !           141: struct aproc *mix_new(void);
        !           142: struct aproc *sub_new(void);
        !           143: struct aproc *conv_new(char *, struct aparams *, struct aparams *);
        !           144:
        !           145: #endif /* !defined(FIFO_H) */