From nobody Fri Nov 7 03:58:43 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1545599370233426.1647188507267; Sun, 23 Dec 2018 13:09:30 -0800 (PST) Received: from localhost ([127.0.0.1]:59773 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gbB03-0003mC-NB for importer@patchew.org; Sun, 23 Dec 2018 16:09:27 -0500 Received: from eggs.gnu.org ([208.118.235.92]:52472) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gbAk7-00087E-KW for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:53:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gbAk5-00030O-Nk for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:52:59 -0500 Received: from mail-wm1-x333.google.com ([2a00:1450:4864:20::333]:39791) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gbAk5-0002wX-DJ for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:52:57 -0500 Received: by mail-wm1-x333.google.com with SMTP id f81so10393861wmd.4 for ; Sun, 23 Dec 2018 12:52:57 -0800 (PST) Received: from nullptr.home.dirty-ice.org (2a01-036c-0113-24a3-0000-0000-0000-0005.pool6.digikabel.hu. [2a01:36c:113:24a3::5]) by smtp.gmail.com with ESMTPSA id g198sm25456920wmd.23.2018.12.23.12.52.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Dec 2018 12:52:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ux877SubpN+vMU4fAvA4kT9xqiWB2UQdru4VXjEMgko=; b=ABqABR/Wh7hwdqEE7SK4uLVAiBNoY+Pj3fXqoAv8uRvc+XjjVj3VKKNST+JNl2wo+g aWOHqfSx+ic6BHxq8cDD7zIXU0q8WjbOcPJS7fd3QrestZwv9LI4WeAn79YRzuTC2vKj KJcUy8nN1XWaMwvc+gVEn97wWPNqtDkHB2yOOIGeyhiMMIeZEE/aMYvFqoZFZPytGmVp nIfDg9BdFJcK3MLQ5TYXk6HBDU8juB33Rb2FFJiLeZu1eJCJXSIU4GvkNbG4xVegfuhF jCPeaB/uPRIrV8XnOR8tmlNsNvrH4KigSYKDjbn1clssDj3qcNbkROOenTufvEhADDA9 z4MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ux877SubpN+vMU4fAvA4kT9xqiWB2UQdru4VXjEMgko=; b=c1vkIqVVx7ySSjLQbnktcTg4fjYjyv3ylFMQ2DJYRX3bedCOevrryxR+E1EXJyn8nx H5AbARlglePHTZ7GkPesz09HjvrmgbkI/Qzieo61rGKUItW05YohXNr05Pyv14Wss5mV +oqJeB/hZyFIfMSP7AStGsZEuTyUYu2PoeTL0d52BDcdVCXZ4pbg6Zsn33rIKL7BABcJ wF9hOEagh25H86+hw0Mq1thW7XSOdJwmh8DWD7bdJE689eHStYAoCG6nenZnvrsARS9/ KWLOO1ITnI9jm1uA5I8GzMoJvDnmCrio8B07fpmWdfflv3jV9cgy3VsSCngjQFwoN+AC dQ0w== X-Gm-Message-State: AJcUukeiO4OM24ONrTBpppU2BUTXoG69sHc6bdHwXxy29sGuWEHrg2LS XJi4FSm/BVZzY8gOOSJ9AuPl2p9qCyk= X-Google-Smtp-Source: ALg8bN7NirmIy4jd/Vs15ry4Ejcg1XFDc1r8zAB3v67+ym785g1BmP5RlbTElv9w6VpGVMb0Mw6kqw== X-Received: by 2002:a1c:8c05:: with SMTP id o5mr9574644wmd.29.1545598375909; Sun, 23 Dec 2018 12:52:55 -0800 (PST) From: "=?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?=" X-Google-Original-From: =?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?= To: qemu-devel@nongnu.org Date: Sun, 23 Dec 2018 21:52:07 +0100 Message-Id: X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::333 Subject: [Qemu-devel] [PATCH v2 31/52] dsoundaudio: port to the new audio backend api X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" --- audio/dsound_template.h | 45 +++--- audio/dsoundaudio.c | 328 ++++++++++------------------------------ 2 files changed, 102 insertions(+), 271 deletions(-) diff --git a/audio/dsound_template.h b/audio/dsound_template.h index 96181efb36..ff5a1f85fd 100644 --- a/audio/dsound_template.h +++ b/audio/dsound_template.h @@ -29,6 +29,8 @@ #define BUFPTR LPDIRECTSOUNDCAPTUREBUFFER #define FIELD dsound_capture_buffer #define FIELD2 dsound_capture +#define HWVOICE HWVoiceIn +#define DSOUNDVOICE DSoundVoiceIn #else #define NAME "playback buffer" #define NAME2 "DirectSound" @@ -37,6 +39,8 @@ #define BUFPTR LPDIRECTSOUNDBUFFER #define FIELD dsound_buffer #define FIELD2 dsound +#define HWVOICE HWVoiceOut +#define DSOUNDVOICE DSoundVoiceOut #endif =20 static int glue (dsound_unlock_, TYPE) ( @@ -72,8 +76,6 @@ static int glue (dsound_lock_, TYPE) ( ) { HRESULT hr; - LPVOID p1 =3D NULL, p2 =3D NULL; - DWORD blen1 =3D 0, blen2 =3D 0; DWORD flag; =20 #ifdef DSBTYPE_IN @@ -81,7 +83,7 @@ static int glue (dsound_lock_, TYPE) ( #else flag =3D entire ? DSBLOCK_ENTIREBUFFER : 0; #endif - hr =3D glue(IFACE, _Lock)(buf, pos, len, &p1, &blen1, &p2, &blen2, fla= g); + hr =3D glue(IFACE, _Lock)(buf, pos, len, p1p, blen1p, p2p, blen2p, fla= g); =20 if (FAILED (hr)) { #ifndef DSBTYPE_IN @@ -96,34 +98,34 @@ static int glue (dsound_lock_, TYPE) ( goto fail; } =20 - if ((p1 && (blen1 & info->align)) || (p2 && (blen2 & info->align))) { + if ((p1p && *p1p && (*blen1p & info->align)) || + (p2p && *p2p && (*blen2p & info->align))) { dolog ("DirectSound returned misaligned buffer %ld %ld\n", - blen1, blen2); - glue (dsound_unlock_, TYPE) (buf, p1, p2, blen1, blen2); + *blen1p, *blen2p); + glue (dsound_unlock_, TYPE) (buf, *p1p, p2p ? *p2p : NULL, *blen1p, + blen2p ? *blen2p : 0); goto fail; } =20 - if (!p1 && blen1) { - dolog ("warning: !p1 && blen1=3D%ld\n", blen1); - blen1 =3D 0; + if (p1p && !*p1p && *blen1p) { + dolog("warning: !p1 && blen1=3D%ld\n", *blen1p); + *blen1p =3D 0; } =20 - if (!p2 && blen2) { - dolog ("warning: !p2 && blen2=3D%ld\n", blen2); - blen2 =3D 0; + if (p2p && !*p2p && *blen2p) { + dolog("warning: !p2 && blen2=3D%ld\n", *blen2p); + *blen2p =3D 0; } =20 - *p1p =3D p1; - *p2p =3D p2; - *blen1p =3D blen1; - *blen2p =3D blen2; return 0; =20 fail: *p1p =3D NULL - 1; - *p2p =3D NULL - 1; *blen1p =3D -1; - *blen2p =3D -1; + if (p2p) { + *p2p =3D NULL - 1; + *blen2p =3D -1; + } return -1; } =20 @@ -242,7 +244,6 @@ static int dsound_init_out(HWVoiceOut *hw, struct audse= ttings *as, goto fail0; } =20 - ds->first_time =3D 1; obt_as.endianness =3D 0; audio_pcm_init_info (&hw->info, &obt_as); =20 @@ -252,15 +253,13 @@ static int dsound_init_out(HWVoiceOut *hw, struct aud= settings *as, bc.dwBufferBytes, hw->info.align + 1 ); } + hw->size_emul =3D bc.dwBufferBytes; hw->samples =3D bc.dwBufferBytes >> hw->info.shift; ds->s =3D s; =20 #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, settings.freq, settings.nchannels, settings.fmt); #endif return 0; =20 @@ -276,3 +275,5 @@ static int dsound_init_out(HWVoiceOut *hw, struct audse= ttings *as, #undef BUFPTR #undef FIELD #undef FIELD2 +#undef HWVOICE +#undef DSOUNDVOICE diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c index dfcb70c81a..7b3266aaf3 100644 --- a/audio/dsoundaudio.c +++ b/audio/dsoundaudio.c @@ -53,19 +53,11 @@ typedef struct { typedef struct { HWVoiceOut hw; LPDIRECTSOUNDBUFFER dsound_buffer; - DWORD old_pos; - int first_time; dsound *s; -#ifdef DEBUG_DSOUND - DWORD old_ppos; - DWORD played; - DWORD mixed; -#endif } DSoundVoiceOut; =20 typedef struct { HWVoiceIn hw; - int first_time; LPDIRECTSOUNDCAPTUREBUFFER dsound_capture_buffer; dsound *s; } DSoundVoiceIn; @@ -243,11 +235,6 @@ static void GCC_FMT_ATTR (3, 4) dsound_logerr2 ( dsound_log_hresult (hr); } =20 -static uint64_t usecs_to_bytes(struct audio_pcm_info *info, uint32_t usecs) -{ - return muldiv64(usecs, info->bytes_per_second, 1000000); -} - #ifdef DEBUG_DSOUND static void print_wave_format (WAVEFORMATEX *wfx) { @@ -312,33 +299,6 @@ static int dsound_get_status_in (LPDIRECTSOUNDCAPTUREB= UFFER dscb, return 0; } =20 -static void dsound_write_sample (HWVoiceOut *hw, uint8_t *dst, int dst_len) -{ - int src_len1 =3D dst_len; - int src_len2 =3D 0; - int pos =3D hw->rpos + dst_len; - struct st_sample *src1 =3D hw->mix_buf + hw->rpos; - struct st_sample *src2 =3D NULL; - - if (pos > hw->samples) { - src_len1 =3D hw->samples - hw->rpos; - src2 =3D hw->mix_buf; - src_len2 =3D dst_len - src_len1; - pos =3D src_len2; - } - - if (src_len1) { - hw->clip (dst, src1, src_len1); - } - - if (src_len2) { - dst =3D advance (dst, src_len1 << hw->info.shift); - hw->clip (dst, src2, src_len2); - } - - hw->rpos =3D pos % hw->samples; -} - static void dsound_clear_sample (HWVoiceOut *hw, LPDIRECTSOUNDBUFFER dsb, dsound *s) { @@ -350,7 +310,7 @@ static void dsound_clear_sample (HWVoiceOut *hw, LPDIRE= CTSOUNDBUFFER dsb, dsb, &hw->info, 0, - hw->samples << hw->info.shift, + hw->size_emul, &p1, &p2, &blen1, &blen2, 1, @@ -454,138 +414,51 @@ static int dsound_ctl_out (HWVoiceOut *hw, int cmd, = ...) return 0; } =20 -static int dsound_run_out (HWVoiceOut *hw, int live) +static void *dsound_get_buffer_out(HWVoiceOut *hw, size_t *size) { - int err; + DSoundVoiceOut *ds =3D (DSoundVoiceOut *) hw; + LPDIRECTSOUNDBUFFER dsb =3D ds->dsound_buffer; HRESULT hr; + DWORD ppos, act_size; + size_t req_size; + int err; + void *ret; + + hr =3D IDirectSoundBuffer_GetCurrentPosition(dsb, &ppos, NULL); + if (FAILED(hr)) { + dsound_logerr(hr, "Could not get playback buffer position\n"); + *size =3D 0; + return NULL; + } + + req_size =3D audio_ring_dist(ppos, hw->pos_emul, hw->size_emul); + req_size =3D MIN(req_size, hw->size_emul - hw->pos_emul); + + err =3D dsound_lock_out(dsb, &hw->info, hw->pos_emul, req_size, &ret, = NULL, + &act_size, NULL, false, ds->s); + if (err) { + dolog("Failed to lock buffer\n"); + *size =3D 0; + return NULL; + } + + *size =3D act_size; + return ret; +} + +static size_t dsound_put_buffer_out(HWVoiceOut *hw, void *buf, size_t len) +{ DSoundVoiceOut *ds =3D (DSoundVoiceOut *) hw; LPDIRECTSOUNDBUFFER dsb =3D ds->dsound_buffer; - int len, hwshift; - DWORD blen1, blen2; - DWORD len1, len2; - DWORD decr; - DWORD wpos, ppos, old_pos; - LPVOID p1, p2; - int bufsize; - dsound *s =3D ds->s; - AudiodevDsoundOptions *dso =3D &s->dev->u.dsound; + int err =3D dsound_unlock_out(dsb, buf, NULL, len, 0); =20 - if (!dsb) { - dolog ("Attempt to run empty with playback buffer\n"); - return 0; - } - - hwshift =3D hw->info.shift; - bufsize =3D hw->samples << hwshift; - - hr =3D IDirectSoundBuffer_GetCurrentPosition ( - dsb, - &ppos, - ds->first_time ? &wpos : NULL - ); - if (FAILED (hr)) { - dsound_logerr (hr, "Could not get playback buffer position\n"); - return 0; - } - - len =3D live << hwshift; - - if (ds->first_time) { - if (dso->latency) { - DWORD cur_blat; - - cur_blat =3D audio_ring_dist (wpos, ppos, bufsize); - ds->first_time =3D 0; - old_pos =3D wpos; - old_pos +=3D - usecs_to_bytes(&hw->info, dso->latency) - cur_blat; - old_pos %=3D bufsize; - old_pos &=3D ~hw->info.align; - } - else { - old_pos =3D wpos; - } -#ifdef DEBUG_DSOUND - ds->played =3D 0; - ds->mixed =3D 0; -#endif - } - else { - if (ds->old_pos =3D=3D ppos) { -#ifdef DEBUG_DSOUND - dolog ("old_pos =3D=3D ppos\n"); -#endif - return 0; - } - -#ifdef DEBUG_DSOUND - ds->played +=3D audio_ring_dist (ds->old_pos, ppos, hw->bufsize); -#endif - old_pos =3D ds->old_pos; - } - - if ((old_pos < ppos) && ((old_pos + len) > ppos)) { - len =3D ppos - old_pos; - } - else { - if ((old_pos > ppos) && ((old_pos + len) > (ppos + bufsize))) { - len =3D bufsize - old_pos + ppos; - } - } - - if (audio_bug(__func__, len < 0 || len > bufsize)) { - dolog ("len=3D%d bufsize=3D%d old_pos=3D%ld ppos=3D%ld\n", - len, bufsize, old_pos, ppos); - return 0; - } - - len &=3D ~hw->info.align; - if (!len) { - return 0; - } - -#ifdef DEBUG_DSOUND - ds->old_ppos =3D ppos; -#endif - err =3D dsound_lock_out ( - dsb, - &hw->info, - old_pos, - len, - &p1, &p2, - &blen1, &blen2, - 0, - s - ); if (err) { + dolog("Failed to unlock buffer!!\n"); return 0; } + hw->pos_emul =3D (hw->pos_emul + len) % hw->size_emul; =20 - len1 =3D blen1 >> hwshift; - len2 =3D blen2 >> hwshift; - decr =3D len1 + len2; - - if (p1 && len1) { - dsound_write_sample (hw, p1, len1); - } - - if (p2 && len2) { - dsound_write_sample (hw, p2, len2); - } - - dsound_unlock_out (dsb, p1, p2, blen1, blen2); - ds->old_pos =3D (old_pos + (decr << hwshift)) % bufsize; - -#ifdef DEBUG_DSOUND - ds->mixed +=3D decr << hwshift; - - dolog ("played %lu mixed %lu diff %ld sec %f\n", - ds->played, - ds->mixed, - ds->mixed - ds->played, - abs (ds->mixed - ds->played) / (double) hw->info.bytes_per_seco= nd); -#endif - return decr; + return len; } =20 static int dsound_ctl_in (HWVoiceIn *hw, int cmd, ...) @@ -640,96 +513,49 @@ static int dsound_ctl_in (HWVoiceIn *hw, int cmd, ...) return 0; } =20 -static int dsound_run_in (HWVoiceIn *hw) +static void *dsound_get_buffer_in(HWVoiceIn *hw, size_t *size) { - int err; + DSoundVoiceIn *ds =3D (DSoundVoiceIn *) hw; + LPDIRECTSOUNDCAPTUREBUFFER dscb =3D ds->dsound_capture_buffer; HRESULT hr; + DWORD cpos, act_size; + size_t req_size; + int err; + void *ret; + + hr =3D IDirectSoundCaptureBuffer_GetCurrentPosition(dscb, &cpos, NULL); + if (FAILED(hr)) { + dsound_logerr(hr, "Could not get capture buffer position\n"); + *size =3D 0; + return NULL; + } + + req_size =3D audio_ring_dist(cpos, hw->pos_emul, hw->size_emul); + req_size =3D MIN(req_size, hw->size_emul - hw->pos_emul); + + err =3D dsound_lock_in(dscb, &hw->info, hw->pos_emul, req_size, &ret, = NULL, + &act_size, NULL, false, ds->s); + if (err) { + dolog("Failed to lock buffer\n"); + *size =3D 0; + return NULL; + } + + *size =3D act_size; + return ret; +} + +static void dsound_put_buffer_in(HWVoiceIn *hw, void *buf, size_t len) +{ DSoundVoiceIn *ds =3D (DSoundVoiceIn *) hw; LPDIRECTSOUNDCAPTUREBUFFER dscb =3D ds->dsound_capture_buffer; - int live, len, dead; - DWORD blen1, blen2; - DWORD len1, len2; - DWORD decr; - DWORD cpos, rpos; - LPVOID p1, p2; - int hwshift; - dsound *s =3D ds->s; + int err =3D dsound_unlock_in(dscb, buf, NULL, len, 0); =20 - if (!dscb) { - dolog ("Attempt to run without capture buffer\n"); - return 0; - } - - hwshift =3D hw->info.shift; - - live =3D audio_pcm_hw_get_live_in (hw); - dead =3D hw->samples - live; - if (!dead) { - return 0; - } - - hr =3D IDirectSoundCaptureBuffer_GetCurrentPosition ( - dscb, - &cpos, - ds->first_time ? &rpos : NULL - ); - if (FAILED (hr)) { - dsound_logerr (hr, "Could not get capture buffer position\n"); - return 0; - } - - if (ds->first_time) { - ds->first_time =3D 0; - if (rpos & hw->info.align) { - ldebug ("warning: Misaligned capture read position %ld(%d)\n", - rpos, hw->info.align); - } - hw->wpos =3D rpos >> hwshift; - } - - if (cpos & hw->info.align) { - ldebug ("warning: Misaligned capture position %ld(%d)\n", - cpos, hw->info.align); - } - cpos >>=3D hwshift; - - len =3D audio_ring_dist (cpos, hw->wpos, hw->samples); - if (!len) { - return 0; - } - len =3D MIN (len, dead); - - err =3D dsound_lock_in ( - dscb, - &hw->info, - hw->wpos << hwshift, - len << hwshift, - &p1, - &p2, - &blen1, - &blen2, - 0, - s - ); if (err) { - return 0; + dolog("Failed to unlock buffer!!\n"); + return; } - - len1 =3D blen1 >> hwshift; - len2 =3D blen2 >> hwshift; - decr =3D len1 + len2; - - if (p1 && len1) { - hw->conv (hw->conv_buf + hw->wpos, p1, len1); - } - - if (p2 && len2) { - hw->conv (hw->conv_buf, p2, len2); - } - - dsound_unlock_in (dscb, p1, p2, blen1, blen2); - hw->wpos =3D (hw->wpos + decr) % hw->samples; - return decr; + hw->pos_emul =3D (hw->pos_emul + len) % hw->size_emul; } =20 static void dsound_audio_fini (void *opaque) @@ -845,12 +671,16 @@ static void *dsound_audio_init(Audiodev *dev) static struct audio_pcm_ops dsound_pcm_ops =3D { .init_out =3D dsound_init_out, .fini_out =3D dsound_fini_out, - .run_out =3D dsound_run_out, + .write =3D audio_generic_write, + .get_buffer_out =3D dsound_get_buffer_out, + .put_buffer_out =3D dsound_put_buffer_out, .ctl_out =3D dsound_ctl_out, =20 .init_in =3D dsound_init_in, .fini_in =3D dsound_fini_in, - .run_in =3D dsound_run_in, + .read =3D audio_generic_read, + .get_buffer_in =3D dsound_get_buffer_in, + .put_buffer_in =3D dsound_put_buffer_in, .ctl_in =3D dsound_ctl_in }; =20 --=20 2.20.1