xref: /openbmc/qemu/audio/noaudio.c (revision da1034094d375afe9e3d8ec8980550ea0f06f7e0)
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