From nobody Fri Nov 7 04:03:41 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 1545599499575732.3091372394997; Sun, 23 Dec 2018 13:11:39 -0800 (PST) Received: from localhost ([127.0.0.1]:59796 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gbB2A-00069A-1B for importer@patchew.org; Sun, 23 Dec 2018 16:11:38 -0500 Received: from eggs.gnu.org ([208.118.235.92]:52603) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gbAkE-0008MG-Ex for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:53:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gbAkC-0003PU-63 for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:53:06 -0500 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:33259) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gbAkB-0003M8-Rs for qemu-devel@nongnu.org; Sun, 23 Dec 2018 15:53:04 -0500 Received: by mail-wm1-x343.google.com with SMTP id r24so18059798wmh.0 for ; Sun, 23 Dec 2018 12:53:03 -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.53.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Dec 2018 12:53:01 -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=eyLEnplvO2/pftGdi2Ftp47TkqsnFw2IOMQgeNX63ps=; b=VkbD/2D9PPDALHiZk/5KQBPTiT7ONqCybCQvKKWOSCb0dj3TMVEhq+g16Rei7lxi57 0hQSNHTNM+RkA3av8m86uccV2TOa248SFgPiQNviYnTLx3TF1z6u2A2uWGYesu1YIaok 9rR+OcQ6jk0xDDALEtTRYokoNmVr6+VWfslwrgnpE7ESv3iJpuqLsKNDCoKuXLa6geU0 qpMzn4VJzlQuxoZqxIXM9WtAARVFYfNZWADzWxH/MGT6UGQPf2/mQwS9DuiF7ZGa59/c ssvQI1NsSz6ii5SQ8DjQSnnOUMeCyEfu/wrFjrkqL1nnjIfsmeT2LKD8BqvUQSWmORnD YTrQ== 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=eyLEnplvO2/pftGdi2Ftp47TkqsnFw2IOMQgeNX63ps=; b=KBq/Vj138f+XQpCaJK3YQWRV41dz0M6hy8Oe6rFtQXsFMY6HPHwZ6Z2zfxGbDvne9O W77cfQbxOaV0TJP/6QQ0HPMbq/nMFAiElhZbNGsshdXQpyf/C+bG5h2AmEQ3CM8lfUTc Gvsq/Abbtf84E1ahc9BA9NAiYvyBCMTldhs4ygEcwyBAEGqdb/BAZsG216hR25LJdjfd XZ7OmXC6g56Dal83PkwydHkkXgYEZaFQ1jc0x+hUFOUZ3rrQpWiXtAQorwCGXrztsZbb OBi3EC90GL0KorG5iU6Svx31VVxf4Hto9iV3Ys0rVoQIYnMZt0upwl3jPtH48f3v73iP 4+6w== X-Gm-Message-State: AA+aEWaRc5hZ+uyTKhc3SeIXlADYTSxgKEyw7lXYnKthhHZ1tNaWoCch GyLaIkWnDzx09yE/h7uOxGVMyXrHmvg= X-Google-Smtp-Source: AFSGD/U1KXoByPandIb6QnwwhgXuD8wbbFuVr3uYmB6EP/M2D6eipIVwTxXyuOLExeDKWWgiRdZ+Ig== X-Received: by 2002:a1c:e1d5:: with SMTP id y204mr9942715wmg.65.1545598382256; Sun, 23 Dec 2018 12:53:02 -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:16 +0100 Message-Id: <3fa7d671ea0bf769c6c7c1d30bb7031f6031eb2f.1545598229.git.DirtY.iCE.hu@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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::343 Subject: [Qemu-devel] [PATCH v2 40/52] audio: remove hw->samples, buffer_size_in/out pcm_ops 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) This patch removes the samples member from HWVoiceIn and HWVoiceOut. Backends can specify buffer size via the newly added buffer_size_in and buffer_size_out functions in audio_pcm_ops. They are optional, if not defined qemu will fall back to some built-in constant. Signed-off-by: K=C5=91v=C3=A1g=C3=B3, Zolt=C3=A1n --- Not sure if this is necessary. At first it seemed like a good idea to have a function so that backends can compute the size on demand when needed and things like that, but currently it's just a burden. The only good feature is that it allows a backend to not define a function and let the audio subsystem choose a default value, but the same could be achieved by specifying that hw->samples =3D 0 means use a default value. So if you guys agree, I'll remove this patch. Maybe add an -audiodev parameter to change it, overriding whatever the backends supplies. --- audio/alsaaudio.c | 20 ++++++++++++++++++-- audio/audio.c | 2 -- audio/audio_int.h | 5 +++-- audio/audio_template.h | 24 +++++++++++++++--------- audio/coreaudio.c | 10 +++++++++- audio/dsound_template.h | 8 +++++++- audio/dsoundaudio.c | 4 ++++ audio/noaudio.c | 2 -- audio/ossaudio.c | 22 +++++++++++++++++++--- audio/paaudio.c | 21 +++++++++++++++++---- audio/sdlaudio.c | 10 +++++++++- audio/spiceaudio.c | 14 ++++++++++++-- audio/wavaudio.c | 1 - 13 files changed, 113 insertions(+), 30 deletions(-) diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 56271b1174..672803e5c2 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -45,6 +45,7 @@ struct pollhlp { typedef struct ALSAVoiceOut { HWVoiceOut hw; snd_pcm_t *handle; + size_t samples; struct pollhlp pollhlp; Audiodev *dev; } ALSAVoiceOut; @@ -52,6 +53,7 @@ typedef struct ALSAVoiceOut { typedef struct ALSAVoiceIn { HWVoiceIn hw; snd_pcm_t *handle; + size_t samples; struct pollhlp pollhlp; Audiodev *dev; } ALSAVoiceIn; @@ -696,7 +698,7 @@ static int alsa_init_out(HWVoiceOut *hw, struct audsett= ings *as, obt_as.endianness =3D obt.endianness; =20 audio_pcm_init_info (&hw->info, &obt_as); - hw->samples =3D obt.samples; + alsa->samples =3D obt.samples; =20 alsa->pollhlp.s =3D hw->s; alsa->handle =3D handle; @@ -704,6 +706,12 @@ static int alsa_init_out(HWVoiceOut *hw, struct audset= tings *as, return 0; } =20 +static size_t alsa_buffer_size_out(HWVoiceOut *hw) +{ + ALSAVoiceOut *alsa =3D (ALSAVoiceOut *) hw; + return alsa->samples; +} + #define VOICE_CTL_PAUSE 0 #define VOICE_CTL_PREPARE 1 #define VOICE_CTL_START 2 @@ -790,7 +798,7 @@ static int alsa_init_in(HWVoiceIn *hw, struct audsettin= gs *as, void *drv_opaque) obt_as.endianness =3D obt.endianness; =20 audio_pcm_init_info (&hw->info, &obt_as); - hw->samples =3D obt.samples; + alsa->samples =3D obt.samples; =20 alsa->pollhlp.s =3D hw->s; alsa->handle =3D handle; @@ -798,6 +806,12 @@ static int alsa_init_in(HWVoiceIn *hw, struct audsetti= ngs *as, void *drv_opaque) return 0; } =20 +static size_t alsa_buffer_size_in(HWVoiceIn *hw) +{ + ALSAVoiceIn *alsa =3D (ALSAVoiceIn *) hw; + return alsa->samples; +} + static void alsa_fini_in (HWVoiceIn *hw) { ALSAVoiceIn *alsa =3D (ALSAVoiceIn *) hw; @@ -915,11 +929,13 @@ static void alsa_audio_fini (void *opaque) static struct audio_pcm_ops alsa_pcm_ops =3D { .init_out =3D alsa_init_out, .fini_out =3D alsa_fini_out, + .buffer_size_out =3D alsa_buffer_size_out, .write =3D alsa_write, .ctl_out =3D alsa_ctl_out, =20 .init_in =3D alsa_init_in, .fini_in =3D alsa_fini_in, + .buffer_size_in =3D alsa_buffer_size_in, .read =3D alsa_read, .ctl_in =3D alsa_ctl_in, }; diff --git a/audio/audio.c b/audio/audio.c index f195d8eb95..7db183b357 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -1742,8 +1742,6 @@ CaptureVoiceOut *AUD_add_capture( QLIST_INIT (&hw->sw_head); QLIST_INIT (&cap->cb_head); =20 - /* XXX find a more elegant way */ - hw->samples =3D 4096 * 4; audio_pcm_hw_alloc_resources_out(hw); =20 audio_pcm_init_info (&hw->info, as); diff --git a/audio/audio_int.h b/audio/audio_int.h index a5add3c2b8..598038d999 100644 --- a/audio/audio_int.h +++ b/audio/audio_int.h @@ -70,7 +70,6 @@ typedef struct HWVoiceOut { void *buf_emul; size_t pos_emul, pending_emul, size_emul; =20 - size_t samples; QLIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head; QLIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head; int ctl_caps; @@ -93,7 +92,6 @@ typedef struct HWVoiceIn { void *buf_emul; size_t pos_emul, pending_emul, size_emul; =20 - size_t samples; QLIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head; int ctl_caps; struct audio_pcm_ops *pcm_ops; @@ -155,6 +153,8 @@ struct audio_pcm_ops { int (*init_out)(HWVoiceOut *hw, audsettings *as, void *drv_opaque); void (*fini_out)(HWVoiceOut *hw); size_t (*write) (HWVoiceOut *hw, void *buf, size_t size); + /* get the optimal buffer size in samples; optional */ + size_t (*buffer_size_out)(HWVoiceOut *hw); /* * get a buffer that after later can be passed to put_buffer_out; opti= onal * returns the buffer, and writes it's size to size (in bytes) @@ -172,6 +172,7 @@ struct audio_pcm_ops { int (*init_in) (HWVoiceIn *hw, audsettings *as, void *drv_opaque); void (*fini_in) (HWVoiceIn *hw); size_t (*read) (HWVoiceIn *hw, void *buf, size_t size); + size_t (*buffer_size_in)(HWVoiceIn *hw); void *(*get_buffer_in)(HWVoiceIn *hw, size_t *size); void (*put_buffer_in)(HWVoiceIn *hw, void *buf, size_t size); int (*ctl_in) (HWVoiceIn *hw, int cmd, ...); diff --git a/audio/audio_template.h b/audio/audio_template.h index 83ffc62183..07ce9ce51f 100644 --- a/audio/audio_template.h +++ b/audio/audio_template.h @@ -78,7 +78,20 @@ static void glue (audio_pcm_hw_free_resources_, TYPE) (H= W *hw) =20 static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw) { - size_t samples =3D hw->samples; + size_t samples; + if (!hw->pcm_ops) { + /* + * We should only end up here when using wavcapture hmp command (a= nd not + * the wavcapture audio backend). + * It needs a lot of samples, otherwise you'll end up with "Could = not + * mix X bytes into a capture buffer" warnings and a garbled captu= re. + */ + samples =3D 4096 * 4; + } else if (hw->pcm_ops->glue(buffer_size_, TYPE)) { + samples =3D hw->pcm_ops->glue(buffer_size_, TYPE)(hw); + } else { + samples =3D 1024; /* todo better default */ + } if (audio_bug(__func__, samples =3D=3D 0)) { dolog("Attempted to allocate empty buffer\n"); } @@ -264,11 +277,6 @@ static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioStat= e *s, goto err0; } =20 - if (audio_bug(__func__, hw->samples <=3D 0)) { - dolog("hw->samples=3D%zd\n", hw->samples); - goto err1; - } - #ifdef DAC hw->clip =3D mixeng_clip #else @@ -288,9 +296,7 @@ static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioState= *s, #endif return hw; =20 - err1: - glue (hw->pcm_ops->fini_, TYPE) (hw); - err0: +err0: g_free (hw); return NULL; } diff --git a/audio/coreaudio.c b/audio/coreaudio.c index a532e862dd..f4210d5784 100644 --- a/audio/coreaudio.c +++ b/audio/coreaudio.c @@ -43,6 +43,7 @@ typedef struct coreaudioVoiceOut { UInt32 audioDevicePropertyBufferFrameSize; AudioStreamBasicDescription outputStreamBasicDescription; AudioDeviceIOProcID ioprocid; + size_t samples; } coreaudioVoiceOut; =20 #if MAC_OS_X_VERSION_MAX_ALLOWED >=3D MAC_OS_X_VERSION_10_6 @@ -557,7 +558,7 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct au= dsettings *as, "Could not get device buffer frame size\n"); return -1; } - hw->samples =3D (pdo->has_buffer_count ? pdo->buffer_count : 4) * + core->samples =3D (pdo->has_buffer_count ? pdo->buffer_count : 4) * core->audioDevicePropertyBufferFrameSize; =20 /* get StreamFormat */ @@ -617,6 +618,12 @@ static int coreaudio_init_out(HWVoiceOut *hw, struct a= udsettings *as, return 0; } =20 +static size_t coreaudio_buffer_size_out(HWVoiceOut *hw) +{ + coreaudioVoiceOut *core =3D (coreaudioVoiceOut *) hw; + return core->samples; +} + static void coreaudio_fini_out (HWVoiceOut *hw) { OSStatus status; @@ -693,6 +700,7 @@ static struct audio_pcm_ops coreaudio_pcm_ops =3D { .init_out =3D coreaudio_init_out, .fini_out =3D coreaudio_fini_out, .write =3D coreaudio_write, + .buffer_size_out =3D coreaudio_buffer_size_out, .get_buffer_out =3D coreaudio_get_buffer_out, .put_buffer_out =3D coreaudio_put_buffer_out_nowrite, .ctl_out =3D coreaudio_ctl_out diff --git a/audio/dsound_template.h b/audio/dsound_template.h index ff5a1f85fd..6a10b6751b 100644 --- a/audio/dsound_template.h +++ b/audio/dsound_template.h @@ -254,7 +254,7 @@ static int dsound_init_out(HWVoiceOut *hw, struct audse= ttings *as, ); } hw->size_emul =3D bc.dwBufferBytes; - hw->samples =3D bc.dwBufferBytes >> hw->info.shift; + ds->samples =3D bc.dwBufferBytes >> hw->info.shift; ds->s =3D s; =20 #ifdef DEBUG_DSOUND @@ -268,6 +268,12 @@ static int dsound_init_out(HWVoiceOut *hw, struct auds= ettings *as, return -1; } =20 +static size_t glue(dsound_buffer_size_, TYPE)(HWVOICE *hw) +{ + DSOUNDVOICE *ds =3D (DSOUNDVOICE *) hw; + return ds->samples; +} + #undef NAME #undef NAME2 #undef TYPE diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c index 7b3266aaf3..be6b8d8889 100644 --- a/audio/dsoundaudio.c +++ b/audio/dsoundaudio.c @@ -54,12 +54,14 @@ typedef struct { HWVoiceOut hw; LPDIRECTSOUNDBUFFER dsound_buffer; dsound *s; + size_t samples; } DSoundVoiceOut; =20 typedef struct { HWVoiceIn hw; LPDIRECTSOUNDCAPTUREBUFFER dsound_capture_buffer; dsound *s; + size_t samples; } DSoundVoiceIn; =20 static void dsound_log_hresult (HRESULT hr) @@ -672,6 +674,7 @@ static struct audio_pcm_ops dsound_pcm_ops =3D { .init_out =3D dsound_init_out, .fini_out =3D dsound_fini_out, .write =3D audio_generic_write, + .buffer_size_out =3D dsound_buffer_size_out, .get_buffer_out =3D dsound_get_buffer_out, .put_buffer_out =3D dsound_put_buffer_out, .ctl_out =3D dsound_ctl_out, @@ -679,6 +682,7 @@ static struct audio_pcm_ops dsound_pcm_ops =3D { .init_in =3D dsound_init_in, .fini_in =3D dsound_fini_in, .read =3D audio_generic_read, + .buffer_size_in =3D dsound_buffer_size_in, .get_buffer_in =3D dsound_get_buffer_in, .put_buffer_in =3D dsound_put_buffer_in, .ctl_in =3D dsound_ctl_in diff --git a/audio/noaudio.c b/audio/noaudio.c index 6a3a1c418b..9b1dfb551d 100644 --- a/audio/noaudio.c +++ b/audio/noaudio.c @@ -58,7 +58,6 @@ static size_t no_write(HWVoiceOut *hw, void *buf, size_t = len) static int no_init_out(HWVoiceOut *hw, struct audsettings *as, void *drv_o= paque) { audio_pcm_init_info (&hw->info, as); - hw->samples =3D 1024; return 0; } =20 @@ -77,7 +76,6 @@ static int no_ctl_out (HWVoiceOut *hw, int cmd, ...) static int no_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_opa= que) { audio_pcm_init_info (&hw->info, as); - hw->samples =3D 1024; return 0; } =20 diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 08fe047f91..bc34e12de4 100644 --- a/audio/ossaudio.c +++ b/audio/ossaudio.c @@ -44,6 +44,7 @@ typedef struct OSSVoiceOut { int nfrags; int fragsize; int mmapped; + size_t samples; Audiodev *dev; } OSSVoiceOut; =20 @@ -52,6 +53,7 @@ typedef struct OSSVoiceIn { int fd; int nfrags; int fragsize; + size_t samples; Audiodev *dev; } OSSVoiceIn; =20 @@ -511,11 +513,11 @@ static int oss_init_out(HWVoiceOut *hw, struct audset= tings *as, obt.nfrags * obt.fragsize, hw->info.align + 1); } =20 - hw->samples =3D (obt.nfrags * obt.fragsize) >> hw->info.shift; + oss->samples =3D (obt.nfrags * obt.fragsize) >> hw->info.shift; =20 oss->mmapped =3D 0; if (oopts->has_try_mmap && oopts->try_mmap) { - hw->size_emul =3D hw->samples << hw->info.shift; + hw->size_emul =3D oss->samples << hw->info.shift; hw->buf_emul =3D mmap ( NULL, hw->size_emul, @@ -563,6 +565,12 @@ static int oss_init_out(HWVoiceOut *hw, struct audsett= ings *as, return 0; } =20 +static size_t oss_buffer_size_out(HWVoiceOut *hw) +{ + OSSVoiceOut *oss =3D (OSSVoiceOut *) hw; + return oss->samples; +} + static int oss_ctl_out (HWVoiceOut *hw, int cmd, ...) { int trig; @@ -658,13 +666,19 @@ static int oss_init_in(HWVoiceIn *hw, struct audsetti= ngs *as, void *drv_opaque) obt.nfrags * obt.fragsize, hw->info.align + 1); } =20 - hw->samples =3D (obt.nfrags * obt.fragsize) >> hw->info.shift; + oss->samples =3D (obt.nfrags * obt.fragsize) >> hw->info.shift; =20 oss->fd =3D fd; oss->dev =3D dev; return 0; } =20 +static size_t oss_buffer_size_in(HWVoiceIn *hw) +{ + OSSVoiceIn *oss =3D (OSSVoiceIn *) hw; + return oss->samples; +} + static void oss_fini_in (HWVoiceIn *hw) { OSSVoiceIn *oss =3D (OSSVoiceIn *) hw; @@ -753,6 +767,7 @@ static struct audio_pcm_ops oss_pcm_ops =3D { .init_out =3D oss_init_out, .fini_out =3D oss_fini_out, .write =3D oss_write, + .buffer_size_out =3D oss_buffer_size_out, .get_buffer_out =3D oss_get_buffer_out, .put_buffer_out =3D oss_put_buffer_out, .ctl_out =3D oss_ctl_out, @@ -760,6 +775,7 @@ static struct audio_pcm_ops oss_pcm_ops =3D { .init_in =3D oss_init_in, .fini_in =3D oss_fini_in, .read =3D oss_read, + .buffer_size_in =3D oss_buffer_size_in, .ctl_in =3D oss_ctl_in }; =20 diff --git a/audio/paaudio.c b/audio/paaudio.c index 392225c875..7cab3cff97 100644 --- a/audio/paaudio.c +++ b/audio/paaudio.c @@ -355,8 +355,7 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsetti= ngs *as, } =20 audio_pcm_init_info (&hw->info, &obt_as); - hw->samples =3D pa->samples =3D audio_buffer_samples(g->dev->out, &obt= _as, - 46440); + pa->samples =3D audio_buffer_samples(g->dev->out, &obt_as, 46440); =20 return 0; =20 @@ -364,6 +363,13 @@ static int qpa_init_out(HWVoiceOut *hw, struct audsett= ings *as, return -1; } =20 +static size_t qpa_buffer_size_out(HWVoiceOut *hw) +{ + PAVoiceOut *pa =3D (PAVoiceOut *) hw; + return pa->samples; +} + + static int qpa_init_in(HWVoiceIn *hw, struct audsettings *as, void *drv_op= aque) { int error; @@ -397,8 +403,7 @@ static int qpa_init_in(HWVoiceIn *hw, struct audsetting= s *as, void *drv_opaque) } =20 audio_pcm_init_info (&hw->info, &obt_as); - hw->samples =3D pa->samples =3D audio_buffer_samples(g->dev->in, &obt_= as, - 46440); + pa->samples =3D audio_buffer_samples(g->dev->in, &obt_as, 46440); =20 return 0; =20 @@ -406,6 +411,12 @@ static int qpa_init_in(HWVoiceIn *hw, struct audsettin= gs *as, void *drv_opaque) return -1; } =20 +static size_t qpa_buffer_size_in(HWVoiceIn *hw) +{ + PAVoiceIn *pa =3D (PAVoiceIn *) hw; + return pa->samples; +} + static void qpa_simple_disconnect(PAConnection *c, pa_stream *stream) { int err; @@ -683,11 +694,13 @@ static struct audio_pcm_ops qpa_pcm_ops =3D { .init_out =3D qpa_init_out, .fini_out =3D qpa_fini_out, .write =3D qpa_write, + .buffer_size_out =3D qpa_buffer_size_out, .ctl_out =3D qpa_ctl_out, =20 .init_in =3D qpa_init_in, .fini_in =3D qpa_fini_in, .read =3D qpa_read, + .buffer_size_in =3D qpa_buffer_size_in, .ctl_in =3D qpa_ctl_in }; =20 diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c index 685cbc83b8..4df35ce31a 100644 --- a/audio/sdlaudio.c +++ b/audio/sdlaudio.c @@ -42,6 +42,7 @@ =20 typedef struct SDLVoiceOut { HWVoiceOut hw; + size_t samples; } SDLVoiceOut; =20 static struct SDLAudioState { @@ -363,7 +364,7 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsetti= ngs *as, obt_as.endianness =3D endianness; =20 audio_pcm_init_info (&hw->info, &obt_as); - hw->samples =3D obt.samples; + sdl->samples =3D obt.samples; =20 s->initialized =3D 1; s->exit =3D 0; @@ -371,6 +372,12 @@ static int sdl_init_out(HWVoiceOut *hw, struct audsett= ings *as, return 0; } =20 +static size_t sdl_buffer_size_out(HWVoiceOut *hw) +{ + SDLVoiceOut *sdl =3D (SDLVoiceOut *) hw; + return sdl->samples; +} + static int sdl_ctl_out (HWVoiceOut *hw, int cmd, ...) { (void) hw; @@ -439,6 +446,7 @@ static struct audio_pcm_ops sdl_pcm_ops =3D { .init_out =3D sdl_init_out, .fini_out =3D sdl_fini_out, .write =3D sdl_write, + .buffer_size_out =3D sdl_buffer_size_out, .get_buffer_out =3D sdl_get_buffer_out, .put_buffer_out =3D sdl_put_buffer_out_nowrite, .ctl_out =3D sdl_ctl_out, diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index d1605d3939..709245e453 100644 --- a/audio/spiceaudio.c +++ b/audio/spiceaudio.c @@ -133,7 +133,6 @@ static int line_out_init(HWVoiceOut *hw, struct audsett= ings *as, settings.endianness =3D AUDIO_HOST_ENDIANNESS; =20 audio_pcm_init_info (&hw->info, &settings); - hw->samples =3D LINE_OUT_SAMPLES; out->active =3D 0; =20 out->sin.base.sif =3D &playback_sif.base; @@ -144,6 +143,11 @@ static int line_out_init(HWVoiceOut *hw, struct audset= tings *as, return 0; } =20 +static size_t line_out_buffer_size(HWVoiceOut *hw) +{ + return LINE_OUT_SAMPLES; +} + static void line_out_fini (HWVoiceOut *hw) { SpiceVoiceOut *out =3D container_of (hw, SpiceVoiceOut, hw); @@ -248,7 +252,6 @@ static int line_in_init(HWVoiceIn *hw, struct audsettin= gs *as, void *drv_opaque) settings.endianness =3D AUDIO_HOST_ENDIANNESS; =20 audio_pcm_init_info (&hw->info, &settings); - hw->samples =3D LINE_IN_SAMPLES; in->active =3D 0; =20 in->sin.base.sif =3D &record_sif.base; @@ -259,6 +262,11 @@ static int line_in_init(HWVoiceIn *hw, struct audsetti= ngs *as, void *drv_opaque) return 0; } =20 +static size_t line_in_buffer_size(HWVoiceIn *hw) +{ + return LINE_IN_SAMPLES; +} + static void line_in_fini (HWVoiceIn *hw) { SpiceVoiceIn *in =3D container_of (hw, SpiceVoiceIn, hw); @@ -329,6 +337,7 @@ static struct audio_pcm_ops audio_callbacks =3D { .init_out =3D line_out_init, .fini_out =3D line_out_fini, .write =3D audio_generic_write, + .buffer_size_out =3D line_out_buffer_size, .get_buffer_out =3D line_out_get_buffer, .put_buffer_out =3D line_out_put_buffer, .ctl_out =3D line_out_ctl, @@ -336,6 +345,7 @@ static struct audio_pcm_ops audio_callbacks =3D { .init_in =3D line_in_init, .fini_in =3D line_in_fini, .read =3D line_in_read, + .buffer_size_in =3D line_in_buffer_size, .ctl_in =3D line_in_ctl, }; =20 diff --git a/audio/wavaudio.c b/audio/wavaudio.c index 31db03aadb..0a0e76d2d9 100644 --- a/audio/wavaudio.c +++ b/audio/wavaudio.c @@ -110,7 +110,6 @@ static int wav_init_out(HWVoiceOut *hw, struct audsetti= ngs *as, wav_as.endianness =3D 0; audio_pcm_init_info (&hw->info, &wav_as); =20 - hw->samples =3D 1024; le_store (hdr + 22, hw->info.nchannels, 2); le_store (hdr + 24, hw->info.freq, 4); le_store (hdr + 28, hw->info.freq << (bits16 + stereo), 4); --=20 2.20.1