Blob Blame Raw
From 116488e5f2f1b897084bd151381ee254e1cc177d Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Fri, 18 Jan 2019 09:24:12 +0100
Subject: [PATCH 01/20] alsamixer: define _GNU_SOURCE to get exp10

Fixes Master, Headphones and Speaker stuck at -8 percentage after
building with Clang 7.0.1 and getting warned about implicit declaration
of exp10, which is behind _GNU_SOURCE as a non-standard feature. Thanks
Takashi Iwai for the CFLAGS suggestion on the mailing list. GCC build is
not affected, so not adding a compiler check to the configure script.

uClibc-ng has got exp10 since 1.0.12, so the fallback macro is no longer
needed. However, alsa-utils relies on gettext so might need further
patches to actually work on uClibc systems.

Signed-off-by: makepost <makepost@firemail.cc>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 alsamixer/Makefile.am      | 2 +-
 alsamixer/volume_mapping.c | 5 -----
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/alsamixer/Makefile.am b/alsamixer/Makefile.am
index 259b29e..249e8f8 100644
--- a/alsamixer/Makefile.am
+++ b/alsamixer/Makefile.am
@@ -1,4 +1,4 @@
-AM_CFLAGS = @CURSES_CFLAGS@ -DCURSESINC="@CURSESINC@"
+AM_CFLAGS = -D_GNU_SOURCE @CURSES_CFLAGS@ -DCURSESINC="@CURSESINC@"
 LDADD = @CURSESLIB@
 
 bin_PROGRAMS = alsamixer
diff --git a/alsamixer/volume_mapping.c b/alsamixer/volume_mapping.c
index 94bd0fe..48cfbe2 100644
--- a/alsamixer/volume_mapping.c
+++ b/alsamixer/volume_mapping.c
@@ -36,11 +36,6 @@
 #include <stdbool.h>
 #include "volume_mapping.h"
 
-#ifdef __UCLIBC__
-/* 10^x = 10^(log e^x) = (e^x)^log10 = e^(x * log 10) */
-#define exp10(x) (exp((x) * log(10)))
-#endif /* __UCLIBC__ */
-
 #define MAX_LINEAR_DB_SCALE	24
 
 static inline bool use_linear_dB_scale(long dBmin, long dBmax)
-- 
2.20.1


From 83bce86c26be6c04bcef584fbe00f320b3582c92 Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 14:27:11 +0900
Subject: [PATCH 02/20] axfer: add a section about unit test

Two unit tests are available to check internal implementation of axfer.
They perform file I/O for many times and take much time to finish.

This commit adds a section about it.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 16 ++++++++++++++++
 axfer/axfer.1          |  7 +++++++
 2 files changed, 23 insertions(+)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index 4ff6082..02e5b4c 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -971,6 +971,22 @@ some scenarios below, no copying occurs between modules.
  - xfer(mmap/interleaved), mapper(single), container(any)
  - xfer(mmap/non\-interleaved), mapper(multiple), containers(any)
 
+.SS Unit test
+
+For each of the
+.I mapper
+and
+.I container
+module, unit test is available. To run the tests, execute below command:
+
+.nf
+$ make test
+.fi
+
+Each test iterates writing to file and reading to the file for many times and it
+takes long time to finish. Please take care of the execution time if running on
+any CI environment.
+
 .SH SEE ALSO
 \fB
 axfer(1),
diff --git a/axfer/axfer.1 b/axfer/axfer.1
index bfcd15d..3ae9c8e 100644
--- a/axfer/axfer.1
+++ b/axfer/axfer.1
@@ -75,6 +75,13 @@ Operates for playback transmission.
 .I EXIT_FAILURE
 (1).
 
+.SH UNIT TEST
+
+This program has unit tests for internal implementation. Please refer to the
+manual of
+.I axfer-transfer
+for details.
+
 .SH COMPATIBILITY TO APLAY
 
 The
-- 
2.20.1


From b6142611c68a380644ce34f885e2d67da084b538 Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 14:39:18 +0900
Subject: [PATCH 03/20] axfer: fulfill section for backward compatibitity for
 chmap option

At present, axfer losts backward compatibility to aplay in a point of
'chmap' option.

This commit filfills a section to describe lose of backward compatibility
of chmap option.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index 02e5b4c..1fdfc91 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -872,6 +872,15 @@ according to pushed enter key. However, this feature requires an additional
 input handling in main loop and leave bothersome operation to maintain PCM
 substream.
 
+.TP
+.I \-m, \-\-chmap=CH1,CH2,...
+ALSA PCM core and control core doesn't support this feature, therefore
+remapping should be done in userspace. This brings overhead to align audio
+data frames, especially for mmap operation. Furthermore, as of alsa-lib v1.1.8,
+some plugins don't support this feature expectedly, thus this option is a lack
+of transparent operation. At present, this option is not supported yet not to
+confuse users.
+
 .TP
 .I SIGTSTP, SIGCONT
 This performs suspend/resume of PCM substream. In aplay(1) implementation,
-- 
2.20.1


From 827ed7d1933ee9a0ce052d9eb2c0b1c79770dff2 Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 14:48:33 +0900
Subject: [PATCH 04/20] axfer: correct description about snoop mode of libffado

The libffado library can listen to isochronous channels to which unit on
IEEE 1394 bus transfers packets as long as the unit allows software to
read the channel from its register.

This commit corrects description about snoop mode.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index 1fdfc91..89df3cc 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -560,8 +560,9 @@ audio data frame.
 .B \-\-snoop
 
 This option allows this program to run snoop mode. In this mode, libffado
-listens all isochronous channels. When isochronous communication starts
-by any unit on the same bus, the packets can be handled by this program.
+listens isochronous channels to which device transfers isochronous packet. When
+isochronous communication starts by any unit on the same bus, the packets can
+be handled by this program.
 
 .TP
 .B \-\-sched\-priority
-- 
2.20.1


From 1848b38ca94a52e4539e27526b2c028aa487053b Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 14:49:43 +0900
Subject: [PATCH 05/20] axfer: correct message to notice that help text is
 implemented

Now help message is available to give help option to command line.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index 89df3cc..d631f72 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -100,7 +100,7 @@ is not allowed except for paths listed below:
 
 .TP
 .B \-h, \-\-help
-Print help messages and finish run time. Not yet implemented.
+Print help messages and finish run time.
 
 .TP
 .B \-q, \-\-quiet
-- 
2.20.1


From fb038252d49b31e77f56a9c62527bb108cc965ad Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Tue, 15 Jan 2019 08:49:58 +0900
Subject: [PATCH 06/20] axfer: supplement value of options for the manual of
 transfer subcommand

This commit supplements value of options for the manual of transfer
subcommand.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index d631f72..a8bf9c7 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -203,7 +203,7 @@ and
 is used as a default.
 
 .TP
-.B \-t, \-\-file\-type=TYPES
+.B \-t, \-\-file\-type=TYPE
 Indicate the type of file. This is required for capture transmission. Available
 types are listed below:
  - wav: Microsoft/IBM RIFF/Wave format
@@ -242,7 +242,7 @@ Select backend of transmission from a list below. The default is libasound.
 .SS Backend options for libasound
 
 .TP
-.B \-D, \-\-device
+.B \-D, \-\-device=NODE
 
 This option is used to select PCM node in libasound configuration space.
 Available nodes are listed by
@@ -271,7 +271,7 @@ This option implicitly uses
 option as well to prevent heavy consumption of CPU time.
 
 .TP
-.B \-F, \-\-period\-size
+.B \-F, \-\-period\-size=#
 
 This option configures given value to
 .I period_size
