cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

audio_int.h (8342B)


      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
     25#ifndef QEMU_AUDIO_INT_H
     26#define QEMU_AUDIO_INT_H
     27
     28#ifdef CONFIG_AUDIO_COREAUDIO
     29#define FLOAT_MIXENG
     30/* #define RECIPROCAL */
     31#endif
     32#include "mixeng.h"
     33
     34struct audio_pcm_ops;
     35
     36struct audio_callback {
     37    void *opaque;
     38    audio_callback_fn fn;
     39};
     40
     41struct audio_pcm_info {
     42    int bits;
     43    bool is_signed;
     44    bool is_float;
     45    int freq;
     46    int nchannels;
     47    int bytes_per_frame;
     48    int bytes_per_second;
     49    int swap_endianness;
     50};
     51
     52typedef struct AudioState AudioState;
     53typedef struct SWVoiceCap SWVoiceCap;
     54
     55typedef struct STSampleBuffer {
     56    size_t pos, size;
     57    st_sample samples[];
     58} STSampleBuffer;
     59
     60typedef struct HWVoiceOut {
     61    AudioState *s;
     62    int enabled;
     63    int poll_mode;
     64    int pending_disable;
     65    struct audio_pcm_info info;
     66
     67    f_sample *clip;
     68    uint64_t ts_helper;
     69
     70    STSampleBuffer *mix_buf;
     71    void *buf_emul;
     72    size_t pos_emul, pending_emul, size_emul;
     73
     74    size_t samples;
     75    QLIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
     76    QLIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
     77    struct audio_pcm_ops *pcm_ops;
     78    QLIST_ENTRY (HWVoiceOut) entries;
     79} HWVoiceOut;
     80
     81typedef struct HWVoiceIn {
     82    AudioState *s;
     83    int enabled;
     84    int poll_mode;
     85    struct audio_pcm_info info;
     86
     87    t_sample *conv;
     88
     89    size_t total_samples_captured;
     90    uint64_t ts_helper;
     91
     92    STSampleBuffer *conv_buf;
     93    void *buf_emul;
     94    size_t pos_emul, pending_emul, size_emul;
     95
     96    size_t samples;
     97    QLIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
     98    struct audio_pcm_ops *pcm_ops;
     99    QLIST_ENTRY (HWVoiceIn) entries;
    100} HWVoiceIn;
    101
    102struct SWVoiceOut {
    103    QEMUSoundCard *card;
    104    AudioState *s;
    105    struct audio_pcm_info info;
    106    t_sample *conv;
    107    int64_t ratio;
    108    struct st_sample *buf;
    109    void *rate;
    110    size_t total_hw_samples_mixed;
    111    int active;
    112    int empty;
    113    HWVoiceOut *hw;
    114    char *name;
    115    struct mixeng_volume vol;
    116    struct audio_callback callback;
    117    QLIST_ENTRY (SWVoiceOut) entries;
    118};
    119
    120struct SWVoiceIn {
    121    QEMUSoundCard *card;
    122    AudioState *s;
    123    int active;
    124    struct audio_pcm_info info;
    125    int64_t ratio;
    126    void *rate;
    127    size_t total_hw_samples_acquired;
    128    struct st_sample *buf;
    129    f_sample *clip;
    130    HWVoiceIn *hw;
    131    char *name;
    132    struct mixeng_volume vol;
    133    struct audio_callback callback;
    134    QLIST_ENTRY (SWVoiceIn) entries;
    135};
    136
    137typedef struct audio_driver audio_driver;
    138struct audio_driver {
    139    const char *name;
    140    const char *descr;
    141    void *(*init) (Audiodev *);
    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    QLIST_ENTRY(audio_driver) next;
    150};
    151
    152struct audio_pcm_ops {
    153    int    (*init_out)(HWVoiceOut *hw, audsettings *as, void *drv_opaque);
    154    void   (*fini_out)(HWVoiceOut *hw);
    155    size_t (*write)   (HWVoiceOut *hw, void *buf, size_t size);
    156    void   (*run_buffer_out)(HWVoiceOut *hw);
    157    /*
    158     * get a buffer that after later can be passed to put_buffer_out; optional
    159     * returns the buffer, and writes it's size to size (in bytes)
    160     * this is unrelated to the above buffer_size_out function
    161     */
    162    void  *(*get_buffer_out)(HWVoiceOut *hw, size_t *size);
    163    /*
    164     * put back the buffer returned by get_buffer_out; optional
    165     * buf must be equal the pointer returned by get_buffer_out,
    166     * size may be smaller
    167     */
    168    size_t (*put_buffer_out)(HWVoiceOut *hw, void *buf, size_t size);
    169    void   (*enable_out)(HWVoiceOut *hw, bool enable);
    170    void   (*volume_out)(HWVoiceOut *hw, Volume *vol);
    171
    172    int    (*init_in) (HWVoiceIn *hw, audsettings *as, void *drv_opaque);
    173    void   (*fini_in) (HWVoiceIn *hw);
    174    size_t (*read)    (HWVoiceIn *hw, void *buf, size_t size);
    175    void   (*run_buffer_in)(HWVoiceIn *hw);
    176    void  *(*get_buffer_in)(HWVoiceIn *hw, size_t *size);
    177    void   (*put_buffer_in)(HWVoiceIn *hw, void *buf, size_t size);
    178    void   (*enable_in)(HWVoiceIn *hw, bool enable);
    179    void   (*volume_in)(HWVoiceIn *hw, Volume *vol);
    180};
    181
    182void audio_generic_run_buffer_in(HWVoiceIn *hw);
    183void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t *size);
    184void audio_generic_put_buffer_in(HWVoiceIn *hw, void *buf, size_t size);
    185void audio_generic_run_buffer_out(HWVoiceOut *hw);
    186void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size);
    187size_t audio_generic_put_buffer_out(HWVoiceOut *hw, void *buf, size_t size);
    188size_t audio_generic_write(HWVoiceOut *hw, void *buf, size_t size);
    189size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size);
    190
    191struct capture_callback {
    192    struct audio_capture_ops ops;
    193    void *opaque;
    194    QLIST_ENTRY (capture_callback) entries;
    195};
    196
    197struct CaptureVoiceOut {
    198    HWVoiceOut hw;
    199    void *buf;
    200    QLIST_HEAD (cb_listhead, capture_callback) cb_head;
    201    QLIST_ENTRY (CaptureVoiceOut) entries;
    202};
    203
    204struct SWVoiceCap {
    205    SWVoiceOut sw;
    206    CaptureVoiceOut *cap;
    207    QLIST_ENTRY (SWVoiceCap) entries;
    208};
    209
    210typedef struct AudioState {
    211    struct audio_driver *drv;
    212    Audiodev *dev;
    213    void *drv_opaque;
    214
    215    QEMUTimer *ts;
    216    QLIST_HEAD (card_listhead, QEMUSoundCard) card_head;
    217    QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
    218    QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
    219    QLIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
    220    int nb_hw_voices_out;
    221    int nb_hw_voices_in;
    222    int vm_running;
    223    int64_t period_ticks;
    224
    225    bool timer_running;
    226    uint64_t timer_last;
    227
    228    QTAILQ_ENTRY(AudioState) list;
    229} AudioState;
    230
    231extern const struct mixeng_volume nominal_volume;
    232
    233extern const char *audio_prio_list[];
    234
    235void audio_driver_register(audio_driver *drv);
    236audio_driver *audio_driver_lookup(const char *name);
    237
    238void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
    239void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
    240
    241int audio_bug (const char *funcname, int cond);
    242void *audio_calloc (const char *funcname, int nmemb, size_t size);
    243
    244void audio_run(AudioState *s, const char *msg);
    245
    246const char *audio_application_name(void);
    247
    248typedef struct RateCtl {
    249    int64_t start_ticks;
    250    int64_t bytes_sent;
    251} RateCtl;
    252
    253void audio_rate_start(RateCtl *rate);
    254size_t audio_rate_get_bytes(struct audio_pcm_info *info, RateCtl *rate,
    255                            size_t bytes_avail);
    256
    257static inline size_t audio_ring_dist(size_t dst, size_t src, size_t len)
    258{
    259    return (dst >= src) ? (dst - src) : (len - src + dst);
    260}
    261
    262#define dolog(fmt, ...) AUD_log(AUDIO_CAP, fmt, ## __VA_ARGS__)
    263
    264#ifdef DEBUG
    265#define ldebug(fmt, ...) AUD_log(AUDIO_CAP, fmt, ## __VA_ARGS__)
    266#else
    267#define ldebug(fmt, ...) (void)0
    268#endif
    269
    270#define AUDIO_STRINGIFY_(n) #n
    271#define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
    272
    273typedef struct AudiodevListEntry {
    274    Audiodev *dev;
    275    QSIMPLEQ_ENTRY(AudiodevListEntry) next;
    276} AudiodevListEntry;
    277
    278typedef QSIMPLEQ_HEAD(, AudiodevListEntry) AudiodevListHead;
    279AudiodevListHead audio_handle_legacy_opts(void);
    280
    281void audio_free_audiodev_list(AudiodevListHead *head);
    282
    283void audio_create_pdos(Audiodev *dev);
    284AudiodevPerDirectionOptions *audio_get_pdo_in(Audiodev *dev);
    285AudiodevPerDirectionOptions *audio_get_pdo_out(Audiodev *dev);
    286
    287#endif /* QEMU_AUDIO_INT_H */