typedef struct NoVoiceOut {
HWVoiceOut hw;
- int64_t old_ticks;
+ RateCtl rate;
} NoVoiceOut;
typedef struct NoVoiceIn {
HWVoiceIn hw;
- int64_t old_ticks;
+ RateCtl rate;
} NoVoiceIn;
-static size_t no_run_out(HWVoiceOut *hw, size_t live)
+static size_t no_write(HWVoiceOut *hw, void *buf, size_t len)
{
NoVoiceOut *no = (NoVoiceOut *) hw;
- size_t decr, samples;
- int64_t now;
- int64_t ticks;
- int64_t bytes;
-
- now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
- ticks = now - no->old_ticks;
- bytes = muldiv64(ticks, hw->info.bytes_per_second, NANOSECONDS_PER_SECOND);
- bytes = MIN(bytes, SIZE_MAX);
- samples = bytes >> hw->info.shift;
-
- no->old_ticks = now;
- decr = MIN (live, samples);
- hw->rpos = (hw->rpos + decr) % hw->samples;
- return decr;
+ return audio_rate_get_bytes(&no->rate, &hw->info, len);
}
static int no_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_opaque)
{
+ NoVoiceOut *no = (NoVoiceOut *) hw;
+
audio_pcm_init_info (&hw->info, as);
hw->samples = 1024;
+ audio_rate_start(&no->rate);
return 0;
}
(void) hw;
}
-static int no_ctl_out (HWVoiceOut *hw, int cmd, ...)
+static void no_enable_out(HWVoiceOut *hw, bool enable)
{
- (void) hw;
- (void) cmd;
- return 0;
+ NoVoiceOut *no = (NoVoiceOut *) hw;
+
+ if (enable) {
+ audio_rate_start(&no->rate);
+ }
}
static int no_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
{
+ NoVoiceIn *no = (NoVoiceIn *) hw;
+
audio_pcm_init_info (&hw->info, as);
hw->samples = 1024;
+ audio_rate_start(&no->rate);
return 0;
}
(void) hw;
}
-static size_t no_run_in(HWVoiceIn *hw)
+static size_t no_read(HWVoiceIn *hw, void *buf, size_t size)
{
NoVoiceIn *no = (NoVoiceIn *) hw;
- size_t live = audio_pcm_hw_get_live_in(hw);
- size_t dead = hw->samples - live;
- size_t samples = 0;
-
- if (dead) {
- int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
- int64_t ticks = now - no->old_ticks;
- int64_t bytes =
- muldiv64(ticks, hw->info.bytes_per_second, NANOSECONDS_PER_SECOND);
-
- no->old_ticks = now;
- bytes = MIN (bytes, SIZE_MAX);
- samples = bytes >> hw->info.shift;
- samples = MIN (samples, dead);
- }
- return samples;
+ int64_t bytes = audio_rate_get_bytes(&no->rate, &hw->info, size);
+
+ audio_pcm_info_clear_buf(&hw->info, buf, bytes / hw->info.bytes_per_frame);
+ return bytes;
}
-static int no_ctl_in (HWVoiceIn *hw, int cmd, ...)
+static void no_enable_in(HWVoiceIn *hw, bool enable)
{
- (void) hw;
- (void) cmd;
- return 0;
+ NoVoiceIn *no = (NoVoiceIn *) hw;
+
+ if (enable) {
+ audio_rate_start(&no->rate);
+ }
}
-static void *no_audio_init(Audiodev *dev)
+static void *no_audio_init(Audiodev *dev, Error **errp)
{
return &no_audio_init;
}
static struct audio_pcm_ops no_pcm_ops = {
.init_out = no_init_out,
.fini_out = no_fini_out,
- .run_out = no_run_out,
- .ctl_out = no_ctl_out,
+ .write = no_write,
+ .buffer_get_free = audio_generic_buffer_get_free,
+ .run_buffer_out = audio_generic_run_buffer_out,
+ .enable_out = no_enable_out,
.init_in = no_init_in,
.fini_in = no_fini_in,
- .run_in = no_run_in,
- .ctl_in = no_ctl_in
+ .read = no_read,
+ .run_buffer_in = audio_generic_run_buffer_in,
+ .enable_in = no_enable_in
};
static struct audio_driver no_audio_driver = {
.init = no_audio_init,
.fini = no_audio_fini,
.pcm_ops = &no_pcm_ops,
- .can_be_default = 1,
.max_voices_out = INT_MAX,
.max_voices_in = INT_MAX,
.voice_size_out = sizeof (NoVoiceOut),