diff -Nru alsa-utils-1.2.2/debian/changelog alsa-utils-1.2.2/debian/changelog --- alsa-utils-1.2.2/debian/changelog 2020-10-16 23:50:30.000000000 +0800 +++ alsa-utils-1.2.2/debian/changelog 2021-04-14 21:38:30.000000000 +0800 @@ -1,3 +1,11 @@ +alsa-utils (1.2.2-1ubuntu2.1) focal; urgency=medium + + * d/p/0013-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch + - aplay: try to use 16-bit format to increase capture quality + (LP: #1923841) + + -- Kai-Heng Feng Wed, 14 Apr 2021 21:38:30 +0800 + alsa-utils (1.2.2-1ubuntu2) focal; urgency=medium * d/p/0001-alsactl-init-iterate-through-all-cards-for-the-initi.patch diff -Nru alsa-utils-1.2.2/debian/patches/0020-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch alsa-utils-1.2.2/debian/patches/0020-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch --- alsa-utils-1.2.2/debian/patches/0020-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch 1970-01-01 08:00:00.000000000 +0800 +++ alsa-utils-1.2.2/debian/patches/0020-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch 2021-04-14 21:38:05.000000000 +0800 @@ -0,0 +1,183 @@ +From: Hui Wang +Date: Fri, 23 Oct 2020 16:47:10 +0800 +Subject: aplay: try to use 16-bit format to increase capture quality + +Recently users reported a bug, I tested it and found it is a common +issue on Laptop or Desktop machines. + +The issue is users plug a headset and use "arecord test.wav" to +record a sound with default input volume, the recorded sound has +poor quality and nearly can't distinguish it is the sound we want +to record. + +This is because the input volume is low and the default format is U8. +The driver records sound with 16bit, because the input volume is low, +most of samples are within (-256,+256), when converting 16bit to U8, +those samples will be 0x7f. This is called quantization noise and we +could only workaround it by increase the input volume or adding -f to +arecord. + +But users want to record a better quality sound with default input +volume (after installing a new OS, the volume is the default volume), +and they don't want to add parameters to the arecord because most of +new linux users just use "arecord test.wav". + +So this patch tries to change the default format from U8 to S16_LE/BE. +If the machine doesn't support S16_LE/BE, it still uses U8 as default +format. + +Signed-off-by: Hui Wang +Signed-off-by: Jaroslav Kysela +Signed-off-by: Kai-Heng Feng +--- + aplay/aplay.c | 43 ++++++++++++++++++++++++++++++++++--------- + 1 file changed, 34 insertions(+), 9 deletions(-) + +diff --git a/aplay/aplay.c b/aplay/aplay.c +index 08395f6..680663a 100644 +--- a/aplay/aplay.c ++++ b/aplay/aplay.c +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -94,6 +95,7 @@ enum { + VUMETER_STEREO + }; + ++static snd_pcm_format_t default_format = DEFAULT_FORMAT; + static char *command; + static snd_pcm_t *handle; + static struct { +@@ -468,6 +470,24 @@ static long parse_long(const char *str, int *err) + return val; + } + ++static void try_to_adjust_default_format_16bit(void) ++{ ++ snd_pcm_hw_params_t *params; ++ int err; ++ ++ snd_pcm_hw_params_alloca(¶ms); ++ err = snd_pcm_hw_params_any(handle, params); ++ if (err < 0) { ++ error(_("Broken configuration for this PCM: no configurations available")); ++ prg_exit(EXIT_FAILURE); ++ } ++ ++ if (file_type != FORMAT_AU && snd_pcm_hw_params_test_format(handle, params, SND_PCM_FORMAT_S16_LE) == 0) ++ rhwparams.format = default_format = SND_PCM_FORMAT_S16_LE; ++ else if (file_type == FORMAT_AU && snd_pcm_hw_params_test_format(handle, params, SND_PCM_FORMAT_S16_BE) == 0) ++ rhwparams.format = default_format = SND_PCM_FORMAT_S16_BE; ++} ++ + int main(int argc, char *argv[]) + { + int duration_or_sample = 0; +@@ -528,6 +548,7 @@ int main(int argc, char *argv[]) + int do_device_list = 0, do_pcm_list = 0; + snd_pcm_info_t *info; + FILE *direction; ++ bool user_set_fmt = false; + + #ifdef ENABLE_NLS + setlocale(LC_ALL, ""); +@@ -562,7 +583,7 @@ int main(int argc, char *argv[]) + } + + chunk_size = -1; +- rhwparams.format = DEFAULT_FORMAT; ++ rhwparams.format = default_format; + rhwparams.rate = DEFAULT_SPEED; + rhwparams.channels = 1; + +@@ -612,6 +633,7 @@ int main(int argc, char *argv[]) + } + break; + case 'f': ++ user_set_fmt = true; + if (strcasecmp(optarg, "cd") == 0 || strcasecmp(optarg, "cdr") == 0) { + if (strcasecmp(optarg, "cdr") == 0) + rhwparams.format = SND_PCM_FORMAT_S16_BE; +@@ -844,6 +866,9 @@ int main(int argc, char *argv[]) + } + } + ++ if (!user_set_fmt) ++ try_to_adjust_default_format_16bit(); ++ + chunk_size = 1024; + hwparams = rhwparams; + +@@ -1064,7 +1089,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size) + hwparams.channels = channels; + switch (TO_CPU_SHORT(f->bit_p_spl, big_endian)) { + case 8: +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != SND_PCM_FORMAT_U8) + fprintf(stderr, _("Warning: format is changed to U8\n")); + hwparams.format = SND_PCM_FORMAT_U8; +@@ -1074,7 +1099,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size) + native_format = SND_PCM_FORMAT_S16_BE; + else + native_format = SND_PCM_FORMAT_S16_LE; +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != native_format) + fprintf(stderr, _("Warning: format is changed to %s\n"), + snd_pcm_format_name(native_format)); +@@ -1087,7 +1112,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size) + native_format = SND_PCM_FORMAT_S24_3BE; + else + native_format = SND_PCM_FORMAT_S24_3LE; +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != native_format) + fprintf(stderr, _("Warning: format is changed to %s\n"), + snd_pcm_format_name(native_format)); +@@ -1098,7 +1123,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size) + native_format = SND_PCM_FORMAT_S24_BE; + else + native_format = SND_PCM_FORMAT_S24_LE; +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != native_format) + fprintf(stderr, _("Warning: format is changed to %s\n"), + snd_pcm_format_name(native_format)); +@@ -1184,19 +1209,19 @@ static int test_au(int fd, void *buffer) + pbrec_count = BE_INT(ap->data_size); + switch (BE_INT(ap->encoding)) { + case AU_FMT_ULAW: +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != SND_PCM_FORMAT_MU_LAW) + fprintf(stderr, _("Warning: format is changed to MU_LAW\n")); + hwparams.format = SND_PCM_FORMAT_MU_LAW; + break; + case AU_FMT_LIN8: +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != SND_PCM_FORMAT_U8) + fprintf(stderr, _("Warning: format is changed to U8\n")); + hwparams.format = SND_PCM_FORMAT_U8; + break; + case AU_FMT_LIN16: +- if (hwparams.format != DEFAULT_FORMAT && ++ if (hwparams.format != default_format && + hwparams.format != SND_PCM_FORMAT_S16_BE) + fprintf(stderr, _("Warning: format is changed to S16_BE\n")); + hwparams.format = SND_PCM_FORMAT_S16_BE; +@@ -2312,7 +2337,7 @@ static void voc_play(int fd, int ofs, char *name) + prg_exit(EXIT_FAILURE); + } + } +- hwparams.format = DEFAULT_FORMAT; ++ hwparams.format = default_format; + hwparams.channels = 1; + hwparams.rate = DEFAULT_SPEED; + set_params(); diff -Nru alsa-utils-1.2.2/debian/patches/series alsa-utils-1.2.2/debian/patches/series --- alsa-utils-1.2.2/debian/patches/series 2020-10-16 23:33:50.000000000 +0800 +++ alsa-utils-1.2.2/debian/patches/series 2021-04-14 21:38:05.000000000 +0800 @@ -9,7 +9,6 @@ add_extra_volume_defaults.patch vmware_audio_volume.patch create_run_alsa.patch - 0001-alsactl-init-iterate-through-all-cards-for-the-initi.patch 0002-alsactl-add-initial-support-for-UCM-init.patch 0003-alsactl-redirect-alsa-lib-errors.patch @@ -18,3 +17,4 @@ 0006-alsactl-allow-to-compile-alsactl-without-UCM-support.patch 0007-alsactl-ucm-rename-_once-command-to-_boot-command.patch 0008-alsaucm-remove-custom-rules-alsactl-is-UCM-aware-now.patch +0020-aplay-try-to-use-16-bit-format-to-increase-capture-q.patch