*/
#ifdef DSBTYPE_IN
#define NAME "capture buffer"
+#define NAME2 "DirectSoundCapture"
#define TYPE in
#define IFACE IDirectSoundCaptureBuffer
#define BUFPTR LPDIRECTSOUNDCAPTUREBUFFER
#define FIELD dsound_capture_buffer
+#define FIELD2 dsound_capture
#else
#define NAME "playback buffer"
+#define NAME2 "DirectSound"
#define TYPE out
#define IFACE IDirectSoundBuffer
#define BUFPTR LPDIRECTSOUNDBUFFER
#define FIELD dsound_buffer
+#define FIELD2 dsound
#endif
static int glue (dsound_unlock_, TYPE) (
hr = glue (IFACE, _Unlock) (buf, p1, blen1, p2, blen2);
if (FAILED (hr)) {
- dsound_logerr (hr, "Can not unlock " NAME "\n");
+ dsound_logerr (hr, "Could not unlock " NAME "\n");
return -1;
}
LPVOID *p2p,
DWORD *blen1p,
DWORD *blen2p,
- int entire
+ int entire,
+ dsound *s
)
{
HRESULT hr;
- int i;
LPVOID p1 = NULL, p2 = NULL;
DWORD blen1 = 0, blen2 = 0;
+ DWORD flag;
- for (i = 0; i < conf.lock_retries; ++i) {
- hr = glue (IFACE, _Lock) (
- buf,
- pos,
- len,
- &p1,
- &blen1,
- &p2,
- &blen2,
- (entire
#ifdef DSBTYPE_IN
- ? DSCBLOCK_ENTIREBUFFER
+ flag = entire ? DSCBLOCK_ENTIREBUFFER : 0;
#else
- ? DSBLOCK_ENTIREBUFFER
+ flag = entire ? DSBLOCK_ENTIREBUFFER : 0;
#endif
- : 0)
- );
+ hr = glue(IFACE, _Lock)(buf, pos, len, &p1, &blen1, &p2, &blen2, flag);
- if (FAILED (hr)) {
+ if (FAILED (hr)) {
#ifndef DSBTYPE_IN
- if (hr == DSERR_BUFFERLOST) {
- if (glue (dsound_restore_, TYPE) (buf)) {
- dsound_logerr (hr, "Can not lock " NAME "\n");
- goto fail;
- }
- continue;
+ if (hr == DSERR_BUFFERLOST) {
+ if (glue (dsound_restore_, TYPE) (buf, s)) {
+ dsound_logerr (hr, "Could not lock " NAME "\n");
}
-#endif
- dsound_logerr (hr, "Can not lock " NAME "\n");
goto fail;
}
-
- break;
- }
-
- if (i == conf.lock_retries) {
- dolog ("%d attempts to lock " NAME " failed\n", i);
+#endif
+ dsound_logerr (hr, "Could not lock " NAME "\n");
goto fail;
}
if (ds->FIELD) {
hr = glue (IFACE, _Stop) (ds->FIELD);
if (FAILED (hr)) {
- dsound_logerr (hr, "Can not stop " NAME "\n");
+ dsound_logerr (hr, "Could not stop " NAME "\n");
}
hr = glue (IFACE, _Release) (ds->FIELD);
if (FAILED (hr)) {
- dsound_logerr (hr, "Can not release " NAME "\n");
+ dsound_logerr (hr, "Could not release " NAME "\n");
}
ds->FIELD = NULL;
}
}
#ifdef DSBTYPE_IN
-static int dsound_init_in (
- HWVoiceIn *hw,
- int freq,
- int nchannels,
- audfmt_e fmt
- )
+static int dsound_init_in(HWVoiceIn *hw, struct audsettings *as,
+ void *drv_opaque)
#else
-static int dsound_init_out (
- HWVoiceOut *hw,
- int freq,
- int nchannels,
- audfmt_e fmt
- )
+static int dsound_init_out(HWVoiceOut *hw, struct audsettings *as,
+ void *drv_opaque)
#endif
{
int err;
HRESULT hr;
- dsound *s = &glob_dsound;
+ dsound *s = drv_opaque;
WAVEFORMATEX wfx;
- struct full_fmt full_fmt;
+ struct audsettings obt_as;
+ DSoundConf *conf = &s->conf;
#ifdef DSBTYPE_IN
const char *typ = "ADC";
DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
DSBCAPS bc;
#endif
- full_fmt.freq = freq;
- full_fmt.nchannels = nchannels;
- full_fmt.fmt = fmt;
- err = waveformat_from_full_fmt (&wfx, &full_fmt);
+ if (!s->FIELD2) {
+ dolog ("Attempt to initialize voice without " NAME2 " object\n");
+ return -1;
+ }
+
+ err = waveformat_from_audio_settings (&wfx, as);
if (err) {
return -1;
}
bd.dwSize = sizeof (bd);
bd.lpwfxFormat = &wfx;
#ifdef DSBTYPE_IN
- bd.dwBufferBytes = conf.bufsize_in;
+ bd.dwBufferBytes = conf->bufsize_in;
hr = IDirectSoundCapture_CreateCaptureBuffer (
s->dsound_capture,
&bd,
);
#else
bd.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2;
- bd.dwBufferBytes = conf.bufsize_out;
+ bd.dwBufferBytes = conf->bufsize_out;
hr = IDirectSound_CreateSoundBuffer (
s->dsound,
&bd,
#endif
if (FAILED (hr)) {
- dsound_logerr2 (hr, typ, "Can not create " NAME "\n");
+ dsound_logerr2 (hr, typ, "Could not create " NAME "\n");
return -1;
}
- hr = glue (IFACE, _GetFormat) (
- ds->FIELD,
- &wfx,
- sizeof (wfx),
- NULL
- );
+ hr = glue (IFACE, _GetFormat) (ds->FIELD, &wfx, sizeof (wfx), NULL);
if (FAILED (hr)) {
- dsound_logerr2 (hr, typ, "Can not get " NAME " format\n");
+ dsound_logerr2 (hr, typ, "Could not get " NAME " format\n");
goto fail0;
}
hr = glue (IFACE, _GetCaps) (ds->FIELD, &bc);
if (FAILED (hr)) {
- dsound_logerr2 (hr, typ, "Can not get " NAME " format\n");
+ dsound_logerr2 (hr, typ, "Could not get " NAME " format\n");
goto fail0;
}
- err = waveformat_to_full_fmt (&wfx, &full_fmt);
+ err = waveformat_to_audio_settings (&wfx, &obt_as);
if (err) {
goto fail0;
}
ds->first_time = 1;
- hw->bufsize = bc.dwBufferBytes;
- audio_pcm_init_info (
- &hw->info,
- full_fmt.freq,
- full_fmt.nchannels,
- full_fmt.fmt,
- audio_need_to_swap_endian (0)
- );
+ obt_as.endianness = 0;
+ audio_pcm_init_info (&hw->info, &obt_as);
+
+ if (bc.dwBufferBytes & hw->info.align) {
+ dolog (
+ "GetCaps returned misaligned buffer size %ld, alignment %d\n",
+ bc.dwBufferBytes, hw->info.align + 1
+ );
+ }
+ hw->samples = bc.dwBufferBytes >> hw->info.shift;
+ ds->s = s;
#ifdef DEBUG_DSOUND
dolog ("caps %ld, desc %ld\n",
bc.dwBufferBytes, bd.dwBufferBytes);
dolog ("bufsize %d, freq %d, chan %d, fmt %d\n",
- hw->bufsize, full_fmt.freq, full_fmt.nchannels, full_fmt.fmt);
+ hw->bufsize, settings.freq, settings.nchannels, settings.fmt);
#endif
return 0;
}
#undef NAME
+#undef NAME2
#undef TYPE
#undef IFACE
#undef BUFPTR
#undef FIELD
+#undef FIELD2