[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 09/51] dsoundaudio: port to -audiodev config
From: |
Kővágó, Zoltán |
Subject: |
[Qemu-devel] [PATCH 09/51] dsoundaudio: port to -audiodev config |
Date: |
Thu, 14 Jan 2016 14:45:22 +0100 |
Signed-off-by: Kővágó, Zoltán <address@hidden>
---
audio/audio_legacy.c | 12 ++++++++++
audio/dsound_template.h | 6 ++---
audio/dsoundaudio.c | 59 ++++++++++++++-----------------------------------
3 files changed, 32 insertions(+), 45 deletions(-)
diff --git a/audio/audio_legacy.c b/audio/audio_legacy.c
index 4be972e..bcf87ff 100644
--- a/audio/audio_legacy.c
+++ b/audio/audio_legacy.c
@@ -66,6 +66,16 @@ SimpleEnvMap coreaudio_map[] = {
{ /* End of list */ }
};
+SimpleEnvMap dsound_map[] = {
+ { "QEMU_DSOUND_LATENCY_MILLIS", "latency", ENV_TRANSFORM_MILLIS_TO_USECS },
+ { "QEMU_DSOUND_BUFSIZE_OUT", "out.buffer-len",
+ ENV_TRANSFORM_BYTES_TO_USECS_OUT },
+ { "QEMU_DSOUND_BUFSIZE_IN", "in.buffer-len",
+ ENV_TRANSFORM_BYTES_TO_USECS_IN },
+
+ { /* End of list */ }
+};
+
static unsigned long long toull(const char *str)
{
unsigned long long ret;
@@ -238,6 +248,8 @@ static void legacy_opt(const char *drv)
handle_alsa(opts);
} else if (strcmp(drv, "coreaudio") == 0) {
handle_env_opts(opts, coreaudio_map);
+ } else if (strcmp(drv, "dsound") == 0) {
+ handle_env_opts(opts, dsound_map);
}
}
diff --git a/audio/dsound_template.h b/audio/dsound_template.h
index b439f33..96181ef 100644
--- a/audio/dsound_template.h
+++ b/audio/dsound_template.h
@@ -167,17 +167,18 @@ static int dsound_init_out(HWVoiceOut *hw, struct
audsettings *as,
dsound *s = drv_opaque;
WAVEFORMATEX wfx;
struct audsettings obt_as;
- DSoundConf *conf = &s->conf;
#ifdef DSBTYPE_IN
const char *typ = "ADC";
DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
DSCBUFFERDESC bd;
DSCBCAPS bc;
+ AudiodevPerDirectionOptions *pdo = s->dev->in;
#else
const char *typ = "DAC";
DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
DSBUFFERDESC bd;
DSBCAPS bc;
+ AudiodevPerDirectionOptions *pdo = s->dev->out;
#endif
if (!s->FIELD2) {
@@ -193,8 +194,8 @@ static int dsound_init_out(HWVoiceOut *hw, struct
audsettings *as,
memset (&bd, 0, sizeof (bd));
bd.dwSize = sizeof (bd);
bd.lpwfxFormat = &wfx;
+ bd.dwBufferBytes = audio_buffer_bytes(pdo, as, 92880);
#ifdef DSBTYPE_IN
- bd.dwBufferBytes = conf->bufsize_in;
hr = IDirectSoundCapture_CreateCaptureBuffer (
s->dsound_capture,
&bd,
@@ -203,7 +204,6 @@ static int dsound_init_out(HWVoiceOut *hw, struct
audsettings *as,
);
#else
bd.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2;
- bd.dwBufferBytes = conf->bufsize_out;
hr = IDirectSound_CreateSoundBuffer (
s->dsound,
&bd,
diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c
index d447e12..ff72d3f 100644
--- a/audio/dsoundaudio.c
+++ b/audio/dsoundaudio.c
@@ -31,6 +31,7 @@
#define AUDIO_CAP "dsound"
#include "audio_int.h"
+#include "qemu/host-utils.h"
#include <windows.h>
#include <mmsystem.h>
@@ -42,16 +43,10 @@
/* #define DEBUG_DSOUND */
typedef struct {
- int bufsize_in;
- int bufsize_out;
- int latency_millis;
-} DSoundConf;
-
-typedef struct {
LPDIRECTSOUND dsound;
LPDIRECTSOUNDCAPTURE dsound_capture;
struct audsettings settings;
- DSoundConf conf;
+ Audiodev *dev;
} dsound;
typedef struct {
@@ -247,9 +242,9 @@ static void GCC_FMT_ATTR (3, 4) dsound_logerr2 (
dsound_log_hresult (hr);
}
-static DWORD millis_to_bytes (struct audio_pcm_info *info, DWORD millis)
+static uint64_t usecs_to_bytes(struct audio_pcm_info *info, uint32_t usecs)
{
- return (millis * info->bytes_per_second) / 1000;
+ return muldiv64(usecs, info->bytes_per_second, 1000000);
}
#ifdef DEBUG_DSOUND
@@ -477,7 +472,7 @@ static int dsound_run_out (HWVoiceOut *hw, int live)
LPVOID p1, p2;
int bufsize;
dsound *s = ds->s;
- DSoundConf *conf = &s->conf;
+ AudiodevDsoundOptions *dso = s->dev->u.dsound;
if (!dsb) {
dolog ("Attempt to run empty with playback buffer\n");
@@ -500,14 +495,14 @@ static int dsound_run_out (HWVoiceOut *hw, int live)
len = live << hwshift;
if (ds->first_time) {
- if (conf->latency_millis) {
+ if (dso->latency) {
DWORD cur_blat;
cur_blat = audio_ring_dist (wpos, ppos, bufsize);
ds->first_time = 0;
old_pos = wpos;
old_pos +=
- millis_to_bytes (&hw->info, conf->latency_millis) - cur_blat;
+ usecs_to_bytes(&hw->info, dso->latency) - cur_blat;
old_pos %= bufsize;
old_pos &= ~hw->info.align;
}
@@ -746,12 +741,6 @@ static int dsound_run_in (HWVoiceIn *hw)
return decr;
}
-static DSoundConf glob_conf = {
- .bufsize_in = 16384,
- .bufsize_out = 16384,
- .latency_millis = 10
-};
-
static void dsound_audio_fini (void *opaque)
{
HRESULT hr;
@@ -787,8 +776,17 @@ static void *dsound_audio_init(Audiodev *dev)
int err;
HRESULT hr;
dsound *s = g_malloc0(sizeof(dsound));
+ AudiodevDsoundOptions *dso;
+
+ assert(dev->driver == AUDIODEV_DRIVER_DSOUND);
+ s->dev = dev;
+ dso = dev->u.dsound;
+
+ if (!dso->has_latency) {
+ dso->has_latency = true;
+ dso->latency = 10000; /* 10 ms */
+ }
- s->conf = glob_conf;
hr = CoInitialize (NULL);
if (FAILED (hr)) {
dsound_logerr (hr, "Could not initialize COM\n");
@@ -853,28 +851,6 @@ static void *dsound_audio_init(Audiodev *dev)
return s;
}
-static struct audio_option dsound_options[] = {
- {
- .name = "LATENCY_MILLIS",
- .tag = AUD_OPT_INT,
- .valp = &glob_conf.latency_millis,
- .descr = "(undocumented)"
- },
- {
- .name = "BUFSIZE_OUT",
- .tag = AUD_OPT_INT,
- .valp = &glob_conf.bufsize_out,
- .descr = "(undocumented)"
- },
- {
- .name = "BUFSIZE_IN",
- .tag = AUD_OPT_INT,
- .valp = &glob_conf.bufsize_in,
- .descr = "(undocumented)"
- },
- { /* End of list */ }
-};
-
static struct audio_pcm_ops dsound_pcm_ops = {
.init_out = dsound_init_out,
.fini_out = dsound_fini_out,
@@ -892,7 +868,6 @@ static struct audio_pcm_ops dsound_pcm_ops = {
struct audio_driver dsound_audio_driver = {
.name = "dsound",
.descr = "DirectSound http://wikipedia.org/wiki/DirectSound",
- .options = dsound_options,
.init = dsound_audio_init,
.fini = dsound_audio_fini,
.pcm_ops = &dsound_pcm_ops,
--
2.7.0
- [Qemu-devel] [PATCH 05/51] audio: -audiodev command line option: documentation, (continued)
- [Qemu-devel] [PATCH 05/51] audio: -audiodev command line option: documentation, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 04/51] audio: use qapi AudioFormat instead of audfmt_e, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 08/51] coreaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 13/51] sdlaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 16/51] audio: -audiodev command line option: cleanup, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 15/51] wavaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 10/51] noaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 11/51] ossaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 07/51] alsaaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 14/51] spiceaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 09/51] dsoundaudio: port to -audiodev config,
Kővágó, Zoltán <=
- [Qemu-devel] [PATCH 12/51] paaudio: port to -audiodev config, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 06/51] audio: -audiodev command line option basic implementation, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 22/51] paaudio: properly disconnect streams in fini_*, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 34/51] sdlaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 21/51] paaudio: do not move stream when sink/source name is specified, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 19/51] audio: add audiodev properties to frontends, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 28/51] audio: api for mixeng code free backends, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 29/51] alsaaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 31/51] noaudio: port to the new audio backend api, Kővágó, Zoltán, 2016/01/14
- [Qemu-devel] [PATCH 26/51] audio: remove read and write pcm_ops, Kővágó, Zoltán, 2016/01/14