ekg2

ekg/audio.h

Idź do dokumentacji tego pliku.
00001 /* $Id$ */
00002 
00003 /*
00004  *  (C) Copyright 2003 Wojtek Kaniewski <wojtekka@irc.pl>
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License Version 2 as
00008  *  published by the Free Software Foundation.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with this program; if not, write to the Free Software
00017  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018  */
00019 
00020 #ifndef __EKG_AUDIO_H
00021 #define __EKG_AUDIO_H
00022 
00023 #include "dynstuff.h"
00024 #include "plugins.h"
00025 
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif
00029 
00030 typedef enum { AUDIO_CONTROL_INIT = 0, AUDIO_CONTROL_SET, AUDIO_CONTROL_GET, AUDIO_CONTROL_DEINIT, AUDIO_CONTROL_HELP }
00031                         audio_control_t;
00032 typedef enum { AUDIO_READ = 0, AUDIO_WRITE, AUDIO_RDWR, } 
00033                         audio_way_t;
00034 typedef enum { CODEC_CODE = 0, CODEC_DECODE, } 
00035                         codec_way_t;
00036 
00037 #define WATCHER_AUDIO(x) int x(int type, int fd, string_t buf, void *data)
00038 typedef WATCHER_AUDIO(audio_handler_func_t);
00039 
00040 #define __AINIT(a, way, args...) a ? a->control_handler(AUDIO_CONTROL_SET, way, NULL, args, NULL) : NULL
00041 #define __CINIT(c, args...) c ? c->control_handler(AUDIO_CONTROL_SET, AUDIO_RDWR, NULL, args, NULL) : NULL
00042 
00043 #define __AINIT_F(name, way, args...) __AINIT((audio_find(name)), way, args)
00044 #define __CINIT_F(name, args...) __CINIT((codec_find(name)), args)
00045 
00046 
00047 #define CODEC_RECODE(x) int x(int type, string_t input, string_t output, void *data)
00048 #define AUDIO_CONTROL(x) audio_io_t     *x(audio_control_t type, audio_way_t way, audio_io_t *aio, ...)
00049 #define CODEC_CONTROL(x) audio_codec_t  *x(audio_control_t type, audio_way_t way, audio_codec_t *aco, ...)
00050 
00051 #define AUDIO_DEFINE(x)\
00052         extern AUDIO_CONTROL(x##_audio_control);\
00053         extern WATCHER_AUDIO(x##_audio_read);           \
00054         extern WATCHER_AUDIO(x##_audio_write);  \
00055         audio_t x##_audio = { \
00056                 .name = #x, \
00057                 .control_handler= (void*) x##_audio_control, \
00058                 .read_handler   = x##_audio_read, \
00059                 .write_handler  = x##_audio_write, \
00060         }
00061 
00062 #define CODEC_DEFINE(x)\
00063         extern CODEC_CONTROL(x##_codec_control);\
00064         extern CODEC_RECODE(x##_codec_code);    \
00065         extern CODEC_RECODE(x##_codec_decode);  \
00066         codec_t x##_codec = { \
00067                 .name = #x, \
00068                 .control_handler= (void*) x##_codec_control,    \
00069                 .code_handler   = x##_codec_code,       \
00070                 .decode_handler = x##_codec_decode,     \
00071         }
00072 
00073 typedef struct audio {
00074         struct audio *next;
00075 
00076         char *name;     /* nazwa urzadzenia */
00077         
00078         void *(*control_handler)(audio_control_t, audio_way_t, void *, ...);    /* initing / checking if audio_io_t is correct / deiniting */
00079         audio_handler_func_t *read_handler;
00080         audio_handler_func_t *write_handler;
00081 
00082         void *priv_data;
00083 } audio_t;
00084 
00085 typedef struct {
00086         audio_t *a;
00087         int fd;
00088         unsigned int outb;              /* how many bytes go through handler */
00089         string_t buffer;
00090         void *priv_data;
00091 } audio_io_t;
00092 
00093 typedef struct codec {
00094         struct codec *next;
00095 
00096         char *name;     /* nazwa codeca */
00097 
00098         void *(*control_handler)(audio_control_t, audio_way_t, void *, ...);    /* initing / checking if audio_codec_t is correct / deiniting */
00099 
00100                 /* IN: int type, string_t input, string_t output, void *priv_data 
00101                  * OUT: how many bytes he code/decode */
00102         int (*code_handler)(int, string_t, string_t, void *);
00103         int (*decode_handler)(int, string_t, string_t, void *);
00104         void *priv_data;
00105 } codec_t;
00106 
00107 typedef struct {
00108         codec_t *c;                     /* codec_t * */
00109         codec_way_t way;                /* CODEC_CODE CODEC_DECODE */
00110         
00111         void *priv_data;
00112 } audio_codec_t;
00113 
00114 typedef struct stream {
00115         struct stream *next;
00116 
00117         char *stream_name;
00118         audio_io_t      *input;
00119         audio_codec_t   *codec;
00120         audio_io_t      *output;
00121 
00122         void *priv_data;
00123 } stream_t;
00124 
00125 int stream_create(char *name, audio_io_t *in, audio_codec_t *co, audio_io_t *out);
00126 
00127 int audio_register(audio_t *audio);
00128 audio_t *audio_find(const char *name);
00129 void audio_unregister(audio_t *audio);
00130 
00131 int codec_register(codec_t *codec);
00132 codec_t *codec_find(const char *name);
00133 void codec_unregister(codec_t *codec);
00134 
00135 int audio_initialize();
00136 int audio_deinitialize();
00137 
00138 #ifdef __cplusplus
00139 }
00140 #endif
00141 
00142 #endif /* __EKG_AUDIO_H */
00143 
00144 
00145 /*
00146  * Local Variables:
00147  * mode: c
00148  * c-file-style: "k&r"
00149  * c-basic-offset: 8
00150  * indent-tabs-mode: t
00151  * End:
00152  */
 All Struktury Danych Pliki Funkcje Zmienne Definicje typów Wyliczenia Wartości wyliczeń Definicje