@@ -288,7 +288,7 @@ intervals of hardware interrupt, thus the same amount of audio data frame as
 the value is expected to be available for one I/O operation.
 
 .TP
-.B \-\-period\-time
+.B \-\-period\-time=#
 
 This option configures given value to
 .I period_time
@@ -297,7 +297,7 @@ hardware parameter of PCM substream. This option is similar to
 option, however its unit is micro\-second.
 
 .TP
-.B \-B, \-\-buffer\-size
+.B \-B, \-\-buffer\-size=#
 
 This option configures given value to
 .I buffer_size
@@ -311,7 +311,7 @@ the size of period. Actually, it is not, depending on implementation of the PCM
 plugins, in\-kernel driver and PCM I/O plugins.
 
 .TP
-.B \-\-buffer\-time
+.B \-\-buffer\-time=#
 
 This option configures given value to
 .I buffer_time
@@ -320,7 +320,7 @@ hardware parameter of PCM substream. This option is similar to
 option, however its unit is micro\-second.
 
 .TP
-.B \-\-waiter\-type
+.B \-\-waiter\-type=TYPE
 
 This option indicates the type of waiter for event notification. At present,
 four types are available;
@@ -355,7 +355,7 @@ Neither this option nor
 is available at the same time.
 
 .TP
-.B \-\-sched\-model
+.B \-\-sched\-model=MODEL
 
 This option selects scheduling model for process of this program. One of
 .I irq
@@ -368,7 +368,7 @@ When nothing specified,
 model is used.
 
 .TP
-.B \-A, \-\-avail\-min
+.B \-A, \-\-avail\-min=#
 
 This option configures given value to
 .I avail\-min
@@ -386,7 +386,7 @@ value of
 option is used.
 
 .TP
-.B \-R, \-\-start\-delay
+.B \-R, \-\-start\-delay=#
 
 This option configures given value to
 .I start_threshold
@@ -420,7 +420,7 @@ value of
 option is used.
 
 .TP
-.B \-T, \-\-stop\-delay
+.B \-T, \-\-stop\-delay=#
 
 This option configures given value to
 .I stop_threshold
@@ -500,7 +500,7 @@ This backend is automatically available when configure script detects
 symbol in libffado shared object.
 
 .TP
-.B \-p, \-\-port
+.B \-p, \-\-port=#
 
 This option uses given value to decide which 1394 OHCI controller is used to
 communicate. When Linux system has two 1394 OHCI controllers,
@@ -513,7 +513,7 @@ is available at the same time. If nothing specified, libffado performs to
 communicate to units on IEEE 1394 bus managed by all of 1394 OHCI controller available in Linux system.
 
 .TP
-.B \-n, \-\-node
+.B \-n, \-\-node=#
 
 This option uses given value to decide which unit is used to communicate. This
 option requires
@@ -522,7 +522,7 @@ option to indicate which 1394 OHCI controller is used to communicate to the
 specified unit.
 
 .TP
-.B \-g, \-\-guid
+.B \-g, \-\-guid=HEXADECIMAL
 
 This option uses given value to decide a target unit to communicate. The value
 should be prefixed with '0x' and consists of hexadecimal literal letters
@@ -533,7 +533,7 @@ communicate to units on IEEE 1394 bus managed by all of 1394 OHCI controller
 available in Linux system.
 
 .TP
-.B \-\-frames\-per\-period
+.B \-\-frames\-per\-period=#
 
 This option uses given value to decide the number of audio data frame in one
 read/write operation. The operation is blocked till the number of available
@@ -541,7 +541,7 @@ audio data frame exceeds the given value. As a default, 512 audio data frames
 is used.
 
 .TP
-.B \-\-periods\-per\-buffer
+.B \-\-periods\-per\-buffer=#
 
 This option uses given value to decide the size of intermediate buffer between
 this program and libffado. As a default, 2 periods per buffer is used.
@@ -565,7 +565,7 @@ isochronous communication starts by any unit on the same bus, the packets can
 be handled by this program.
 
 .TP
-.B \-\-sched\-priority
+.B \-\-sched\-priority=#
 
 This option executes
 .I pthread_setschedparam()
@@ -796,7 +796,7 @@ supports. As of 2018, PCM buffer of non\-interleaved order is hardly used by
 sound devices.
 
 .TP
-.I \-A, \-\-avail\-min
+.I \-A, \-\-avail\-min=#
 This option indicates threshold to wake up blocked process in a unit of
 audio data frame. Against aplay(1) implementation, this option has no effect
 with
@@ -808,7 +808,7 @@ of
 option.
 
 .TP
-.I \-R, \-\-start\-delay
+.I \-R, \-\-start\-delay=#
 This option indicates threshold to start prepared PCM substream in a unit of
 audio data frame. Against aplay(1) implementation, this option has no effect
 with
@@ -820,7 +820,7 @@ of
 option.
 
 .TP
-.I \-T, \-\-stop\-delay
+.I \-T, \-\-stop\-delay=#
 This option indicates threshold to stop running PCM substream in a unit of
 audio data frame. Against aplay(1) implementation, this option has no effect
 with
-- 
2.20.1


From 9ed5d7c876a1c11118f2524327c9eac65e7d66dd Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 14:56:12 +0900
Subject: [PATCH 07/20] axfer: correct invalid usage of escape of itaric text

A dot sign is valid for a prefix of instruction.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/axfer-transfer.1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/axfer/axfer-transfer.1 b/axfer/axfer-transfer.1
index a8bf9c7..375678e 100644
--- a/axfer/axfer-transfer.1
+++ b/axfer/axfer-transfer.1
@@ -75,7 +75,7 @@ The standard input or output is used if filepath is not specified or given as
 \&.
 
 For playback transmission, container format of given
-\I filepath
+.I filepath
 is detected automatically and metadata is used for parameters of sample format,
 channels, rate, duration. If nothing detected, content of given file path is
 handled as raw data. In this case, the parameters should be indicated as
-- 
2.20.1


From 2ba2066008c0fbe98374cc22e8a2eaa4e4e1b2bd Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 18:03:11 +0900
Subject: [PATCH 08/20] axfer: add an entry of axfer to README

Axfer has beed added as a rework of aplay with robust design to
support recent features of Linux sound subsystem.

This commit adds an entry to README.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index bee2e94..c28e2ea 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,7 @@ alsaconf	| the ALSA driver configurator script
 alsa-info       | a script to gather information about ALSA subsystem
 alsactl		| an utility for soundcard settings management
 aplay/arecord	| an utility for the playback / capture of .wav,.voc,.au files
+axfer		| an utility to transfer audio data frame (enhancement of aplay)
 amixer		| a command line mixer
 alsamixer	| a ncurses mixer
 amidi		| a utility to send/receive sysex dumps or other MIDI data
-- 
2.20.1


From 257be19c47e62cd0553e740599802cec9182b37c Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 17:36:22 +0900
Subject: [PATCH 09/20] axfer: allow to be compiled with glibc-2.11 or former

The program, axfer, was developed in userspace with glibc-2.28. This
userspace is mostly compliant to POSIX:2008 and some additional macros
for poll event are officially available. The glibc supports them as a
default since its v2.12 release. It will be failed to be compiled with
old glibc or the other libraries for C standard APIs.

One of the purpose of axfer is an better alternative of aplay. In a
point of the purpose, it's preferable to be compiled with the old
libraries.

This commit adds conditional macros to be compiled with libraries for
old compliance level of POSIX.

Reported-by: Jay Foster <jay@systech.com>
Fixes: fce16d9279b6 ('axfer: add an implementation of waiter for select(2)')
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/waiter-select.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/axfer/waiter-select.c b/axfer/waiter-select.c
index a35ea85..a2776e5 100644
--- a/axfer/waiter-select.c
+++ b/axfer/waiter-select.c
@@ -15,10 +15,19 @@
 #include <sys/select.h>
 
 // Except for POLLERR.
