Annotation of qemu/audio/noaudio.c, revision 1.1.1.8

1.1       root        1: /*
1.1.1.2   root        2:  * QEMU Timer based audio emulation
                      3:  *
                      4:  * Copyright (c) 2004-2005 Vassili Karpov (malc)
                      5:  *
1.1       root        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:  */
1.1.1.4   root       24: #include "qemu-common.h"
                     25: #include "audio.h"
                     26: #include "qemu-timer.h"
1.1       root       27: 
1.1.1.2   root       28: #define AUDIO_CAP "noaudio"
                     29: #include "audio_int.h"
                     30: 
                     31: typedef struct NoVoiceOut {
                     32:     HWVoiceOut hw;
                     33:     int64_t old_ticks;
                     34: } NoVoiceOut;
1.1       root       35: 
1.1.1.2   root       36: typedef struct NoVoiceIn {
                     37:     HWVoiceIn hw;
1.1       root       38:     int64_t old_ticks;
1.1.1.2   root       39: } NoVoiceIn;
1.1       root       40: 
1.1.1.6   root       41: static int no_run_out (HWVoiceOut *hw, int live)
1.1.1.2   root       42: {
                     43:     NoVoiceOut *no = (NoVoiceOut *) hw;
1.1.1.6   root       44:     int decr, samples;
1.1.1.3   root       45:     int64_t now;
                     46:     int64_t ticks;
                     47:     int64_t bytes;
1.1       root       48: 
1.1.1.8 ! root       49:     now = qemu_get_clock_ns (vm_clock);
1.1.1.3   root       50:     ticks = now - no->old_ticks;
1.1.1.6   root       51:     bytes = muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
1.1.1.3   root       52:     bytes = audio_MIN (bytes, INT_MAX);
                     53:     samples = bytes >> hw->info.shift;
                     54: 
1.1       root       55:     no->old_ticks = now;
                     56:     decr = audio_MIN (live, samples);
1.1.1.2   root       57:     hw->rpos = (hw->rpos + decr) % hw->samples;
                     58:     return decr;
                     59: }
1.1       root       60: 
1.1.1.2   root       61: static int no_write (SWVoiceOut *sw, void *buf, int len)
                     62: {
                     63:     return audio_pcm_sw_write (sw, buf, len);
                     64: }
1.1       root       65: 
1.1.1.5   root       66: static int no_init_out (HWVoiceOut *hw, struct audsettings *as)
1.1.1.2   root       67: {
1.1.1.3   root       68:     audio_pcm_init_info (&hw->info, as);
1.1.1.2   root       69:     hw->samples = 1024;
                     70:     return 0;
                     71: }
1.1       root       72: 
1.1.1.2   root       73: static void no_fini_out (HWVoiceOut *hw)
                     74: {
                     75:     (void) hw;
1.1       root       76: }
                     77: 
1.1.1.2   root       78: static int no_ctl_out (HWVoiceOut *hw, int cmd, ...)
1.1       root       79: {
1.1.1.2   root       80:     (void) hw;
                     81:     (void) cmd;
                     82:     return 0;
1.1       root       83: }
                     84: 
1.1.1.5   root       85: static int no_init_in (HWVoiceIn *hw, struct audsettings *as)
1.1       root       86: {
1.1.1.3   root       87:     audio_pcm_init_info (&hw->info, as);
1.1.1.2   root       88:     hw->samples = 1024;
1.1       root       89:     return 0;
                     90: }
                     91: 
1.1.1.2   root       92: static void no_fini_in (HWVoiceIn *hw)
1.1       root       93: {
                     94:     (void) hw;
                     95: }
                     96: 
1.1.1.2   root       97: static int no_run_in (HWVoiceIn *hw)
                     98: {
                     99:     NoVoiceIn *no = (NoVoiceIn *) hw;
                    100:     int live = audio_pcm_hw_get_live_in (hw);
                    101:     int dead = hw->samples - live;
1.1.1.3   root      102:     int samples = 0;
1.1.1.2   root      103: 
1.1.1.3   root      104:     if (dead) {
1.1.1.8 ! root      105:         int64_t now = qemu_get_clock_ns (vm_clock);
1.1.1.3   root      106:         int64_t ticks = now - no->old_ticks;
1.1.1.6   root      107:         int64_t bytes =
                    108:             muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
1.1.1.2   root      109: 
1.1.1.3   root      110:         no->old_ticks = now;
                    111:         bytes = audio_MIN (bytes, INT_MAX);
                    112:         samples = bytes >> hw->info.shift;
                    113:         samples = audio_MIN (samples, dead);
                    114:     }
1.1.1.2   root      115:     return samples;
                    116: }
                    117: 
                    118: static int no_read (SWVoiceIn *sw, void *buf, int size)
                    119: {
1.1.1.7   root      120:     /* use custom code here instead of audio_pcm_sw_read() to avoid
                    121:      * useless resampling/mixing */
1.1.1.2   root      122:     int samples = size >> sw->info.shift;
                    123:     int total = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
                    124:     int to_clear = audio_MIN (samples, total);
1.1.1.7   root      125:     sw->total_hw_samples_acquired += total;
1.1.1.2   root      126:     audio_pcm_info_clear_buf (&sw->info, buf, to_clear);
1.1.1.7   root      127:     return to_clear << sw->info.shift;
1.1.1.2   root      128: }
                    129: 
                    130: static int no_ctl_in (HWVoiceIn *hw, int cmd, ...)
1.1       root      131: {
                    132:     (void) hw;
                    133:     (void) cmd;
                    134:     return 0;
                    135: }
                    136: 
                    137: static void *no_audio_init (void)
                    138: {
                    139:     return &no_audio_init;
                    140: }
                    141: 
                    142: static void no_audio_fini (void *opaque)
                    143: {
1.1.1.2   root      144:     (void) opaque;
1.1       root      145: }
                    146: 
1.1.1.2   root      147: static struct audio_pcm_ops no_pcm_ops = {
1.1.1.6   root      148:     .init_out = no_init_out,
                    149:     .fini_out = no_fini_out,
                    150:     .run_out  = no_run_out,
                    151:     .write    = no_write,
                    152:     .ctl_out  = no_ctl_out,
                    153: 
                    154:     .init_in  = no_init_in,
                    155:     .fini_in  = no_fini_in,
                    156:     .run_in   = no_run_in,
                    157:     .read     = no_read,
                    158:     .ctl_in   = no_ctl_in
1.1       root      159: };
                    160: 
1.1.1.2   root      161: struct audio_driver no_audio_driver = {
1.1.1.6   root      162:     .name           = "none",
                    163:     .descr          = "Timer based audio emulation",
                    164:     .options        = NULL,
                    165:     .init           = no_audio_init,
                    166:     .fini           = no_audio_fini,
                    167:     .pcm_ops        = &no_pcm_ops,
                    168:     .can_be_default = 1,
                    169:     .max_voices_out = INT_MAX,
                    170:     .max_voices_in  = INT_MAX,
                    171:     .voice_size_out = sizeof (NoVoiceOut),
                    172:     .voice_size_in  = sizeof (NoVoiceIn)
1.1       root      173: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.