return audio_ring_dist(cntinfo.ptr, oss->hw.pos_emul, oss->hw.size_emul);
}
+static void oss_run_buffer_out(HWVoiceOut *hw)
+{
+ OSSVoiceOut *oss = (OSSVoiceOut *)hw;
+
+ if (!oss->mmapped) {
+ audio_generic_run_buffer_out(hw);
+ }
+}
+
static void *oss_get_buffer_out(HWVoiceOut *hw, size_t *size)
{
OSSVoiceOut *oss = (OSSVoiceOut *) hw;
size_t to_copy = MIN(len, hw->size_emul - hw->pos_emul);
memcpy(hw->buf_emul + hw->pos_emul, buf, to_copy);
- hw->pos_emul = (hw->pos_emul + to_copy) % hw->pos_emul;
+ hw->pos_emul = (hw->pos_emul + to_copy) % hw->size_emul;
buf += to_copy;
len -= to_copy;
}
oss->nfrags = obt.nfrags;
oss->fragsize = obt.fragsize;
- if (obt.nfrags * obt.fragsize & hw->info.align) {
+ if (obt.nfrags * obt.fragsize % hw->info.bytes_per_frame) {
dolog ("warning: Misaligned DAC buffer, size %d, alignment %d\n",
- obt.nfrags * obt.fragsize, hw->info.align + 1);
+ obt.nfrags * obt.fragsize, hw->info.bytes_per_frame);
}
- hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+ hw->samples = (obt.nfrags * obt.fragsize) / hw->info.bytes_per_frame;
oss->mmapped = 0;
if (oopts->has_try_mmap && oopts->try_mmap) {
- hw->size_emul = hw->samples << hw->info.shift;
+ hw->size_emul = hw->samples * hw->info.bytes_per_frame;
hw->buf_emul = mmap(
NULL,
hw->size_emul,
return 0;
}
-static int oss_ctl_out (HWVoiceOut *hw, int cmd, ...)
+static void oss_enable_out(HWVoiceOut *hw, bool enable)
{
int trig;
OSSVoiceOut *oss = (OSSVoiceOut *) hw;
AudiodevOssPerDirectionOptions *opdo = oss->dev->u.oss.out;
- switch (cmd) {
- case VOICE_ENABLE:
- {
- bool poll_mode = opdo->try_poll;
-
- ldebug ("enabling voice\n");
- if (poll_mode) {
- oss_poll_out (hw);
- poll_mode = 0;
- }
- hw->poll_mode = poll_mode;
+ if (enable) {
+ hw->poll_mode = opdo->try_poll;
- if (!oss->mmapped) {
- return 0;
- }
+ ldebug("enabling voice\n");
+ if (hw->poll_mode) {
+ oss_poll_out(hw);
+ }
- audio_pcm_info_clear_buf(
- &hw->info, hw->buf_emul, hw->mix_buf->size);
- trig = PCM_ENABLE_OUTPUT;
- if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
- oss_logerr (
- errno,
- "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
- );
- return -1;
- }
+ if (!oss->mmapped) {
+ return;
}
- break;
- case VOICE_DISABLE:
+ audio_pcm_info_clear_buf(&hw->info, hw->buf_emul, hw->samples);
+ trig = PCM_ENABLE_OUTPUT;
+ if (ioctl(oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+ oss_logerr(errno,
+ "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n");
+ return;
+ }
+ } else {
if (hw->poll_mode) {
qemu_set_fd_handler (oss->fd, NULL, NULL, NULL);
hw->poll_mode = 0;
}
if (!oss->mmapped) {
- return 0;
+ return;
}
ldebug ("disabling voice\n");
trig = 0;
if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
oss_logerr (errno, "SNDCTL_DSP_SETTRIGGER 0 failed\n");
- return -1;
+ return;
}
- break;
}
- return 0;
}
static int oss_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opaque)
oss->nfrags = obt.nfrags;
oss->fragsize = obt.fragsize;
- if (obt.nfrags * obt.fragsize & hw->info.align) {
+ if (obt.nfrags * obt.fragsize % hw->info.bytes_per_frame) {
dolog ("warning: Misaligned ADC buffer, size %d, alignment %d\n",
- obt.nfrags * obt.fragsize, hw->info.align + 1);
+ obt.nfrags * obt.fragsize, hw->info.bytes_per_frame);
}
- hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+ hw->samples = (obt.nfrags * obt.fragsize) / hw->info.bytes_per_frame;
oss->fd = fd;
oss->dev = dev;
len, dst);
break;
}
+ break;
}
pos += nread;
return pos;
}
-static int oss_ctl_in (HWVoiceIn *hw, int cmd, ...)
+static void oss_enable_in(HWVoiceIn *hw, bool enable)
{
OSSVoiceIn *oss = (OSSVoiceIn *) hw;
AudiodevOssPerDirectionOptions *opdo = oss->dev->u.oss.out;
- switch (cmd) {
- case VOICE_ENABLE:
- {
- bool poll_mode = opdo->try_poll;
+ if (enable) {
+ hw->poll_mode = opdo->try_poll;
- if (poll_mode) {
- oss_poll_in (hw);
- poll_mode = 0;
- }
- hw->poll_mode = poll_mode;
+ if (hw->poll_mode) {
+ oss_poll_in(hw);
}
- break;
-
- case VOICE_DISABLE:
+ } else {
if (hw->poll_mode) {
- hw->poll_mode = 0;
qemu_set_fd_handler (oss->fd, NULL, NULL, NULL);
+ hw->poll_mode = 0;
}
- break;
}
- return 0;
}
static void oss_init_per_direction(AudiodevOssPerDirectionOptions *opdo)
.init_out = oss_init_out,
.fini_out = oss_fini_out,
.write = oss_write,
+ .run_buffer_out = oss_run_buffer_out,
.get_buffer_out = oss_get_buffer_out,
.put_buffer_out = oss_put_buffer_out,
- .ctl_out = oss_ctl_out,
+ .enable_out = oss_enable_out,
.init_in = oss_init_in,
.fini_in = oss_fini_in,
.read = oss_read,
- .ctl_in = oss_ctl_in
+ .enable_in = oss_enable_in
};
static struct audio_driver oss_audio_driver = {