-#define POLLIN_SET	(POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP)
-#define POLLOUT_SET	(POLLWRBAND | POLLWRNORM | POLLOUT)
+#ifdef POLLRDNORM
+// This program is for userspace compliant to POSIX 2008 (IEEE 1003.1:2008).
+// This is the default compliance level since glibc-2.12 or later.
+# define POLLIN_SET	(POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP)
+# define POLLOUT_SET	(POLLWRBAND | POLLWRNORM | POLLOUT)
+#else
+// However it's allowed to be for old compliance levels.
+# define POLLIN_SET	(POLLIN | POLLHUP)
+# define POLLOUT_SET	(POLLOUT)
+#endif
 #define POLLEX_SET	(POLLPRI)
 
+
 struct select_state {
 	fd_set rfds_rd;
 	fd_set rfds_wr;
-- 
2.20.1


From 6fdaa0c52412205017a9a71872169c75f3d3a542 Mon Sep 17 00:00:00 2001
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Date: Sun, 27 Jan 2019 11:24:53 +0900
Subject: [PATCH 10/20] axfer: add missing header file of unit test to
 distribution

The file 'axfer/test/generator.h' is missing in distribution and brings
FTBFS for unit tests of axfer.

This commit fixes to add it.

Reported-by: Elimar Riesebieter <riesebie@lxtec.de>
Fixes: b878df1ff0b0: ('axfer: add unit test for container interface')
Fixes: 39d1ab8a0cb4: ('axfer: add a unit test for mapper interface')
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 axfer/test/Makefile.am | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/axfer/test/Makefile.am b/axfer/test/Makefile.am
index 76a93bf..6521134 100644
--- a/axfer/test/Makefile.am
+++ b/axfer/test/Makefile.am
@@ -14,6 +14,7 @@ container_test_SOURCES = \
 	../container-voc.c \
 	../container-raw.c \
 	generator.c \
+	generator.h \
 	container-test.c
 
 mapper_test_SOURCES = \
@@ -28,4 +29,5 @@ mapper_test_SOURCES = \
 	../mapper-single.c \
 	../mapper-multiple.c \
 	generator.c \
+	generator.h \
 	mapper-test.c
-- 
2.20.1


From 52c9cc9571659377800fea026cf31b24e2f31394 Mon Sep 17 00:00:00 2001
From: Prashant Malani <pmalani@chromium.org>
Date: Tue, 29 Jan 2019 01:58:26 -0800
Subject: [PATCH 11/20] seq: arecordmidi: Add num-events option

Add a command line option to automatically exit after recording a fixed
number of MIDI events. This allows a program using arecordmidi to expect
a MIDI file to be written automatically when the specified number of
events have been received, instead of having to send a SIGINT or SIGTERM
programmatically.

It also avoids the need to have the arecordmidi process running in the
background, and then constantly stat the output file to check if any
bytes have been written to it (this makes for less predictable and
longer-running tests).

This functionality finds use in Chrome OS functional testing, since
having to send SIGTERM/SIGINT programmatically and then wait for the
output file adds unpredictability and delay to the tests.

The addition of this command-line option should (hopefully) not break
any existing usage.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 seq/aplaymidi/arecordmidi.c | 47 ++++++++++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 3 deletions(-)

diff --git a/seq/aplaymidi/arecordmidi.c b/seq/aplaymidi/arecordmidi.c
index 19dbb7d..c0d0569 100644
--- a/seq/aplaymidi/arecordmidi.c
+++ b/seq/aplaymidi/arecordmidi.c
@@ -86,6 +86,25 @@ static int ts_num = 4; /* time signature: numerator */
 static int ts_div = 4; /* time signature: denominator */
 static int ts_dd = 2; /* time signature: denominator as a power of two */
 
+/* Parse a decimal number from a command line argument. */
+static long arg_parse_decimal_num(const char *str, int *err)
+{
+	long val;
+	char *endptr;
+
+	errno = 0;
+	val = strtol(str, &endptr, 0);
+	if (errno > 0) {
+		*err = -errno;
+		return 0;
+	}
+	if (*endptr != '\0') {
+		*err = -EINVAL;
+		return 0;
+	}
+
+	return val;
+}
 
 /* prints an error message to stderr, and dies */
 static void fatal(const char *msg, ...)
@@ -690,7 +709,8 @@ static void help(const char *argv0)
 		"  -t,--ticks=ticks           resolution in ticks per beat or frame\n"
 		"  -s,--split-channels        create a track for each channel\n"
 		"  -m,--metronome=client:port play a metronome signal\n"
-		"  -i,--timesig=nn:dd         time signature\n",
+		"  -i,--timesig=nn:dd         time signature\n"
+		"  -n,--num-events=events     fixed number of events to record, then exit\n",
 		argv0);
 }
 
@@ -706,7 +726,7 @@ static void sighandler(int sig)
 
 int main(int argc, char *argv[])
 {
-	static const char short_options[] = "hVlp:b:f:t:sdm:i:";
+	static const char short_options[] = "hVlp:b:f:t:sdm:i:n:";
 	static const struct option long_options[] = {
 		{"help", 0, NULL, 'h'},
 		{"version", 0, NULL, 'V'},
@@ -719,6 +739,7 @@ int main(int argc, char *argv[])
 		{"dump", 0, NULL, 'd'},
 		{"metronome", 1, NULL, 'm'},
 		{"timesig", 1, NULL, 'i'},
+		{"num-events", 1, NULL, 'n'},
 		{ }
 	};
 
@@ -727,6 +748,9 @@ int main(int argc, char *argv[])
 	struct pollfd *pfds;
 	int npfds;
 	int c, err;
+	/* If |num_events| isn't specified, leave it at 0. */
+	long num_events = 0;
+	long events_received = 0;
 
 	init_seq();
 
@@ -775,6 +799,16 @@ int main(int argc, char *argv[])
 		case 'i':
 			time_signature(optarg);
 			break;
+		case 'n':
+			err = 0;
+			num_events = arg_parse_decimal_num(optarg, &err);
+			if (err != 0) {
+				fatal("Couldn't parse num_events argument: %s\n",
+					strerror(-err));
+			}
+			if (num_events <= 0)
+				fatal("num_events must be greater than 0");
+			break;
 		default:
 			help(argv[0]);
 			return 1;
@@ -864,13 +898,20 @@ int main(int argc, char *argv[])
 			err = snd_seq_event_input(seq, &event);
 			if (err < 0)
 				break;
-			if (event)
+			if (event) {
 				record_event(event);
+				events_received++;
+			}
 		} while (err > 0);
 		if (stop)
 			break;
+		if (num_events && (events_received == num_events))
+			break;
 	}
 
+	if (num_events && events_received < num_events)
+		fputs("Warning: Received signal before num_events\n", stdout);
+
 	finish_tracks();
 	write_file();
 
-- 
2.20.1


From a558b71e63a50c045731e032dc35623674848c6c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 12 Mar 2019 15:52:49 +0100
Subject: [PATCH 12/20] alsa-info.sh: cleanups

- fix awk arguments
- backticks/gravemarks removal
- some cosmetic and indentation changes
- add REQUIRES to check the basic tools

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 alsa-info/alsa-info.sh | 169 +++++++++++++++++++++--------------------
 1 file changed, 85 insertions(+), 84 deletions(-)

