17372f88dSbellard /*
21d14ffa9Sbellard * QEMU Timer based audio emulation
37372f88dSbellard *
41d14ffa9Sbellard * Copyright (c) 2004-2005 Vassili Karpov (malc)
57372f88dSbellard *
67372f88dSbellard * Permission is hereby granted, free of charge, to any person obtaining a copy
77372f88dSbellard * of this software and associated documentation files (the "Software"), to deal
87372f88dSbellard * in the Software without restriction, including without limitation the rights
97372f88dSbellard * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
107372f88dSbellard * copies of the Software, and to permit persons to whom the Software is
117372f88dSbellard * furnished to do so, subject to the following conditions:
127372f88dSbellard *
137372f88dSbellard * The above copyright notice and this permission notice shall be included in
147372f88dSbellard * all copies or substantial portions of the Software.
157372f88dSbellard *
167372f88dSbellard * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177372f88dSbellard * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
187372f88dSbellard * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
197372f88dSbellard * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
207372f88dSbellard * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
217372f88dSbellard * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
227372f88dSbellard * THE SOFTWARE.
237372f88dSbellard */
240b8fa32fSMarkus Armbruster
256086a565SPeter Maydell #include "qemu/osdep.h"
2687776ab7SPaolo Bonzini #include "qemu/host-utils.h"
270b8fa32fSMarkus Armbruster #include "qemu/module.h"
2887ecb68bSpbrook #include "audio.h"
291de7afc9SPaolo Bonzini #include "qemu/timer.h"
307372f88dSbellard
311d14ffa9Sbellard #define AUDIO_CAP "noaudio"
321d14ffa9Sbellard #include "audio_int.h"
337372f88dSbellard
341d14ffa9Sbellard typedef struct NoVoiceOut {
351d14ffa9Sbellard HWVoiceOut hw;
36857271a2SKővágó, Zoltán RateCtl rate;
371d14ffa9Sbellard } NoVoiceOut;
387372f88dSbellard
391d14ffa9Sbellard typedef struct NoVoiceIn {
401d14ffa9Sbellard HWVoiceIn hw;
41857271a2SKővágó, Zoltán RateCtl rate;
421d14ffa9Sbellard } NoVoiceIn;
437372f88dSbellard
no_write(HWVoiceOut * hw,void * buf,size_t len)44affc691aSKővágó, Zoltán static size_t no_write(HWVoiceOut *hw, void *buf, size_t len)
457372f88dSbellard {
461d14ffa9Sbellard NoVoiceOut *no = (NoVoiceOut *) hw;
47613fe02bSVolker Rümelin return audio_rate_get_bytes(&no->rate, &hw->info, len);
487372f88dSbellard }
497372f88dSbellard
no_init_out(HWVoiceOut * hw,struct audsettings * as,void * drv_opaque)505706db1dSKővágó, Zoltán static int no_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque)
517372f88dSbellard {
52857271a2SKővágó, Zoltán NoVoiceOut *no = (NoVoiceOut *) hw;
53857271a2SKővágó, Zoltán
54d929eba5Sbellard audio_pcm_init_info (&hw->info, as);
55c0fe3827Sbellard hw->samples = 1024;
56857271a2SKővágó, Zoltán audio_rate_start(&no->rate);
577372f88dSbellard return 0;
587372f88dSbellard }
597372f88dSbellard
no_fini_out(HWVoiceOut * hw)601d14ffa9Sbellard static void no_fini_out (HWVoiceOut *hw)
617372f88dSbellard {
627372f88dSbellard (void) hw;
637372f88dSbellard }
647372f88dSbellard
no_enable_out(HWVoiceOut * hw,bool enable)65571a8c52SKővágó, Zoltán static void no_enable_out(HWVoiceOut *hw, bool enable)
661d14ffa9Sbellard {
67857271a2SKővágó, Zoltán NoVoiceOut *no = (NoVoiceOut *) hw;
68857271a2SKővágó, Zoltán
69571a8c52SKővágó, Zoltán if (enable) {
70857271a2SKővágó, Zoltán audio_rate_start(&no->rate);
71857271a2SKővágó, Zoltán }
721d14ffa9Sbellard }
731d14ffa9Sbellard
no_init_in(HWVoiceIn * hw,struct audsettings * as,void * drv_opaque)745706db1dSKővágó, Zoltán static int no_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
751d14ffa9Sbellard {
76857271a2SKővágó, Zoltán NoVoiceIn *no = (NoVoiceIn *) hw;
77857271a2SKővágó, Zoltán
78d929eba5Sbellard audio_pcm_init_info (&hw->info, as);
79c0fe3827Sbellard hw->samples = 1024;
80857271a2SKővágó, Zoltán audio_rate_start(&no->rate);
811d14ffa9Sbellard return 0;
821d14ffa9Sbellard }
831d14ffa9Sbellard
no_fini_in(HWVoiceIn * hw)841d14ffa9Sbellard static void no_fini_in (HWVoiceIn *hw)
851d14ffa9Sbellard {
861d14ffa9Sbellard (void) hw;
871d14ffa9Sbellard }
881d14ffa9Sbellard
no_read(HWVoiceIn * hw,void * buf,size_t size)89affc691aSKővágó, Zoltán static size_t no_read(HWVoiceIn *hw, void *buf, size_t size)
901d14ffa9Sbellard {
911d14ffa9Sbellard NoVoiceIn *no = (NoVoiceIn *) hw;
92613fe02bSVolker Rümelin int64_t bytes = audio_rate_get_bytes(&no->rate, &hw->info, size);
931d14ffa9Sbellard
942b9cce8cSKővágó, Zoltán audio_pcm_info_clear_buf(&hw->info, buf, bytes / hw->info.bytes_per_frame);
95857271a2SKővágó, Zoltán return bytes;
961d14ffa9Sbellard }
971d14ffa9Sbellard
no_enable_in(HWVoiceIn * hw,bool enable)98571a8c52SKővágó, Zoltán static void no_enable_in(HWVoiceIn *hw, bool enable)
997372f88dSbellard {
100857271a2SKővágó, Zoltán NoVoiceIn *no = (NoVoiceIn *) hw;
101857271a2SKővágó, Zoltán
102571a8c52SKővágó, Zoltán if (enable) {
103857271a2SKővágó, Zoltán audio_rate_start(&no->rate);
104857271a2SKővágó, Zoltán }
1057372f88dSbellard }
1067372f88dSbellard
no_audio_init(Audiodev * dev,Error ** errp)107*f6061733SPaolo Bonzini static void *no_audio_init(Audiodev *dev, Error **errp)
1087372f88dSbellard {
1097372f88dSbellard return &no_audio_init;
1107372f88dSbellard }
1117372f88dSbellard
no_audio_fini(void * opaque)1127372f88dSbellard static void no_audio_fini (void *opaque)
1137372f88dSbellard {
1141d14ffa9Sbellard (void) opaque;
1157372f88dSbellard }
1167372f88dSbellard
11735f4b58cSblueswir1 static struct audio_pcm_ops no_pcm_ops = {
1181dd3e4d1SJuan Quintela .init_out = no_init_out,
1191dd3e4d1SJuan Quintela .fini_out = no_fini_out,
120affc691aSKővágó, Zoltán .write = no_write,
1219833438eSVolker Rümelin .buffer_get_free = audio_generic_buffer_get_free,
122fdc8c5f4SVolker Rümelin .run_buffer_out = audio_generic_run_buffer_out,
123571a8c52SKővágó, Zoltán .enable_out = no_enable_out,
1241d14ffa9Sbellard
1251dd3e4d1SJuan Quintela .init_in = no_init_in,
1261dd3e4d1SJuan Quintela .fini_in = no_fini_in,
127affc691aSKővágó, Zoltán .read = no_read,
128a2893c83SVolker Rümelin .run_buffer_in = audio_generic_run_buffer_in,
129571a8c52SKővágó, Zoltán .enable_in = no_enable_in
1307372f88dSbellard };
1317372f88dSbellard
132d3893a39SGerd Hoffmann static struct audio_driver no_audio_driver = {
133bee37f32SJuan Quintela .name = "none",
134bee37f32SJuan Quintela .descr = "Timer based audio emulation",
135bee37f32SJuan Quintela .init = no_audio_init,
136bee37f32SJuan Quintela .fini = no_audio_fini,
137bee37f32SJuan Quintela .pcm_ops = &no_pcm_ops,
138bee37f32SJuan Quintela .max_voices_out = INT_MAX,
139bee37f32SJuan Quintela .max_voices_in = INT_MAX,
140bee37f32SJuan Quintela .voice_size_out = sizeof (NoVoiceOut),
141bee37f32SJuan Quintela .voice_size_in = sizeof (NoVoiceIn)
1427372f88dSbellard };
143d3893a39SGerd Hoffmann
register_audio_none(void)144d3893a39SGerd Hoffmann static void register_audio_none(void)
145d3893a39SGerd Hoffmann {
146d3893a39SGerd Hoffmann audio_driver_register(&no_audio_driver);
147d3893a39SGerd Hoffmann }
148d3893a39SGerd Hoffmann type_init(register_audio_none);
149