(linenum→info "unix/slp.c:2238")

qemu/0.9.1/audio/audio_int.h

    1: /*
    2:  * QEMU Audio subsystem header
    3:  *
    4:  * Copyright (c) 2003-2005 Vassili Karpov (malc)
    5:  *
    6:  * Permission is hereby granted, free of charge, to any person obtaining a copy
    7:  * of this software and associated documentation files (the "Software"), to deal
    8:  * in the Software without restriction, including without limitation the rights
    9:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   10:  * copies of the Software, and to permit persons to whom the Software is
   11:  * furnished to do so, subject to the following conditions:
   12:  *
   13:  * The above copyright notice and this permission notice shall be included in
   14:  * all copies or substantial portions of the Software.
   15:  *
   16:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   17:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
   19:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   20:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   21:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   22:  * THE SOFTWARE.
   23:  */
   24: #ifndef QEMU_AUDIO_INT_H
   25: #define QEMU_AUDIO_INT_H
   26: 
   27: #ifdef CONFIG_COREAUDIO
   28: #define FLOAT_MIXENG
   29: /* #define RECIPROCAL */
   30: #endif
   31: #include "mixeng.h"
   32: 
   33: struct audio_pcm_ops;
   34: 
   35: typedef enum {
   36:     AUD_OPT_INT,
   37:     AUD_OPT_FMT,
   38:     AUD_OPT_STR,
   39:     AUD_OPT_BOOL
   40: } audio_option_tag_e;
   41: 
   42: struct audio_option {
   43:     const char *name;
   44:     audio_option_tag_e tag;
   45:     void *valp;
   46:     const char *descr;
   47:     int *overriddenp;
   48:     int overridden;
   49: };
   50: 
   51: struct audio_callback {
   52:     void *opaque;
   53:     audio_callback_fn_t fn;
   54: };
   55: 
   56: struct audio_pcm_info {
   57:     int bits;
   58:     int sign;
   59:     int freq;
   60:     int nchannels;
   61:     int align;
   62:     int shift;
   63:     int bytes_per_second;
   64:     int swap_endianness;
   65: };
   66: 
   67: typedef struct SWVoiceCap SWVoiceCap;
   68: 
   69: typedef struct HWVoiceOut {
   70:     int enabled;
   71:     int pending_disable;
   72:     struct audio_pcm_info info;
   73: 
   74:     f_sample *clip;
   75: 
   76:     int rpos;
   77:     uint64_t ts_helper;
   78: 
   79:     st_sample_t *mix_buf;
   80: 
   81:     int samples;
   82:     LIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
   83:     LIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
   84:     struct audio_pcm_ops *pcm_ops;
   85:     LIST_ENTRY (HWVoiceOut) entries;
   86: } HWVoiceOut;
   87: 
   88: typedef struct HWVoiceIn {
   89:     int enabled;
   90:     struct audio_pcm_info info;
   91: 
   92:     t_sample *conv;
   93: 
   94:     int wpos;
   95:     int total_samples_captured;
   96:     uint64_t ts_helper;
   97: 
   98:     st_sample_t *conv_buf;
   99: 
  100:     int samples;
  101:     LIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
  102:     struct audio_pcm_ops *pcm_ops;
  103:     LIST_ENTRY (HWVoiceIn) entries;
  104: } HWVoiceIn;
  105: 
  106: struct SWVoiceOut {
  107:     struct audio_pcm_info info;
  108:     t_sample *conv;
  109:     int64_t ratio;
  110:     st_sample_t *buf;
  111:     void *rate;
  112:     int total_hw_samples_mixed;
  113:     int active;
  114:     int empty;
  115:     HWVoiceOut *hw;
  116:     char *name;
  117:     volume_t vol;
  118:     struct audio_callback callback;
  119:     LIST_ENTRY (SWVoiceOut) entries;
  120: };
  121: 
  122: struct SWVoiceIn {
  123:     int active;
  124:     struct audio_pcm_info info;
  125:     int64_t ratio;
  126:     void *rate;
  127:     int total_hw_samples_acquired;
  128:     st_sample_t *buf;
  129:     f_sample *clip;
  130:     HWVoiceIn *hw;
  131:     char *name;
  132:     volume_t vol;
  133:     struct audio_callback callback;
  134:     LIST_ENTRY (SWVoiceIn) entries;
  135: };
  136: 
  137: struct audio_driver {
  138:     const char *name;
  139:     const char *descr;
  140:     struct audio_option *options;
  141:     void *(*init) (void);
  142:     void (*fini) (void *);
  143:     struct audio_pcm_ops *pcm_ops;
  144:     int can_be_default;
  145:     int max_voices_out;
  146:     int max_voices_in;
  147:     int voice_size_out;
  148:     int voice_size_in;
  149: };
  150: 
  151: struct audio_pcm_ops {
  152:     int  (*init_out)(HWVoiceOut *hw, audsettings_t *as);
  153:     void (*fini_out)(HWVoiceOut *hw);
  154:     int  (*run_out) (HWVoiceOut *hw);
  155:     int  (*write)   (SWVoiceOut *sw, void *buf, int size);
  156:     int  (*ctl_out) (HWVoiceOut *hw, int cmd, ...);
  157: 
  158:     int  (*init_in) (HWVoiceIn *hw, audsettings_t *as);
  159:     void (*fini_in) (HWVoiceIn *hw);
  160:     int  (*run_in)  (HWVoiceIn *hw);
  161:     int  (*read)    (SWVoiceIn *sw, void *buf, int size);
  162:     int  (*ctl_in)  (HWVoiceIn *hw, int cmd, ...);
  163: };
  164: 
  165: struct capture_callback {
  166:     struct audio_capture_ops ops;
  167:     void *opaque;
  168:     LIST_ENTRY (capture_callback) entries;
  169: };
  170: 
  171: struct CaptureVoiceOut {
  172:     HWVoiceOut hw;
  173:     void *buf;
  174:     LIST_HEAD (cb_listhead, capture_callback) cb_head;
  175:     LIST_ENTRY (CaptureVoiceOut) entries;
  176: };
  177: 
  178: struct SWVoiceCap {
  179:     SWVoiceOut sw;
  180:     CaptureVoiceOut *cap;
  181:     LIST_ENTRY (SWVoiceCap) entries;
  182: };
  183: 
  184: struct AudioState {
  185:     struct audio_driver *drv;
  186:     void *drv_opaque;
  187: 
  188:     QEMUTimer *ts;
  189:     LIST_HEAD (card_listhead, QEMUSoundCard) card_head;
  190:     LIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
  191:     LIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
  192:     LIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
  193:     int nb_hw_voices_out;
  194:     int nb_hw_voices_in;
  195: };
  196: 
  197: extern struct audio_driver no_audio_driver;
  198: extern struct audio_driver oss_audio_driver;
  199: extern struct audio_driver sdl_audio_driver;
  200: extern struct audio_driver wav_audio_driver;
  201: extern struct audio_driver fmod_audio_driver;
  202: extern struct audio_driver alsa_audio_driver;
  203: extern struct audio_driver coreaudio_audio_driver;
  204: extern struct audio_driver dsound_audio_driver;
  205: extern volume_t nominal_volume;
  206: 
  207: void audio_pcm_init_info (struct audio_pcm_info *info, audsettings_t *as);
  208: void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
  209: 
  210: int  audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int len);
  211: int  audio_pcm_hw_get_live_in (HWVoiceIn *hw);
  212: 
  213: int  audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int len);
  214: int  audio_pcm_hw_get_live_out (HWVoiceOut *hw);
  215: int  audio_pcm_hw_get_live_out2 (HWVoiceOut *hw, int *nb_live);
  216: 
  217: int audio_bug (const char *funcname, int cond);
  218: void *audio_calloc (const char *funcname, int nmemb, size_t size);
  219: 
  220: #define VOICE_ENABLE 1
  221: #define VOICE_DISABLE 2
  222: 
  223: static inline int audio_ring_dist (int dst, int src, int len)
  224: {
  225:     return (dst >= src) ? (dst - src) : (len - src + dst);
  226: }
  227: 
  228: #if defined __GNUC__
  229: #define GCC_ATTR __attribute__ ((__unused__, __format__ (__printf__, 1, 2)))
  230: #define INIT_FIELD(f) . f
  231: #define GCC_FMT_ATTR(n, m) __attribute__ ((__format__ (__printf__, n, m)))
  232: #else
  233: #define GCC_ATTR /**/
  234: #define INIT_FIELD(f) /**/
  235: #define GCC_FMT_ATTR(n, m)
  236: #endif
  237: 
  238: static void GCC_ATTR dolog (const char *fmt, ...)
  239: {
  240:     va_list ap;
  241: 
  242:     va_start (ap, fmt);
  243:     AUD_vlog (AUDIO_CAP, fmt, ap);
  244:     va_end (ap);
  245: }
  246: 
  247: #ifdef DEBUG
  248: static void GCC_ATTR ldebug (const char *fmt, ...)
  249: {
  250:     va_list ap;
  251: 
  252:     va_start (ap, fmt);
  253:     AUD_vlog (AUDIO_CAP, fmt, ap);
  254:     va_end (ap);
  255: }
  256: #else
  257: #if defined NDEBUG && defined __GNUC__
  258: #define ldebug(...)
  259: #elif defined NDEBUG && defined _MSC_VER
  260: #define ldebug __noop
  261: #else
  262: static void GCC_ATTR ldebug (const char *fmt, ...)
  263: {
  264:     (void) fmt;
  265: }
  266: #endif
  267: #endif
  268: 
  269: #undef GCC_ATTR
  270: 
  271: #define AUDIO_STRINGIFY_(n) #n
  272: #define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
  273: 
  274: #if defined _MSC_VER || defined __GNUC__
  275: #define AUDIO_FUNC __FUNCTION__
  276: #else
  277: #define AUDIO_FUNC __FILE__ ":" AUDIO_STRINGIFY (__LINE__)
  278: #endif
  279: 
  280: #endif /* audio_int.h */
Syntax (Markdown)