diff --git a/alsa-info/alsa-info.sh b/alsa-info/alsa-info.sh
index cda4125..cf7ad89 100755
--- a/alsa-info/alsa-info.sh
+++ b/alsa-info/alsa-info.sh
@@ -22,22 +22,26 @@ CHANGELOG="http://www.alsa-project.org/alsa-info.sh.changelog"
 
 ##################################################################################
 
-#The script was written for 2 main reasons:
-# 1. Remove the need for the devs/helpers to ask several questions before we can easily help the user.
-# 2. Allow newer/inexperienced ALSA users to give us all the info we need to help them.
+# The script was written for 2 main reasons:
+#  1. Remove the need for the devs/helpers to ask several questions before we can easily help the user.
+#  2. Allow newer/inexperienced ALSA users to give us all the info we need to help them.
 
 #Set the locale (this may or may not be a good idea.. let me know)
 export LC_ALL=C
 
-#Change the PATH variable, so we can run lspci (needed for some distros)
+# Change the PATH variable, so we can run lspci (needed for some distros)
 PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
 BGTITLE="ALSA-Info v $SCRIPT_VERSION"
 PASTEBINKEY="C9cRIO8m/9y8Cs0nVs0FraRx7U0pHsuc"
-#Define some simple functions
 
-WGET=$(which wget 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
+WGET=$(which wget 2>/dev/null | sed 's|^[^/]*||' 2>/dev/null)
+REQUIRES="mktemp grep pgrep whereis ping awk date uname cat dmesg amixer alsactl"
 
-pbcheck(){
+#
+# Define some simple functions
+#
+
+pbcheck() {
 	[[ $UPLOAD = "no" ]] && return
 
 	if [[ -z $PASTEBIN ]]; then
@@ -50,9 +54,9 @@ pbcheck(){
 update() {
 	test -z "$WGET" -o ! -x "$WGET" && return
 
-	SHFILE=`mktemp -t alsa-info.XXXXXXXXXX` || exit 1
+	SHFILE=$(mktemp -t alsa-info.XXXXXXXXXX) || exit 1
 	wget -O $SHFILE "http://www.alsa-project.org/alsa-info.sh" >/dev/null 2>&1
-	REMOTE_VERSION=`grep SCRIPT_VERSION $SHFILE |head -n1 |sed 's/.*=//'`
+	REMOTE_VERSION=$(grep SCRIPT_VERSION $SHFILE | head -n1 | sed 's/.*=//')
 	if [ -s "$SHFILE" -a "$REMOTE_VERSION" != "$SCRIPT_VERSION" ]; then
 		if [[ -n $DIALOG ]]
 		then
@@ -131,7 +135,7 @@ withlsmod() {
 	echo "!!All Loaded Modules" >> $FILE
 	echo "!!------------------" >> $FILE
 	echo "" >> $FILE
-	lsmod |awk {'print $1'} >> $FILE
+	lsmod | awk '{print $1}' >> $FILE
 	echo "" >> $FILE
 	echo "" >> $FILE
 }
@@ -140,13 +144,13 @@ withamixer() {
         echo "!!Amixer output" >> $FILE
         echo "!!-------------" >> $FILE
         echo "" >> $FILE
-	for i in `grep "]: " /proc/asound/cards | awk -F ' ' '{ print $1} '` ; do
-	CARD_NAME=`grep "^ *$i " $TEMPDIR/alsacards.tmp|awk {'print $2'}`
-	echo "!!-------Mixer controls for card $i $CARD_NAME]" >> $FILE
-	echo "" >>$FILE
-	amixer -c$i info>> $FILE 2>&1
-	amixer -c$i>> $FILE 2>&1
-        echo "" >> $FILE
+	for i in $(grep "]: " /proc/asound/cards | awk -F ' ' '{ print $1 }') ; do
+		CARD_NAME=$(grep "^ *$i " $TEMPDIR/alsacards.tmp | awk '{ print $2 }')
+		echo "!!-------Mixer controls for card $i $CARD_NAME]" >> $FILE
+		echo "" >>$FILE
+		amixer -c$i info >> $FILE 2>&1
+		amixer -c$i >> $FILE 2>&1
+		echo "" >> $FILE
 	done
 	echo "" >> $FILE
 }
@@ -155,17 +159,7 @@ withalsactl() {
 	echo "!!Alsactl output" >> $FILE
         echo "!!--------------" >> $FILE
         echo "" >> $FILE
-        exe=""
-        if [ -x /usr/sbin/alsactl ]; then
-        	exe="/usr/sbin/alsactl"
-        fi
-        if [ -x /usr/local/sbin/alsactl ]; then
-        	exe="/usr/local/sbin/alsactl"
-        fi
-        if [ -z "$exe" ]; then
-        	exe=`whereis alsactl | cut -d ' ' -f 2`
-        fi
-	$exe -f $TEMPDIR/alsactl.tmp store
+	alsactl -f $TEMPDIR/alsactl.tmp store
 	echo "--startcollapse--" >> $FILE
 	cat $TEMPDIR/alsactl.tmp >> $FILE
 	echo "--endcollapse--" >> $FILE
@@ -183,8 +177,7 @@ withdevices() {
 }
 
 withconfigs() {
-if [[ -e $HOME/.asoundrc ]] || [[ -e /etc/asound.conf ]] || [[ -e $HOME/.asoundrc.asoundconf ]]
-then
+if [[ -e $HOME/.asoundrc ]] || [[ -e /etc/asound.conf ]] || [[ -e $HOME/.asoundrc.asoundconf ]]; then
         echo "!!ALSA configuration files" >> $FILE
         echo "!!------------------------" >> $FILE
         echo "" >> $FILE
@@ -268,7 +261,7 @@ withall() {
 }
 
 get_alsa_library_version() {
-	ALSA_LIB_VERSION=`grep VERSION_STR /usr/include/alsa/version.h 2>/dev/null|awk {'print $3'}|sed 's/"//g'`
+	ALSA_LIB_VERSION=$(grep VERSION_STR /usr/include/alsa/version.h 2>/dev/null | awk '{ print $3 }' | sed 's/"//g')
 
 	if [ -z "$ALSA_LIB_VERSION" ]; then
 		if [ -f /etc/lsb-release ]; then
@@ -276,7 +269,7 @@ get_alsa_library_version() {
 			case "$DISTRIB_ID" in
 				Ubuntu)
 					if which dpkg > /dev/null ; then
-						ALSA_LIB_VERSION=`dpkg -l libasound2 | tail -1 | awk '{print $3}' | cut -f 1 -d -`
+						ALSA_LIB_VERSION=$(dpkg -l libasound2 | tail -1 | awk '{ print $3 }' | cut -f 1 -d -)
 					fi
 
 					if [ "$ALSA_LIB_VERSION" = "<none>" ]; then
@@ -290,7 +283,7 @@ get_alsa_library_version() {
 			esac
 		elif [ -f /etc/debian_version ]; then
 			if which dpkg > /dev/null ; then
-				ALSA_LIB_VERSION=`dpkg -l libasound2 | tail -1 | awk '{print $3}' | cut -f 1 -d -`
+				ALSA_LIB_VERSION=$(dpkg -l libasound2 | tail -1 | awk '{ print $3 }' | cut -f 1 -d -)
 			fi
 
 			if [ "$ALSA_LIB_VERSION" = "<none>" ]; then
@@ -301,16 +294,24 @@ get_alsa_library_version() {
 	fi
 }
 
+# Basic requires
+for prg in $REQUIRES; do
+  t=$(which $prg 2> /dev/null)
+  if test -z "$t"; then
+    echo "This script requires $prg utility to continue."
+    exit 1
+  fi
+done
 
-#Run checks to make sure the programs we need are installed.
-LSPCI=$(which lspci 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null);
-TPUT=$(which tput 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null);
+# Run checks to make sure the programs we need are installed.
+LSPCI=$(which lspci 2>/dev/null | sed 's|^[^/]*||' 2>/dev/null);
+TPUT=$(which tput 2>/dev/null | sed 's|^[^/]*||' 2>/dev/null);
 DIALOG=$(which dialog 2>/dev/null | sed 's|^[^/]*||' 2>/dev/null);
 
-#Check to see if sysfs is enabled in the kernel. We'll need this later on
-SYSFS=$(mount |grep sysfs|awk {'print $3'});
+# Check to see if sysfs is enabled in the kernel. We'll need this later on
+SYSFS=$(mount | grep sysfs | awk '{ print $3 }');
 
-#Check modprobe config files for sound related options
+# Check modprobe config files for sound related options
 SNDOPTIONS=$(modprobe -c|sed -n 's/^options \(snd[-_][^ ]*\)/\1:/p')
 
 KEEP_OUTPUT=
@@ -386,11 +387,11 @@ else
 fi # dialog
 fi # WELCOME
 
-#Set the output file
-TEMPDIR=`mktemp -t -d alsa-info.XXXXXXXXXX` || exit 1
+# Set the output file
+TEMPDIR=$(mktemp -t -d alsa-info.XXXXXXXXXX) || exit 1
 FILE="$TEMPDIR/alsa-info.txt"
 if [ -z "$NFILE" ]; then
-	NFILE=`mktemp -t alsa-info.txt.XXXXXXXXXX` || exit 1
+	NFILE=$(mktemp -t alsa-info.txt.XXXXXXXXXX) || exit 1
 fi
 
 trap cleanup 0
@@ -404,17 +405,17 @@ if [ -z "$LSPCI" ]; then
 	fi
 fi
 
-#Fetch the info and store in temp files/variables
-DISTRO=`grep -ihs "buntu\|SUSE\|Fedora\|PCLinuxOS\|MEPIS\|Mandriva\|Debian\|Damn\|Sabayon\|Slackware\|KNOPPIX\|Gentoo\|Zenwalk\|Mint\|Kubuntu\|FreeBSD\|Puppy\|Freespire\|Vector\|Dreamlinux\|CentOS\|Arch\|Xandros\|Elive\|SLAX\|Red\|BSD\|KANOTIX\|Nexenta\|Foresight\|GeeXboX\|Frugalware\|64\|SystemRescue\|Novell\|Solaris\|BackTrack\|KateOS\|Pardus" /etc/{issue,*release,*version}`
-KERNEL_VERSION=`uname -r`
-KERNEL_PROCESSOR=`uname -p`
-KERNEL_MACHINE=`uname -m`
-KERNEL_OS=`uname -o`
-[[ `uname -v | grep SMP`  ]] && KERNEL_SMP="Yes" || KERNEL_SMP="No" 
-ALSA_DRIVER_VERSION=`cat /proc/asound/version |head -n1|awk {'print $7'} |sed 's/\.$//'`
+# Fetch the info and store in temp files/variables
+TSTAMP=$(LANG=C TZ=UTC date)
+DISTRO=$(grep -ihs "buntu\|SUSE\|Fedora\|PCLinuxOS\|MEPIS\|Mandriva\|Debian\|Damn\|Sabayon\|Slackware\|KNOPPIX\|Gentoo\|Zenwalk\|Mint\|Kubuntu\|FreeBSD\|Puppy\|Freespire\|Vector\|Dreamlinux\|CentOS\|Arch\|Xandros\|Elive\|SLAX\|Red\|BSD\|KANOTIX\|Nexenta\|Foresight\|GeeXboX\|Frugalware\|64\|SystemRescue\|Novell\|Solaris\|BackTrack\|KateOS\|Pardus" /etc/{issue,*release,*version})
+KERNEL_VERSION=$(uname -r)
+KERNEL_PROCESSOR=$(uname -p)
+KERNEL_MACHINE=$(uname -m)
+KERNEL_OS=$(uname -o)
+[[ $(uname -v | grep SMP) ]] && KERNEL_SMP="Yes" || KERNEL_SMP="No"
+ALSA_DRIVER_VERSION=$(cat /proc/asound/version | head -n1 | awk '{ print $7 }' | sed 's/\.$//')
 get_alsa_library_version
-ALSA_UTILS_VERSION=`amixer -v |awk {'print $3'}`
-LAST_CARD=$((`grep "]: " /proc/asound/cards | wc -l` - 1 ))
+ALSA_UTILS_VERSION=$(amixer -v | awk '{ print $3 }')
 
 ESDINST=$(which esd 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
 PAINST=$(which pulseaudio 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
@@ -451,10 +452,10 @@ if [ -d /sys/bus/acpi/devices ]; then
     done
 fi
 
-cat /proc/asound/modules 2>/dev/null|awk {'print $2'}>$TEMPDIR/alsamodules.tmp
-cat /proc/asound/cards >$TEMPDIR/alsacards.tmp
+cat /proc/asound/modules 2>/dev/null | awk '{ print $2 }' > $TEMPDIR/alsamodules.tmp
+cat /proc/asound/cards > $TEMPDIR/alsacards.tmp
 if [[ ! -z "$LSPCI" ]]; then
-lspci |grep -i "multi\|audio">$TEMPDIR/lspci.tmp
+  lspci | grep -i "multi\|audio">$TEMPDIR/lspci.tmp
 fi
 
 #Check for HDA-Intel cards codec#*
@@ -477,7 +478,7 @@ echo "!!################################" >> $FILE
 echo "!!ALSA Information Script v $SCRIPT_VERSION" >> $FILE
 echo "!!################################" >> $FILE
 echo "" >> $FILE
-echo "!!Script ran on: `LANG=C TZ=UTC date`" >> $FILE
+echo "!!Script ran on: $TSTAMP" >> $FILE
 echo "" >> $FILE
 echo "" >> $FILE
 echo "!!Linux Distribution" >> $FILE
@@ -531,35 +532,35 @@ echo "!!Sound Servers on this system" >> $FILE
 echo "!!----------------------------" >> $FILE
 echo "" >> $FILE
 if [[ -n $PAINST ]];then
-[[ `pgrep '^(.*/)?pulseaudio$'` ]] && PARUNNING="Yes" || PARUNNING="No"
+[[ $(pgrep '^(.*/)?pulseaudio$') ]] && PARUNNING="Yes" || PARUNNING="No"
 echo "Pulseaudio:" >> $FILE
 echo "      Installed - Yes ($PAINST)" >> $FILE
 echo "      Running - $PARUNNING" >> $FILE
 echo "" >> $FILE
 fi
 if [[ -n $ESDINST ]];then
-[[ `pgrep '^(.*/)?esd$'` ]] && ESDRUNNING="Yes" || ESDRUNNING="No"
+[[ $(pgrep '^(.*/)?esd$') ]] && ESDRUNNING="Yes" || ESDRUNNING="No"
 echo "ESound Daemon:" >> $FILE
 echo "      Installed - Yes ($ESDINST)" >> $FILE
 echo "      Running - $ESDRUNNING" >> $FILE
 echo "" >> $FILE
 fi
 if [[ -n $ARTSINST ]];then
-[[ `pgrep '^(.*/)?artsd$'` ]] && ARTSRUNNING="Yes" || ARTSRUNNING="No"
+[[ $(pgrep '^(.*/)?artsd$') ]] && ARTSRUNNING="Yes" || ARTSRUNNING="No"
 echo "aRts:" >> $FILE
 echo "      Installed - Yes ($ARTSINST)" >> $FILE
 echo "      Running - $ARTSRUNNING" >> $FILE
 echo "" >> $FILE
 fi
 if [[ -n $JACKINST ]];then
-[[ `pgrep '^(.*/)?jackd$'` ]] && JACKRUNNING="Yes" || JACKRUNNING="No"
+[[ $(pgrep '^(.*/)?jackd$') ]] && JACKRUNNING="Yes" || JACKRUNNING="No"
 echo "Jack:" >> $FILE
 echo "      Installed - Yes ($JACKINST)" >> $FILE
 echo "      Running - $JACKRUNNING" >> $FILE
 echo "" >> $FILE
 fi
 if [[ -n $ROARINST ]];then
-[[ `pgrep '^(.*/)?roard$'` ]] && ROARRUNNING="Yes" || ROARRUNNING="No"
+[[ $(pgrep '^(.*/)?roard$') ]] && ROARRUNNING="Yes" || ROARRUNNING="No"
 echo "RoarAudio:" >> $FILE
 echo "      Installed - Yes ($ROARINST)" >> $FILE
 echo "      Running - $ROARRUNNING" >> $FILE
@@ -602,20 +603,20 @@ echo "" >> $FILE
 echo "" >> $FILE
 fi
 
-if [ -d "$SYSFS" ]
-then
-echo "!!Loaded sound module options" >> $FILE
-echo "!!---------------------------" >> $FILE
-echo "" >> $FILE
-for mod in `cat /proc/asound/modules|awk {'print $2'}`;do
-echo "!!Module: $mod" >> $FILE
-for params in `echo $SYSFS/module/$mod/parameters/*`; do
-	echo -ne "\t";
-	echo "$params : `cat $params`" | sed 's:.*/::';
-done >> $FILE
-echo "" >> $FILE
-done
-echo "" >> $FILE
+if [ -d "$SYSFS" ]; then
+	echo "!!Loaded sound module options" >> $FILE
+	echo "!!---------------------------" >> $FILE
+	echo "" >> $FILE
+	for mod in $(cat /proc/asound/modules | awk '{ print $2 }'); do
+		echo "!!Module: $mod" >> $FILE
+		for params in $(echo $SYSFS/module/$mod/parameters/*); do
+			echo -ne "\t"
+			value=$(cat $params)
+			echo "$params : $value" | sed 's:.*/::'
+		done >> $FILE
+		echo "" >> $FILE
+	done
+	echo "" >> $FILE
 fi
 
 if [ -s "$TEMPDIR/alsa-hda-intel.tmp" ]; then
@@ -856,8 +857,8 @@ if [ "$UPLOAD" = "no" ]; then
 
 fi # UPLOAD
 
-#Test that wget is installed, and supports --post-file. Upload $FILE if it does, and prompt user to upload file if it doesnt. 
-if [[ -n "${WGET}" ]] && [[ -x "${WGET}" ]] && [[ `wget --help |grep post-file` ]]
+# Test that wget is installed, and supports --post-file. Upload $FILE if it does, and prompt user to upload file if it does not.
+if [[ -n "${WGET}" ]] && [[ -x "${WGET}" ]] && [[ $(wget --help | grep post-file) ]]
 then
 
 if [[ -n $DIALOG ]]
@@ -882,7 +883,7 @@ fi
 dialog --backtitle "$BGTITLE" --title "Information uploaded" --yesno "Would you like to see the uploaded information?" 5 100 
 DIALOG_EXIT_CODE=$?
 if [ $DIALOG_EXIT_CODE = 0 ]; then
-	grep -v "alsa-info.txt" $FILE >$TEMPDIR/uploaded.txt
+	grep -v "alsa-info.txt" $FILE > $TEMPDIR/uploaded.txt
 	dialog --backtitle "$BGTITLE" --textbox $TEMPDIR/uploaded.txt 0 0
 fi
 
@@ -911,20 +912,20 @@ done
 echo -e "\b Done!"
 echo ""
 
-fi #dialog
+fi # dialog
 
-#See if tput is available, and use it if it is.	
+# See if tput is available, and use it if it is.
 if [ -n "$TPUT" ]; then
 	if [[ -z $PASTEBIN ]]; then
-		FINAL_URL=`tput setaf 1; grep "SUCCESS:" $TEMPDIR/wget.tmp | cut -d ' ' -f 2 ; tput sgr0`
+		FINAL_URL=$(tput setaf 1; grep "SUCCESS:" $TEMPDIR/wget.tmp | cut -d ' ' -f 2 ; tput sgr0)
 	else
-		FINAL_URL=`tput setaf 1; grep "SUCCESS:" $TEMPDIR/wget.tmp | sed -n 's/.*\:\([0-9]\+\).*/http:\/\/pastebin.ca\/\1/p';tput sgr0`
+		FINAL_URL=$(tput setaf 1; grep "SUCCESS:" $TEMPDIR/wget.tmp | sed -n 's/.*\:\([0-9]\+\).*/http:\/\/pastebin.ca\/\1/p'; tput sgr0)
 	fi
 else
 	if [[ -z $PASTEBIN ]]; then
-		FINAL_URL=`grep "SUCCESS:" $TEMPDIR/wget.tmp | cut -d ' ' -f 2`
+		FINAL_URL=$(grep "SUCCESS:" $TEMPDIR/wget.tmp | cut -d ' ' -f 2)
 	else
-		FINAL_URL=`grep "SUCCESS:" $TEMPDIR/wget.tmp | sed -n 's/.*\:\([0-9]\+\).*/http:\/\/pastebin.ca\/\1/p'`
+		FINAL_URL=$(grep "SUCCESS:" $TEMPDIR/wget.tmp | sed -n 's/.*\:\([0-9]\+\).*/http:\/\/pastebin.ca\/\1/p')
 	fi
 fi
 
-- 
2.20.1


From cf2cc375020a2cd5038332f923d428c8e642b70a Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 12 Mar 2019 16:05:23 +0100
Subject: [PATCH 13/20] alsactl: simple coverity fix

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 alsactl/init_parse.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c
index f39d80e..562e674 100644
--- a/alsactl/init_parse.c
+++ b/alsactl/init_parse.c
@@ -1675,8 +1675,10 @@ static int parse(struct space *space, const char *filename)
 	linenum = 0;
 	linesize = 128;
 	line = malloc(linesize);
-	if (line == NULL)
+	if (line == NULL) {
+		file_unmap(buf, bufsize);
 		return -ENOMEM;
+	}
 	space->filename = filename;
 	while (!err && pos < bufsize && !space->quit) {
 		count = line_width(buf, bufsize, pos);
-- 
2.20.1


From 6dc4b1eab578bd4b6608a0118f170cf2f84e0680 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 12 Mar 2019 16:06:03 +0100
Subject: [PATCH 14/20] arecordmidi: simple coverity fix

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 seq/aplaymidi/arecordmidi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/seq/aplaymidi/arecordmidi.c b/seq/aplaymidi/arecordmidi.c
index c0d0569..f3db65e 100644
--- a/seq/aplaymidi/arecordmidi.c
+++ b/seq/aplaymidi/arecordmidi.c
@@ -631,7 +631,7 @@ static void write_file(void)
 	fwrite("MThd\0\0\0\6", 1, 8, file);
 	/* type 0 or 1 */
 	fputc(0, file);
-	fputc(used_tracks > 1, file);
+	fputc(used_tracks > 1 ? 1 : 0, file);
 	/* number of tracks */
 	fputc((used_tracks >> 8) & 0xff, file);
 	fputc(used_tracks & 0xff, file);
-- 
2.20.1


From bc42704c96c02b138849be4af6c90b4755659b56 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 12 Mar 2019 16:14:50 +0100
Subject: [PATCH 15/20] aplay: fix the multiple open file descriptors for the
 raw capture

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 aplay/aplay.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/aplay/aplay.c b/aplay/aplay.c
index efc1eb4..8bdf45b 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -2690,8 +2690,6 @@ static void end_voc(int fd)
 	bt.datalen_h = (u_char) ((cnt & 0xFF0000) >> 16);
 	if (lseek64(fd, length_seek, SEEK_SET) == length_seek)
 		xwrite(fd, &bt, sizeof(VocBlockType));
-	if (fd != 1)
-		close(fd);
 }
 
 static void end_wave(int fd)
@@ -2712,8 +2710,6 @@ static void end_wave(int fd)
 		xwrite(fd, &rifflen, 4);
 	if (lseek64(fd, length_seek, SEEK_SET) == length_seek)
 		xwrite(fd, &cd, sizeof(WaveChunkHeader));
-	if (fd != 1)
-		close(fd);
 }
 
 static void end_au(int fd)
@@ -2725,8 +2721,6 @@ static void end_au(int fd)
 	ah.data_size = fdcount > 0xffffffff ? 0xffffffff : BE_INT(fdcount);
 	if (lseek64(fd, length_seek, SEEK_SET) == length_seek)
 		xwrite(fd, &ah.data_size, sizeof(ah.data_size));
-	if (fd != 1)
-		close(fd);
 }
 
 static void header(int rtype, char *name)
@@ -2938,7 +2932,7 @@ static void playback(char *name)
 		break;
         }
 
-	if (fd != 0)
+	if (fd != fileno(stdin))
 		close(fd);
 }
 
@@ -3151,7 +3145,7 @@ static void capture(char *orig_name)
 	if (!name || !strcmp(name, "-")) {
 		fd = fileno(stdout);
 		name = "stdout";
-		tostdout=1;
+		tostdout = 1;
 		if (count > fmt_rec_table[file_type].max_filesize)
 			count = fmt_rec_table[file_type].max_filesize;
 	}
@@ -3159,7 +3153,7 @@ static void capture(char *orig_name)
 
 	do {
 		/* open a file to write */
-		if(!tostdout) {
+		if (!tostdout) {
 			/* upon the second file we start the numbering scheme */
 			if (filecount || use_strftime) {
 				filecount = new_capture_file(orig_name, namebuf,
@@ -3218,8 +3212,10 @@ static void capture(char *orig_name)
 		}
 
 		/* finish sample container */
-		if (fmt_rec_table[file_type].end && !tostdout) {
-			fmt_rec_table[file_type].end(fd);
+		if (!tostdout) {
+			if (fmt_rec_table[file_type].end)
+				fmt_rec_table[file_type].end(fd);
+			close(fd);
 			fd = -1;
 		}
 
-- 
2.20.1


From 819e04c7a1958a1c4378d914b38bddaf248d9fc0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 13 Mar 2019 14:19:12 +0100
Subject: [PATCH 16/20] axfer: coverity fixes

- container-voc.c - out of array access
- container-voc.c - handle correctly eof
- frame_cache.c - correct memory allocation
- container.c - byte_count might be used uninitialized
- xfer-libasound-irq-mmap.c - fix avail signess
- xfer-options.c - fix potential 32-bit wrap for duration

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 axfer/container-voc.c           | 32 +++++++++++++-----------
 axfer/container.c               |  2 +-
 axfer/frame-cache.c             | 44 +++++++++++++++++----------------
 axfer/xfer-libasound-irq-mmap.c |  2 +-
 axfer/xfer-options.c            |  2 +-
 5 files changed, 43 insertions(+), 39 deletions(-)

diff --git a/axfer/container-voc.c b/axfer/container-voc.c
index 92e9c83..6fa59c3 100644
--- a/axfer/container-voc.c
+++ b/axfer/container-voc.c
@@ -234,7 +234,7 @@ static int build_time_constant(unsigned int frames_per_second,
 					frames_per_second)
 				break;
 		}
-		if (i < ARRAY_SIZE(ex_v110_time_consts) ||
+		if (i < ARRAY_SIZE(ex_v110_time_consts) &&
 		    frames_per_second <= 192000) {
 			*code = ex_v110_time_consts[i].code;
 		} else {
@@ -520,29 +520,31 @@ static int detect_format_block(struct container_context *cntr)
 {
 	struct parser_state *state = cntr->private_data;
 	struct block_header header;
-	void *buf = NULL;
+	void *buf;
 	int err;
 
 again:
+	buf = NULL;
 	err = cache_data_block(cntr, &header, &buf);
 	if (err < 0)
 		return err;
+	if (buf) {
+		if (header.type == BLOCK_TYPE_EXTENDED_V110_FORMAT) {
+			err = parse_extended_v110_format(state, buf);
+		} else if (header.type == BLOCK_TYPE_V120_DATA) {
+			err = parse_v120_format_block(state, buf);
+		} else if (header.type == BLOCK_TYPE_V110_DATA) {
+			err = parse_v110_data(state, buf);
+		} else {
+			free(buf);
+			goto again;
+		}
 
-	if (header.type == BLOCK_TYPE_EXTENDED_V110_FORMAT) {
-		err = parse_extended_v110_format(state, buf);
-	} else if (header.type == BLOCK_TYPE_V120_DATA) {
-		err = parse_v120_format_block(state, buf);
-	} else if (header.type == BLOCK_TYPE_V110_DATA) {
-		err = parse_v110_data(state, buf);
-	} else {
 		free(buf);
-		goto again;
-	}
-
-	free(buf);
 
-	if (err < 0)
-		return err;
+		if (err < 0)
+			return err;
+	}
 
 	// Expect to detect block_v110_data.
 	if (header.type == BLOCK_TYPE_EXTENDED_V110_FORMAT)
diff --git a/axfer/container.c b/axfer/container.c
index 6b0e42e..7da97c6 100644
--- a/axfer/container.c
+++ b/axfer/container.c
@@ -296,7 +296,7 @@ int container_context_pre_process(struct container_context *cntr,
 				  unsigned int *frames_per_second,
 				  uint64_t *frame_count)
 {
-	uint64_t byte_count;
+	uint64_t byte_count = 0;
 	unsigned int bytes_per_frame;
 	int err;
 
diff --git a/axfer/frame-cache.c b/axfer/frame-cache.c
index 882568f..417c1e6 100644
--- a/axfer/frame-cache.c
+++ b/axfer/frame-cache.c
@@ -50,13 +50,18 @@ int frame_cache_init(struct frame_cache *cache, snd_pcm_access_t access,
 		     unsigned int samples_per_frame,
 		     unsigned int frames_per_cache)
 {
+	cache->access = access;
+	cache->remained_count = 0;
+	cache->bytes_per_sample = bytes_per_sample;
+	cache->samples_per_frame = samples_per_frame;
+	cache->frames_per_cache = frames_per_cache;
+
 	if (access == SND_PCM_ACCESS_RW_INTERLEAVED)
 		cache->align_frames = align_frames_in_i;
 	else if (access == SND_PCM_ACCESS_RW_NONINTERLEAVED)
 		cache->align_frames = align_frames_in_n;
 	else
 		return -EINVAL;
-	cache->access = access;
 
 	if (access == SND_PCM_ACCESS_RW_INTERLEAVED) {
 		char *buf;
@@ -64,45 +69,42 @@ int frame_cache_init(struct frame_cache *cache, snd_pcm_access_t access,
 		buf = calloc(frames_per_cache,
 			     bytes_per_sample * samples_per_frame);
 		if (buf == NULL)
-			return -ENOMEM;
+			goto nomem;
 		cache->buf = buf;
 		cache->buf_ptr = buf;
 	} else {
-		char **bufs;
-		char **buf_ptrs;
+		char **bufs = calloc(samples_per_frame, sizeof(*bufs));
+		char **buf_ptrs = calloc(samples_per_frame, sizeof(*buf_ptrs));
 		int i;
 
-		bufs = calloc(samples_per_frame, sizeof(*bufs));
-		if (bufs == NULL)
-			return -ENOMEM;
-		buf_ptrs = calloc(samples_per_frame, sizeof(*buf_ptrs));
-		if (buf_ptrs == NULL)
-			return -ENOMEM;
+		cache->buf = bufs;
+		cache->buf_ptr = buf_ptrs;
+		if (bufs == NULL || buf_ptrs == NULL)
+			goto nomem;
 		for (i = 0; i < samples_per_frame; ++i) {
 			bufs[i] = calloc(frames_per_cache, bytes_per_sample);
 			if (bufs[i] == NULL)
-				return -ENOMEM;
+				goto nomem;
 			buf_ptrs[i] = bufs[i];
 		}
-		cache->buf = bufs;
-		cache->buf_ptr = buf_ptrs;
 	}
 
-	cache->remained_count = 0;
-	cache->bytes_per_sample = bytes_per_sample;
-	cache->samples_per_frame = samples_per_frame;
-	cache->frames_per_cache = frames_per_cache;
 
 	return 0;
+
+nomem:
+	frame_cache_destroy(cache);
+	return -ENOMEM;
 }
 
 void frame_cache_destroy(struct frame_cache *cache)
 {
 	if (cache->access == SND_PCM_ACCESS_RW_NONINTERLEAVED) {
-		int i;
-		for (i = 0; i < cache->samples_per_frame; ++i) {
-			char **bufs = cache->buf;
-			free(bufs[i]);
+		char **bufs = cache->buf;
+		if (bufs) {
+			int i;
+			for (i = 0; i < cache->samples_per_frame; ++i)
+				free(bufs[i]);
 		}
 		free(cache->buf_ptr);
 	}
diff --git a/axfer/xfer-libasound-irq-mmap.c b/axfer/xfer-libasound-irq-mmap.c
index 0c96ee5..0fbbcc6 100644
--- a/axfer/xfer-libasound-irq-mmap.c
+++ b/axfer/xfer-libasound-irq-mmap.c
@@ -75,7 +75,7 @@ static int irq_mmap_process_frames(struct libasound_state *state,
 	struct map_layout *layout = state->private_data;
 	const snd_pcm_channel_area_t *areas;
 	snd_pcm_uframes_t frame_offset;
-	snd_pcm_uframes_t avail;
+	snd_pcm_sframes_t avail;
 	unsigned int avail_count;
 	void *frame_buf;
 	snd_pcm_sframes_t consumed_count;
diff --git a/axfer/xfer-options.c b/axfer/xfer-options.c
index 8394d8a..2713027 100644
--- a/axfer/xfer-options.c
+++ b/axfer/xfer-options.c
@@ -395,7 +395,7 @@ void xfer_options_calculate_duration(struct xfer_context *xfer,
 	uint64_t frame_count;
 
 	if (xfer->duration_seconds > 0) {
-		frame_count = xfer->duration_seconds * xfer->frames_per_second;
+		frame_count = (uint64_t)xfer->duration_seconds * (uint64_t)xfer->frames_per_second;
 		if (frame_count < *total_frame_count)
 			*total_frame_count = frame_count;
 	}
-- 
2.20.1


From 9b6c5e2d5c3119dbb79fc70ac8355424a8893ed0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 13 Mar 2019 14:22:22 +0100
Subject: [PATCH 17/20] aplay: check the return value for
 snd_pcm_sw_params_current() (coverity)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 aplay/aplay.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/aplay/aplay.c b/aplay/aplay.c
index 8bdf45b..5b3a766 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -1411,7 +1411,11 @@ static void set_params(void)
 		      chunk_size, buffer_size);
 		prg_exit(EXIT_FAILURE);
 	}
-	snd_pcm_sw_params_current(handle, swparams);
+	err = snd_pcm_sw_params_current(handle, swparams);
+	if (err < 0) {
+		error(_("Unable to get current sw params."));
+		prg_exit(EXIT_FAILURE);
+	}
 	if (avail_min < 0)
 		n = chunk_size;
 	else
-- 
2.20.1


From 8c026b9562dbdfc222bcd637dfb85b85f4e95412 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 13 Mar 2019 14:31:57 +0100
Subject: [PATCH 18/20] alsactl: monitor - remove dead code in run_dispatcher()
 (coverity)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 alsactl/monitor.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/alsactl/monitor.c b/alsactl/monitor.c
index 282fb1c..6b090e4 100644
--- a/alsactl/monitor.c
+++ b/alsactl/monitor.c
@@ -369,8 +369,6 @@ static int run_dispatcher(int epfd, int sigfd, int infd, struct list_head *srcs,
 				remove_source_entry(entry);
 			}
 		}
-		if (err < 0)
-			break;
 	}
 end:
 	free(epev);
-- 
2.20.1


From 8dcc3a1391ade9f714143038cf6f816fad1cc2df Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 13 Mar 2019 14:47:23 +0100
Subject: [PATCH 19/20] alsaloop: remove unused assignment warning (coverity)

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 alsaloop/pcmjob.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/alsaloop/pcmjob.c b/alsaloop/pcmjob.c
index 4c9517b..29d1aba 100644
--- a/alsaloop/pcmjob.c
+++ b/alsaloop/pcmjob.c
@@ -293,7 +293,7 @@ static int increase_playback_avail_min(struct loopback_handle *lhandle)
 		/* avoid 100% CPU usage for broken plugins */
 		ts.tv_sec = 0;
 		ts.tv_nsec = 10000;
-		err = nanosleep(&ts, NULL);
+		nanosleep(&ts, NULL);
 		return 0;
 	}
 	snd_pcm_sw_params_alloca(&swparams);
-- 
2.20.1


From 30f9a14a7964c650fb6b2b559d6fc879844b21b4 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 13 Mar 2019 14:51:12 +0100
Subject: [PATCH 20/20] axfer: return back unsigned avail variable, do proper
 retype in xfer-libasound-irq-mmap.c

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 axfer/xfer-libasound-irq-mmap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/axfer/xfer-libasound-irq-mmap.c b/axfer/xfer-libasound-irq-mmap.c
index 0fbbcc6..71ee79f 100644
--- a/axfer/xfer-libasound-irq-mmap.c
+++ b/axfer/xfer-libasound-irq-mmap.c
@@ -75,7 +75,7 @@ static int irq_mmap_process_frames(struct libasound_state *state,
 	struct map_layout *layout = state->private_data;
 	const snd_pcm_channel_area_t *areas;
 	snd_pcm_uframes_t frame_offset;
-	snd_pcm_sframes_t avail;
+	snd_pcm_uframes_t avail;
 	unsigned int avail_count;
 	void *frame_buf;
 	snd_pcm_sframes_t consumed_count;
@@ -110,7 +110,7 @@ static int irq_mmap_process_frames(struct libasound_state *state,
 	// MEMO: either snd_pcm_avail_update() and snd_pcm_mmap_begin() can
 	// return the same number of available frames.
 	avail = snd_pcm_avail_update(state->handle);
-	if (avail < 0)
+	if ((snd_pcm_sframes_t)avail < 0)
 		return (int)avail;
 	if (*frame_count < avail)
 		avail = *frame_count;
-- 
2.20.1