diff --git a/.alsa-utils.metadata b/.alsa-utils.metadata
index 08c12c1..1a39e85 100644
--- a/.alsa-utils.metadata
+++ b/.alsa-utils.metadata
@@ -1 +1 @@
-ced2769a2de140c7b7d9c06373d0d9d2b6d3ed01 SOURCES/alsa-utils-1.0.28.tar.bz2
+a5fb61b41685001c9a2a41a38e61cdaf7e60ef2e SOURCES/alsa-utils-1.1.1.tar.bz2
diff --git a/.gitignore b/.gitignore
index 3a7d72c..1667f88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/alsa-utils-1.0.28.tar.bz2
+SOURCES/alsa-utils-1.1.1.tar.bz2
diff --git a/SOURCES/alsa-delay.1 b/SOURCES/alsa-delay.1
new file mode 100644
index 0000000..eafa81f
--- /dev/null
+++ b/SOURCES/alsa-delay.1
@@ -0,0 +1,78 @@
+.TH ALSA-DELAY 1 "6 Jane 2016"
+.SH NAME
+alsadelay \- a command to (re)initialize sound hardware
+
+.SH SYNOPSIS
+\fBalsa-delay\fP \fI[options]\fP \fIrequested_delay_in_ms\fP [\fIoutput_card\fP[,\fIdevice\fP]]
+
+.SH DESCRIPTION
+\fBalsa-delay\fP is a command\-line utility to setup an audio
+delay. The snd-aloop ALSA driver is used to send all PCM streams
+back to the user space and the alsaloop utility is used to send
+this stream to a real hardware.
+
+The parameter \fIoutput_card\fP is ALSA card index (number) or
+string card identifier. The parameter \fIdevice\fP is ALSA device number.
+
+Use \fIaplay -l\fP to list available cards and devices.
+
+
+.SH OPTIONS
+.TP
+\fI\-\-h,\-\-help\fP
+Print help.
+.TP
+\fI\-\-q,\-\-quiet\fP
+Quiet mode.
+.TP
+\fI\-\-y,\-\-yes\fP
+Do not ask any questions - answer is always yes.
+.TP
+\fI\-\-c,\-\-clean\fP
+Clean temporary directory.
+.TP
+\fI\-\-r,\-\-remove\fP
+Remove the alsa-delay config modifications (modprobe, pulse-audio).
+.TP
+\fI\-\-tmpdir=
\fP
+Set temporary directory.
+
+.SH OPTIONS (for alsaloop daemon)
+.TP
+\fI\-\-pdevice=\fP
+Force playback device.
+.TP
+\fI\-\-cdevice=\fP
+Force capture device.
+.TP
+\fI\-\-pctl=\fP
+Force playback control device.
+.TP
+\fI\-\-cctl=\fP
+Force capture control device.
+.TP
+\fI\-\-one=\fP
+Pass this argument to last thread.
+.TP
+\fI\-\-arg=\fP
+Pass this argument to all threads.
+.TP
+\fI\-\-mix=\fP
+Redirect ALSA mixer controls to OSS mixer (default is Master).
+.TP
+\fI\-\-pa\fP
+Redirect pulse-audio to alsaloop.
+
+.SH NOTE
+
+For devices, the string %s is replaced with the card index
+and second string %s is replaced with the device index
+and third string %s is replaced the substream index (0-7).
+
+Example: hw:%s,%s,%s (card, device, substream)
+
+.SH SEE ALSO
+\fB
+alsaloop(1)
+amixer(1)
+alsamixer(1)
diff --git a/SOURCES/alsa-restore.service b/SOURCES/alsa-restore.service
index 4e9466b..0411c99 100644
--- a/SOURCES/alsa-restore.service
+++ b/SOURCES/alsa-restore.service
@@ -4,14 +4,13 @@
#
[Unit]
-Description=Restore Sound Card State
+Description=Save/Restore Sound Card State
ConditionPathExists=!/etc/alsa/state-daemon.conf
-DefaultDependencies=no
After=alsa-state.service
-Before=shutdown.target
-Conflicts=shutdown.target
[Service]
Type=oneshot
+RemainAfterExit=true
ExecStart=-/sbin/alsactl -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main restore
+ExecStop=/sbin/alsactl -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf store
StandardOutput=syslog
diff --git a/SOURCES/alsa-state.service b/SOURCES/alsa-state.service
index 9b906de..f917da8 100644
--- a/SOURCES/alsa-state.service
+++ b/SOURCES/alsa-state.service
@@ -6,10 +6,7 @@
[Unit]
Description=Manage Sound Card State (restore and store)
ConditionPathExists=/etc/alsa/state-daemon.conf
-DefaultDependencies=no
After=sysinit.target
-Before=shutdown.target
-Conflicts=shutdown.target
[Service]
Type=simple
diff --git a/SOURCES/alsa-utils-1.0.28-duration.patch b/SOURCES/alsa-utils-1.0.28-duration.patch
deleted file mode 100644
index 199c901..0000000
--- a/SOURCES/alsa-utils-1.0.28-duration.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 8f361d83cfcb39887f5fc591633e68d9448e3425 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 1 Oct 2014 15:43:57 +0200
-Subject: [PATCH] Revert "aplay: fix pcm_read() return value"
-
-This reverts commit 8aa13eec80eac312e4b99423909387660fb99b8f.
-
-The semantics for pcm_read() and pcm_readv() was changed, but the
-callers expect the exact frame count as requested. It's possible
-to fix callers, but the fix is more complicated than to revert the
-change. Note that '-d' processing was broken in some cases.
-
-Note: The reverted commit allows that the return value might be
-greater than requested (see the first condition in read routines).
----
- aplay/aplay.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/aplay/aplay.c b/aplay/aplay.c
-index 30d3f31..e58e1bc 100644
---- a/aplay/aplay.c
-+++ b/aplay/aplay.c
-@@ -2039,7 +2039,7 @@ static ssize_t pcm_read(u_char *data, size_t rcount)
- data += r * bits_per_frame / 8;
- }
- }
-- return result;
-+ return rcount;
- }
-
- static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
-@@ -2084,7 +2084,7 @@ static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
- count -= r;
- }
- }
-- return result;
-+ return rcount;
- }
-
- /*
---
-1.9.3
-
diff --git a/SOURCES/alsa-utils-1.0.28-post.patch b/SOURCES/alsa-utils-1.0.28-post.patch
deleted file mode 100644
index 1e7caef..0000000
--- a/SOURCES/alsa-utils-1.0.28-post.patch
+++ /dev/null
@@ -1,1314 +0,0 @@
-diff --git a/Makefile.am b/Makefile.am
-index f25eee2..248eb11 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -1,6 +1,6 @@
- AM_CPPFLAGS=-I$(top_srcdir)/include
-
--SUBDIRS = include alsactl alsaucm utils m4 po
-+SUBDIRS = include alsactl alsaucm utils m4 po alsa-info
- if ALSAMIXER
- SUBDIRS += alsamixer
- endif
-diff --git a/alsa-info/Makefile.am b/alsa-info/Makefile.am
-new file mode 100644
-index 0000000..1a47e60
---- /dev/null
-+++ b/alsa-info/Makefile.am
-@@ -0,0 +1 @@
-+sbin_SCRIPTS = alsa-info.sh
-diff --git a/alsa-info/alsa-info.sh b/alsa-info/alsa-info.sh
-new file mode 100755
-index 0000000..acd8495
---- /dev/null
-+++ b/alsa-info/alsa-info.sh
-@@ -0,0 +1,943 @@
-+#!/bin/bash
-+
-+SCRIPT_VERSION=0.4.64
-+CHANGELOG="http://www.alsa-project.org/alsa-info.sh.changelog"
-+
-+#################################################################################
-+#Copyright (C) 2007 Free Software Foundation.
-+
-+#This program is free software; you can redistribute it and/or modify
-+#it under the terms of the GNU General Public License as published by
-+#the Free Software Foundation; either version 2 of the License, or
-+#(at your option) any later version.
-+
-+#This program is distributed in the hope that it will be useful,
-+#but WITHOUT ANY WARRANTY; without even the implied warranty of
-+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+#GNU General Public License for more details.
-+
-+#You should have received a copy of the GNU General Public License
-+#along with this program; if not, write to the Free Software
-+#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+
-+##################################################################################
-+
-+#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)
-+PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
-+BGTITLE="ALSA-Info v $SCRIPT_VERSION"
-+PASTEBINKEY="C9cRIO8m/9y8Cs0nVs0FraRx7U0pHsuc"
-+#Define some simple functions
-+
-+pbcheck(){
-+ [[ $UPLOAD = "no" ]] && return
-+
-+ if [[ -z $PASTEBIN ]]; then
-+ [[ $(ping -c1 www.alsa-project.org) ]] || KEEP_FILES="yes" UPLOAD="no" PBERROR="yes"
-+ else
-+ [[ $(ping -c1 www.pastebin.ca) ]] || KEEP_FILES="yes" UPLOAD="no" PBERROR="yes"
-+ fi
-+}
-+
-+update() {
-+ 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/.*=//'`
-+ if [ "$REMOTE_VERSION" != "$SCRIPT_VERSION" ]; then
-+ if [[ -n $DIALOG ]]
-+ then
-+ OVERWRITE=
-+ if [ -w $0 ]; then
-+ dialog --yesno "Newer version of ALSA-Info has been found\n\nDo you wish to install it?\nNOTICE: The original file $0 will be overwritten!" 0 0
-+ DIALOG_EXIT_CODE=$?
-+ if [[ $DIALOG_EXIT_CODE = 0 ]]; then
-+ OVERWRITE=yes
-+ fi
-+ fi
-+ if [ -z "$OVERWRITE" ]; then
-+ dialog --yesno "Newer version of ALSA-Info has been found\n\nDo you wish to download it?" 0 0
-+ DIALOG_EXIT_CODE=$?
-+ fi
-+ if [[ $DIALOG_EXIT_CODE = 0 ]]
-+ then
-+ echo "Newer version detected: $REMOTE_VERSION"
-+ echo "To view the ChangeLog, please visit $CHANGELOG"
-+ if [ "$OVERWRITE" = "yes" ]; then
-+ cp $SHFILE $0
-+ echo "ALSA-Info script has been updated to v $REMOTE_VERSION"
-+ echo "Please re-run the script"
-+ rm $SHFILE 2>/dev/null
-+ else
-+ echo "ALSA-Info script has been downloaded as $SHFILE."
-+ echo "Please re-run the script from new location."
-+ fi
-+ exit
-+ else
-+ rm $SHFILE 2>/dev/null
-+ fi
-+ else
-+ echo "Newer version detected: $REMOTE_VERSION"
-+ echo "To view the ChangeLog, please visit $CHANGELOG"
-+ if [ -w $0 ]; then
-+ echo "The original file $0 will be overwritten!"
-+ echo -n "If you do not like to proceed, press Ctrl-C now.." ; read inp
-+ cp $SHFILE $0
-+ echo "ALSA-Info script has been updated. Please re-run it."
-+ rm $SHFILE 2>/dev/null
-+ else
-+ echo "ALSA-Info script has been downloaded $SHFILE."
-+ echo "Please, re-run it from new location."
-+ fi
-+ exit
-+ fi
-+ else
-+ rm $SHFILE 2>/dev/null
-+ fi
-+}
-+
-+cleanup() {
-+ if [ -n "$TEMPDIR" -a "$KEEP_FILES" != "yes" ]; then
-+ rm -rf "$TEMPDIR" 2>/dev/null
-+ fi
-+ test -n "$KEEP_OUTPUT" || rm -f "$NFILE"
-+}
-+
-+
-+withaplay() {
-+ echo "!!Aplay/Arecord output" >> $FILE
-+ echo "!!--------------------" >> $FILE
-+ echo "" >> $FILE
-+ echo "APLAY" >> $FILE
-+ echo "" >> $FILE
-+ aplay -l >> $FILE 2>&1
-+ echo "" >> $FILE
-+ echo "ARECORD" >> $FILE
-+ echo "" >> $FILE
-+ arecord -l >> $FILE 2>&1
-+ echo "" >> $FILE
-+}
-+
-+withlsmod() {
-+ echo "!!All Loaded Modules" >> $FILE
-+ echo "!!------------------" >> $FILE
-+ echo "" >> $FILE
-+ lsmod |awk {'print $1'} >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+}
-+
-+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
-+ done
-+ echo "" >> $FILE
-+}
-+
-+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
-+ echo "--startcollapse--" >> $FILE
-+ cat $TEMPDIR/alsactl.tmp >> $FILE
-+ echo "--endcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+}
-+
-+withdevices() {
-+ echo "!!ALSA Device nodes" >> $FILE
-+ echo "!!-----------------" >> $FILE
-+ echo "" >> $FILE
-+ ls -la /dev/snd/* >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+}
-+
-+withconfigs() {
-+if [[ -e $HOME/.asoundrc ]] || [[ -e /etc/asound.conf ]] || [[ -e $HOME/.asoundrc.asoundconf ]]
-+then
-+ echo "!!ALSA configuration files" >> $FILE
-+ echo "!!------------------------" >> $FILE
-+ echo "" >> $FILE
-+
-+ #Check for ~/.asoundrc
-+ if [[ -e $HOME/.asoundrc ]]
-+ then
-+ echo "!!User specific config file (~/.asoundrc)" >> $FILE
-+ echo "" >> $FILE
-+ cat $HOME/.asoundrc >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+ #Check for .asoundrc.asoundconf (seems to be Ubuntu specific)
-+ if [[ -e $HOME/.asoundrc.asoundconf ]]
-+ then
-+ echo "!!asoundconf-generated config file" >> $FILE
-+ echo "" >> $FILE
-+ cat $HOME/.asoundrc.asoundconf >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+ #Check for /etc/asound.conf
-+ if [[ -e /etc/asound.conf ]]
-+ then
-+ echo "!!System wide config file (/etc/asound.conf)" >> $FILE
-+ echo "" >> $FILE
-+ cat /etc/asound.conf >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+fi
-+}
-+
-+withsysfs() {
-+ local i f
-+ local printed=""
-+ for i in /sys/class/sound/*; do
-+ case "$i" in
-+ */hwC?D?)
-+ if [ -f $i/init_pin_configs ]; then
-+ if [ -z "$printed" ]; then
-+ echo "!!Sysfs Files" >> $FILE
-+ echo "!!-----------" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+ for f in init_pin_configs driver_pin_configs user_pin_configs init_verbs hints; do
-+ echo "$i/$f:" >> $FILE
-+ cat $i/$f >> $FILE
-+ echo >> $FILE
-+ done
-+ printed=yes
-+ fi
-+ ;;
-+ esac
-+ done
-+ if [ -n "$printed" ]; then
-+ echo "" >> $FILE
-+ fi
-+}
-+
-+withdmesg() {
-+ echo "!!ALSA/HDA dmesg" >> $FILE
-+ echo "!!--------------" >> $FILE
-+ echo "" >> $FILE
-+ dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+}
-+
-+withall() {
-+ withdevices
-+ withconfigs
-+ withaplay
-+ withamixer
-+ withalsactl
-+ withlsmod
-+ withsysfs
-+ withdmesg
-+ WITHALL="no"
-+}
-+
-+get_alsa_library_version() {
-+ 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
-+ . /etc/lsb-release
-+ 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 -`
-+ fi
-+
-+ if [ "$ALSA_LIB_VERSION" = "" ]; then
-+ ALSA_LIB_VERSION=""
-+ fi
-+ return
-+ ;;
-+ *)
-+ return
-+ ;;
-+ 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 -`
-+ fi
-+
-+ if [ "$ALSA_LIB_VERSION" = "" ]; then
-+ ALSA_LIB_VERSION=""
-+ fi
-+ return
-+ fi
-+ fi
-+}
-+
-+
-+#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 modprobe config files for sound related options
-+SNDOPTIONS=$(modprobe -c|sed -n 's/^options \(snd[-_][^ ]*\)/\1:/p')
-+
-+KEEP_OUTPUT=
-+NFILE=""
-+
-+PASTEBIN=""
-+WWWSERVICE="www.alsa-project.org"
-+WELCOME="yes"
-+PROCEED="yes"
-+UPLOAD="ask"
-+REPEAT=""
-+while [ -z "$REPEAT" ]; do
-+REPEAT="no"
-+case "$1" in
-+ --update|--help|--about)
-+ WELCOME="no"
-+ PROCEED="no"
-+ ;;
-+ --upload)
-+ UPLOAD="yes"
-+ WELCOME="no"
-+ ;;
-+ --no-upload)
-+ UPLOAD="no"
-+ WELCOME="no"
-+ ;;
-+ --pastebin)
-+ PASTEBIN="yes"
-+ WWWSERVICE="pastebin"
-+ ;;
-+ --no-dialog)
-+ DIALOG=""
-+ REPEAT=""
-+ shift
-+ ;;
-+ --stdout)
-+ DIALOG=""
-+ UPLOAD="no"
-+ WELCOME="no"
-+ TOSTDOUT="yes"
-+ ;;
-+esac
-+done
-+
-+
-+#Script header output.
-+if [ "$WELCOME" = "yes" ]; then
-+greeting_message="\
-+
-+This script visits the following commands/files to collect diagnostic
-+information about your ALSA installation and sound related hardware.
-+
-+ dmesg
-+ lspci
-+ lsmod
-+ aplay
-+ amixer
-+ alsactl
-+ /proc/asound/
-+ /sys/class/sound/
-+ ~/.asoundrc (etc.)
-+
-+See '$0 --help' for command line options.
-+"
-+if [ -n "$DIALOG" ]; then
-+ dialog --backtitle "$BGTITLE" \
-+ --title "ALSA-Info script v $SCRIPT_VERSION" \
-+ --msgbox "$greeting_message" 20 80
-+else
-+ echo "ALSA Information Script v $SCRIPT_VERSION"
-+ echo "--------------------------------"
-+ echo "$greeting_message"
-+fi # dialog
-+fi # WELCOME
-+
-+#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
-+fi
-+
-+trap cleanup 0
-+
-+if [ "$PROCEED" = "yes" ]; then
-+
-+if [ -z "$LSPCI" ]; then
-+ if [ -d /sys/bus/pci ]; then
-+ echo "This script requires lspci. Please install it, and re-run this script."
-+ exit 0
-+ 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/\.$//'`
-+get_alsa_library_version
-+ALSA_UTILS_VERSION=`amixer -v |awk {'print $3'}`
-+LAST_CARD=$((`grep "]: " /proc/asound/cards | wc -l` - 1 ))
-+
-+ESDINST=$(which esd 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+PAINST=$(which pulseaudio 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+ARTSINST=$(which artsd 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+JACKINST=$(which jackd 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+ROARINST=$(which roard 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+DMIDECODE=$(which dmidecode 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null)
-+
-+#Check for DMI data
-+if [ -d /sys/class/dmi/id ]; then
-+ # No root privileges are required when using sysfs method
-+ DMI_SYSTEM_MANUFACTURER=$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null)
-+ DMI_SYSTEM_PRODUCT_NAME=$(cat /sys/class/dmi/id/product_name 2>/dev/null)
-+ DMI_SYSTEM_PRODUCT_VERSION=$(cat /sys/class/dmi/id/product_version 2>/dev/null)
-+ DMI_SYSTEM_FIRMWARE_VERSION=$(cat /sys/class/dmi/id/bios_version 2>/dev/null)
-+elif [ -x $DMIDECODE ]; then
-+ DMI_SYSTEM_MANUFACTURER=$($DMIDECODE -s system-manufacturer 2>/dev/null)
-+ DMI_SYSTEM_PRODUCT_NAME=$($DMIDECODE -s system-product-name 2>/dev/null)
-+ DMI_SYSTEM_PRODUCT_VERSION=$($DMIDECODE -s system-version 2>/dev/null)
-+ DMI_SYSTEM_FIRMWARE_VERSION=$($DMIDECODE -s bios-version 2>/dev/null)
-+fi
-+
-+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
-+fi
-+
-+#Check for HDA-Intel cards codec#*
-+cat /proc/asound/card*/codec\#* > $TEMPDIR/alsa-hda-intel.tmp 2> /dev/null
-+
-+#Check for AC97 cards codec
-+cat /proc/asound/card*/codec97\#0/ac97\#0-0 > $TEMPDIR/alsa-ac97.tmp 2> /dev/null
-+cat /proc/asound/card*/codec97\#0/ac97\#0-0+regs > $TEMPDIR/alsa-ac97-regs.tmp 2> /dev/null
-+
-+#Check for USB mixer setup
-+cat /proc/asound/card*/usbmixer > $TEMPDIR/alsa-usbmixer.tmp 2> /dev/null
-+
-+#Fetch the info, and put it in $FILE in a nice readable format.
-+if [[ -z $PASTEBIN ]]; then
-+echo "upload=true&script=true&cardinfo=" > $FILE
-+else
-+echo "name=$USER&type=33&description=/tmp/alsa-info.txt&expiry=&s=Submit+Post&content=" > $FILE
-+fi
-+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 "" >> $FILE
-+echo "" >> $FILE
-+echo "!!Linux Distribution" >> $FILE
-+echo "!!------------------" >> $FILE
-+echo "" >> $FILE
-+echo $DISTRO >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!DMI Information" >> $FILE
-+echo "!!---------------" >> $FILE
-+echo "" >> $FILE
-+echo "Manufacturer: $DMI_SYSTEM_MANUFACTURER" >> $FILE
-+echo "Product Name: $DMI_SYSTEM_PRODUCT_NAME" >> $FILE
-+echo "Product Version: $DMI_SYSTEM_PRODUCT_VERSION" >> $FILE
-+echo "Firmware Version: $DMI_SYSTEM_FIRMWARE_VERSION" >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!Kernel Information" >> $FILE
-+echo "!!------------------" >> $FILE
-+echo "" >> $FILE
-+echo "Kernel release: $KERNEL_VERSION" >> $FILE
-+echo "Operating System: $KERNEL_OS" >> $FILE
-+echo "Architecture: $KERNEL_MACHINE" >> $FILE
-+echo "Processor: $KERNEL_PROCESSOR" >> $FILE
-+echo "SMP Enabled: $KERNEL_SMP" >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!ALSA Version" >> $FILE
-+echo "!!------------" >> $FILE
-+echo "" >> $FILE
-+echo "Driver version: $ALSA_DRIVER_VERSION" >> $FILE
-+echo "Library version: $ALSA_LIB_VERSION" >> $FILE
-+echo "Utilities version: $ALSA_UTILS_VERSION" >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!Loaded ALSA modules" >> $FILE
-+echo "!!-------------------" >> $FILE
-+echo "" >> $FILE
-+cat $TEMPDIR/alsamodules.tmp >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!Sound Servers on this system" >> $FILE
-+echo "!!----------------------------" >> $FILE
-+echo "" >> $FILE
-+if [[ -n $PAINST ]];then
-+[[ `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"
-+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"
-+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"
-+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"
-+echo "RoarAudio:" >> $FILE
-+echo " Installed - Yes ($ROARINST)" >> $FILE
-+echo " Running - $ROARRUNNING" >> $FILE
-+echo "" >> $FILE
-+fi
-+if [[ -z "$PAINST" && -z "$ESDINST" && -z "$ARTSINST" && -z "$JACKINST" && -z "$ROARINST" ]];then
-+echo "No sound servers found." >> $FILE
-+echo "" >> $FILE
-+fi
-+echo "" >> $FILE
-+echo "!!Soundcards recognised by ALSA" >> $FILE
-+echo "!!-----------------------------" >> $FILE
-+echo "" >> $FILE
-+cat $TEMPDIR/alsacards.tmp >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+
-+if [[ ! -z "$LSPCI" ]]; then
-+echo "!!PCI Soundcards installed in the system" >> $FILE
-+echo "!!--------------------------------------" >> $FILE
-+echo "" >> $FILE
-+cat $TEMPDIR/lspci.tmp >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+echo "!!Advanced information - PCI Vendor/Device/Subsystem ID's" >> $FILE
-+echo "!!-------------------------------------------------------" >> $FILE
-+echo "" >> $FILE
-+lspci -vvn |grep -A1 040[1-3] >> $FILE
-+echo "" >> $FILE
-+echo "" >> $FILE
-+fi
-+
-+if [ "$SNDOPTIONS" ]
-+then
-+echo "!!Modprobe options (Sound related)" >> $FILE
-+echo "!!--------------------------------" >> $FILE
-+echo "" >> $FILE
-+modprobe -c|sed -n 's/^options \(snd[-_][^ ]*\)/\1:/p' >> $FILE
-+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
-+fi
-+
-+if [ -s "$TEMPDIR/alsa-hda-intel.tmp" ]; then
-+ echo "!!HDA-Intel Codec information" >> $FILE
-+ echo "!!---------------------------" >> $FILE
-+ echo "--startcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ cat $TEMPDIR/alsa-hda-intel.tmp >> $FILE
-+ echo "--endcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+fi
-+
-+if [ -s "$TEMPDIR/alsa-ac97.tmp" ]; then
-+ echo "!!AC97 Codec information" >> $FILE
-+ echo "!!----------------------" >> $FILE
-+ echo "--startcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ cat $TEMPDIR/alsa-ac97.tmp >> $FILE
-+ echo "" >> $FILE
-+ cat $TEMPDIR/alsa-ac97-regs.tmp >> $FILE
-+ echo "--endcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+fi
-+
-+if [ -s "$TEMPDIR/alsa-usbmixer.tmp" ]; then
-+ echo "!!USB Mixer information" >> $FILE
-+ echo "!!---------------------" >> $FILE
-+ echo "--startcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ cat $TEMPDIR/alsa-usbmixer.tmp >> $FILE
-+ echo "--endcollapse--" >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+fi
-+
-+#If no command line options are specified, then run as though --with-all was specified
-+if [ -z "$1" ]; then
-+ update
-+ pbcheck
-+fi
-+
-+fi # proceed
-+
-+#loop through command line arguments, until none are left.
-+if [ -n "$1" ]; then
-+ until [ -z "$1" ]
-+ do
-+ case "$1" in
-+ --pastebin)
-+ update
-+ pbcheck
-+ ;;
-+ --update)
-+ update
-+ exit
-+ ;;
-+ --upload)
-+ UPLOAD="yes"
-+ ;;
-+ --no-upload)
-+ UPLOAD="no"
-+ ;;
-+ --output)
-+ shift
-+ NFILE="$1"
-+ KEEP_OUTPUT="yes"
-+ ;;
-+ --debug)
-+ echo "Debugging enabled. $FILE and $TEMPDIR will not be deleted"
-+ KEEP_FILES="yes"
-+ echo ""
-+ ;;
-+ --with-all)
-+ withall
-+ ;;
-+ --with-aplay)
-+ withaplay
-+ WITHALL="no"
-+ ;;
-+ --with-amixer)
-+ withamixer
-+ WITHALL="no"
-+ ;;
-+ --with-alsactl)
-+ withalsactl
-+ WITHALL="no"
-+ ;;
-+ --with-devices)
-+ withdevices
-+ WITHALL="no"
-+ ;;
-+ --with-dmesg)
-+ withdmesg
-+ WITHALL="no"
-+ ;;
-+ --with-configs)
-+ WITHALL="no"
-+ if [[ -e $HOME/.asoundrc ]] || [[ -e /etc/asound.conf ]]
-+ then
-+ echo "!!ALSA configuration files" >> $FILE
-+ echo "!!------------------------" >> $FILE
-+ echo "" >> $FILE
-+
-+ #Check for ~/.asoundrc
-+ if [[ -e $HOME/.asoundrc ]]
-+ then
-+ echo "!!User specific config file ($HOME/.asoundrc)" >> $FILE
-+ echo "" >> $FILE
-+ cat $HOME/.asoundrc >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+
-+ #Check for /etc/asound.conf
-+ if [[ -e /etc/asound.conf ]]
-+ then
-+ echo "!!System wide config file (/etc/asound.conf)" >> $FILE
-+ echo "" >> $FILE
-+ cat /etc/asound.conf >> $FILE
-+ echo "" >> $FILE
-+ echo "" >> $FILE
-+ fi
-+ fi
-+ ;;
-+ --stdout)
-+ UPLOAD="no"
-+ if [ -z "$WITHALL" ]; then
-+ withall
-+ fi
-+ cat $FILE
-+ rm $FILE
-+ ;;
-+ --about)
-+ echo "Written/Tested by the following users of #alsa on irc.freenode.net:"
-+ echo ""
-+ echo " wishie - Script author and developer / Testing"
-+ echo " crimsun - Various script ideas / Testing"
-+ echo " gnubien - Various script ideas / Testing"
-+ echo " GrueMaster - HDA Intel specific items / Testing"
-+ echo " olegfink - Script update function"
-+ echo " TheMuso - display to stdout functionality"
-+ exit 0
-+ ;;
-+ *)
-+ echo "alsa-info.sh version $SCRIPT_VERSION"
-+ echo ""
-+ echo "Available options:"
-+ echo " --with-aplay (includes the output of aplay -l)"
-+ echo " --with-amixer (includes the output of amixer)"
-+ echo " --with-alsactl (includes the output of alsactl)"
-+ echo " --with-configs (includes the output of ~/.asoundrc and"
-+ echo " /etc/asound.conf if they exist)"
-+ echo " --with-devices (shows the device nodes in /dev/snd/)"
-+ echo " --with-dmesg (shows the ALSA/HDA kernel messages)"
-+ echo ""
-+ echo " --output FILE (specify the file to output for no-upload mode)"
-+ echo " --update (check server for script updates)"
-+ echo " --upload (upload contents to remote server)"
-+ echo " --no-upload (do not upload contents to remote server)"
-+ echo " --pastebin (use http://pastebin.ca) as remote server"
-+ echo " instead www.alsa-project.org"
-+ echo " --stdout (print alsa information to standard output"
-+ echo " instead of a file)"
-+ echo " --about (show some information about the script)"
-+ echo " --debug (will run the script as normal, but will not"
-+ echo " delete $FILE)"
-+ exit 0
-+ ;;
-+ esac
-+ shift 1
-+ done
-+fi
-+
-+if [ "$PROCEED" = "no" ]; then
-+ exit 1
-+fi
-+
-+if [ -z "$WITHALL" ]; then
-+ withall
-+fi
-+
-+if [ "$UPLOAD" = "ask" ]; then
-+ if [ -n "$DIALOG" ]; then
-+ dialog --backtitle "$BGTITLE" --title "Information collected" --yes-label " UPLOAD / SHARE " --no-label " SAVE LOCALLY " --defaultno --yesno "\n\nAutomatically upload ALSA information to $WWWSERVICE?" 10 80
-+ DIALOG_EXIT_CODE=$?
-+ if [ $DIALOG_EXIT_CODE != 0 ]; then
-+ UPLOAD="no"
-+ else
-+ UPLOAD="yes"
-+ fi
-+ else
-+ echo -n "Automatically upload ALSA information to $WWWSERVICE? [y/N] : "
-+ read -e CONFIRM
-+ if [ "$CONFIRM" != "y" ]; then
-+ UPLOAD="no"
-+ else
-+ UPLOAD="yes"
-+ fi
-+ fi
-+
-+fi
-+
-+if [ "$UPLOAD" = "no" ]; then
-+
-+ if [ -z "$TOSTDOUT" ]; then
-+ mv -f $FILE $NFILE || exit 1
-+ KEEP_OUTPUT="yes"
-+ fi
-+
-+ if [[ -n $DIALOG ]]
-+ then
-+ if [[ -n $PBERROR ]]; then
-+ dialog --backtitle "$BGTITLE" --title "Information collected" --msgbox "An error occurred while contacting the $WWWSERVICE.\n Your information was NOT automatically uploaded.\n\nYour ALSA information is in $NFILE" 10 100
-+ else
-+ dialog --backtitle "$BGTITLE" --title "Information collected" --msgbox "\n\nYour ALSA information is in $NFILE" 10 60
-+ fi
-+ else
-+ echo
-+
-+ if [[ -n $PBERROR ]]; then
-+ echo "An error occurred while contacting the $WWWSERVICE."
-+ echo "Your information was NOT automatically uploaded."
-+ echo ""
-+ echo "Your ALSA information is in $NFILE"
-+ echo ""
-+ else
-+ if [ -z "$TOSTDOUT" ]; then
-+ echo ""
-+ echo "Your ALSA information is in $NFILE"
-+ echo ""
-+ fi
-+ fi
-+ fi
-+
-+ exit
-+
-+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
-+WGET=$(which wget 2>/dev/null| sed 's|^[^/]*||' 2>/dev/null); [[ -n "${WGET}" ]] && [[ -x "${WGET}" ]] && [[ `wget --help |grep post-file` ]]
-+then
-+
-+if [[ -n $DIALOG ]]
-+then
-+
-+if [[ -z $PASTEBIN ]]; then
-+ wget -O - --tries=5 --timeout=60 --post-file=$FILE "http://www.alsa-project.org/cardinfo-db/" &>$TEMPDIR/wget.tmp || echo "Upload failed; exit"
-+ { for i in 10 20 30 40 50 60 70 80 90; do
-+ echo $i
-+ sleep 0.2
-+ done
-+ echo; } |dialog --backtitle "$BGTITLE" --guage "Uploading information to www.alsa-project.org ..." 6 70 0
-+else
-+ wget -O - --tries=5 --timeout=60 --post-file=$FILE "http://pastebin.ca/quiet-paste.php?api=$PASTEBINKEY&encrypt=t&encryptpw=blahblah" &>$TEMPDIR/wget.tmp || echo "Upload failed; exit"
-+ { for i in 10 20 30 40 50 60 70 80 90; do
-+ echo $i
-+ sleep 0.2
-+ done
-+ echo; } |dialog --backtitle "$BGTITLE" --guage "Uploading information to www.pastebin.ca ..." 6 70 0
-+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
-+ dialog --backtitle "$BGTITLE" --textbox $TEMPDIR/uploaded.txt 0 0
-+fi
-+
-+clear
-+
-+# no dialog
-+else
-+
-+if [[ -z $PASTEBIN ]]; then
-+ echo -n "Uploading information to www.alsa-project.org ... "
-+ wget -O - --tries=5 --timeout=60 --post-file=$FILE http://www.alsa-project.org/cardinfo-db/ &>$TEMPDIR/wget.tmp &
-+else
-+ echo -n "Uploading information to www.pastebin.ca ... "
-+ wget -O - --tries=5 --timeout=60 --post-file=$FILE http://pastebin.ca/quiet-paste.php?api=$PASTEBINKEY &>$TEMPDIR/wget.tmp &
-+fi
-+
-+#Progess spinner for wget transfer.
-+i=1
-+sp="/-\|"
-+echo -n ' '
-+while pgrep wget &>/dev/null
-+do
-+ echo -en "\b${sp:i++%${#sp}:1}"
-+done
-+
-+echo -e "\b Done!"
-+echo ""
-+
-+fi #dialog
-+
-+#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`
-+ else
-+ 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`
-+ else
-+ FINAL_URL=`grep "SUCCESS:" $TEMPDIR/wget.tmp | sed -n 's/.*\:\([0-9]\+\).*/http:\/\/pastebin.ca\/\1/p'`
-+ fi
-+fi
-+
-+# Output the URL of the uploaded file.
-+echo "Your ALSA information is located at $FINAL_URL"
-+echo "Please inform the person helping you."
-+echo ""
-+
-+# We couldnt find a suitable wget, so tell the user to upload manually.
-+else
-+ mv -f $FILE $NFILE || exit 1
-+ KEEP_OUTPUT="yes"
-+ if [[ -z $DIALOG ]]
-+ then
-+ if [[ -z $PASTEBIN ]]; then
-+ echo ""
-+ echo "Could not automatically upload output to http://www.alsa-project.org"
-+ echo "Possible reasons are:"
-+ echo " 1. Couldnt find 'wget' in your PATH"
-+ echo " 2. Your version of wget is less than 1.8.2"
-+ echo ""
-+ echo "Please manually upload $NFILE to http://www.alsa-project.org/cardinfo-db/ and submit your post."
-+ echo ""
-+ else
-+ echo ""
-+ echo "Could not automatically upload output to http://www.pastebin.ca"
-+ echo "Possible reasons are:"
-+ echo " 1. Couldnt find 'wget' in your PATH"
-+ echo " 2. Your version of wget is less than 1.8.2"
-+ echo ""
-+ echo "Please manually upload $NFILE to http://www.pastebin.ca/upload.php and submit your post."
-+ echo ""
-+ fi
-+ else
-+ if [[ -z $PASTEBIN ]]; then
-+ dialog --backtitle "$BGTITLE" --msgbox "Could not automatically upload output to http://www.alsa-project.org.\nPossible reasons are:\n\n 1. Couldn't find 'wget' in your PATH\n 2. Your version of wget is less than 1.8.2\n\nPlease manually upload $NFILE to http://www.alsa-project,org/cardinfo-db/ and submit your post." 25 100
-+ else
-+ dialog --backtitle "$BGTITLE" --msgbox "Could not automatically upload output to http://www.pastebin.ca.\nPossible reasons are:\n\n 1. Couldn't find 'wget' in your PATH\n 2. Your version of wget is less than 1.8.2\n\nPlease manually upload $NFILE to http://www.pastebin.ca/upload.php and submit your post." 25 100
-+ fi
-+ fi
-+fi
-diff --git a/alsactl/state.c b/alsactl/state.c
-index c33f501..e0c6f2e 100644
---- a/alsactl/state.c
-+++ b/alsactl/state.c
-@@ -1626,7 +1626,7 @@ int save_state(const char *file, const char *cardname)
- snd_output_close(out);
- if (err < 0) {
- error("snd_config_save: %s", snd_strerror(err));
-- } else {
-+ } else if (nfile) {
- err = rename(nfile, file);
- if (err < 0)
- error("rename failed: %s (%s)", strerror(-err), file);
-diff --git a/alsamixer/mainloop.c b/alsamixer/mainloop.c
-index 351f57f..79d81a9 100644
---- a/alsamixer/mainloop.c
-+++ b/alsamixer/mainloop.c
-@@ -29,6 +29,7 @@
- #include "widget.h"
- #include "mixer_widget.h"
- #include "mixer_display.h"
-+#include "mixer_controls.h"
- #include "mainloop.h"
-
- static WINDOW *curses_initialized;
-diff --git a/configure.ac b/configure.ac
-index a4d2db3..3c7032b 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -360,4 +360,4 @@ AC_OUTPUT(Makefile alsactl/Makefile alsactl/init/Makefile \
- utils/alsa-utils.spec seq/Makefile seq/aconnect/Makefile \
- seq/aplaymidi/Makefile seq/aseqdump/Makefile seq/aseqnet/Makefile \
- speaker-test/Makefile speaker-test/samples/Makefile \
-- alsaloop/Makefile)
-+ alsaloop/Makefile alsa-info/Makefile)
-From 1363f852e92c1c913474fc015f9da12d1e93d750 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 24 Sep 2014 10:35:53 +0200
-Subject: [PATCH] alsactl: Fix the file locking routines (for the state
- management)
-
----
- alsactl/alsactl.h | 3 ++-
- alsactl/lock.c | 41 +++++++++++++++++++++++++++++++----------
- alsactl/state.c | 22 +++++++++++++---------
- 3 files changed, 46 insertions(+), 20 deletions(-)
-
-diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
-index 76e8c36..bd9bf23 100644
---- a/alsactl/alsactl.h
-+++ b/alsactl/alsactl.h
-@@ -25,7 +25,8 @@ void dbg_(const char *fcn, long line, const char *fmt, ...);
- #endif
-
- int init(const char *file, const char *cardname);
--int state_lock(const char *file, int lock, int timeout);
-+int state_lock(const char *file, int timeout);
-+int state_unlock(int fd, const char *file);
- int save_state(const char *file, const char *cardname);
- int load_state(const char *file, const char *initfile, const char *cardname,
- int do_init);
-diff --git a/alsactl/lock.c b/alsactl/lock.c
-index 6f85f20..9d7efcc 100644
---- a/alsactl/lock.c
-+++ b/alsactl/lock.c
-@@ -30,7 +30,7 @@
- #include
- #include "alsactl.h"
-
--static int state_lock_(const char *file, int lock, int timeout)
-+static int state_lock_(const char *file, int lock, int timeout, int _fd)
- {
- int fd = -1, err = 0;
- struct flock lck;
-@@ -50,9 +50,14 @@ static int state_lock_(const char *file, int lock, int timeout)
- snprintf(lcktxt, sizeof(lcktxt), "%10li\n", (long)getpid());
- } else {
- snprintf(lcktxt, sizeof(lcktxt), "%10s\n", "");
-+ fd = _fd;
- }
- while (fd < 0 && timeout-- > 0) {
- fd = open(nfile, O_RDWR);
-+ if (!lock && fd < 0) {
-+ err = -EIO;
-+ goto out;
-+ }
- if (fd < 0) {
- fd = open(nfile, O_RDWR|O_CREAT|O_EXCL, 0644);
- if (fd < 0) {
-@@ -74,12 +79,12 @@ static int state_lock_(const char *file, int lock, int timeout)
- err = -errno;
- goto out;
- }
-- if (st.st_size != 11) {
-+ if (st.st_size != 11 || !lock) {
- if (write(fd, lcktxt, 11) != 11) {
- err = -EIO;
- goto out;
- }
-- if (lseek(fd, 0, SEEK_SET)) {
-+ if (lock && lseek(fd, 0, SEEK_SET)) {
- err = -errno;
- goto out;
- }
-@@ -96,21 +101,37 @@ static int state_lock_(const char *file, int lock, int timeout)
- err = -EBUSY;
- goto out;
- }
-- if (write(fd, lcktxt, 11) != 11) {
-- err = -EIO;
-- goto out;
-+ if (lock) {
-+ if (write(fd, lcktxt, 11) != 11) {
-+ err = -EIO;
-+ goto out;
-+ }
-+ return fd;
- }
-+ err = 0;
-+
- out:
-+ if (fd >= 0)
-+ close(fd);
-+ return err;
-+}
-+
-+int state_lock(const char *file, int timeout)
-+{
-+ int err;
-+
-+ err = state_lock_(file, 1, timeout, -1);
-+ if (err < 0)
-+ error("file %s lock error: %s", file, strerror(-err));
- return err;
- }
-
--int state_lock(const char *file, int lock, int timeout)
-+int state_unlock(int _fd, const char *file)
- {
- int err;
-
-- err = state_lock_(file, lock, timeout);
-+ err = state_lock_(file, 0, 10, _fd);
- if (err < 0)
-- error("file %s %slock error: %s", file,
-- lock ? "" : "un", strerror(-err));
-+ error("file %s unlock error: %s", file, strerror(-err));
- return err;
- }
-diff --git a/alsactl/state.c b/alsactl/state.c
-index e0c6f2e..0c89703 100644
---- a/alsactl/state.c
-+++ b/alsactl/state.c
-@@ -1544,6 +1544,7 @@ int save_state(const char *file, const char *cardname)
- snd_output_t *out;
- int stdio;
- char *nfile = NULL;
-+ int lock_fd = -EINVAL;
-
- err = snd_config_top(&config);
- if (err < 0) {
-@@ -1555,12 +1556,16 @@ int save_state(const char *file, const char *cardname)
- nfile = malloc(strlen(file) + 5);
- if (nfile == NULL) {
- error("No enough memory...");
-+ err = -ENOMEM;
- goto out;
- }
- strcpy(nfile, file);
- strcat(nfile, ".new");
-- if (state_lock(file, 1, 10) != 0)
-+ lock_fd = state_lock(file, 10);
-+ if (lock_fd < 0) {
-+ err = lock_fd;
- goto out;
-+ }
- }
- if (!stdio && (err = snd_input_stdio_open(&in, file, "r")) >= 0) {
- err = snd_config_load(config, in);
-@@ -1632,8 +1637,8 @@ int save_state(const char *file, const char *cardname)
- error("rename failed: %s (%s)", strerror(-err), file);
- }
- out:
-- if (!stdio)
-- state_lock(file, 0, 10);
-+ if (!stdio && lock_fd >= 0)
-+ state_unlock(lock_fd, file);
- free(nfile);
- snd_config_delete(config);
- snd_config_update_free_global();
-@@ -1646,7 +1651,7 @@ int load_state(const char *file, const char *initfile, const char *cardname,
- int err, finalerr = 0;
- snd_config_t *config;
- snd_input_t *in;
-- int stdio, locked = 0;
-+ int stdio, lock_fd = -EINVAL;
-
- err = snd_config_top(&config);
- if (err < 0) {
-@@ -1657,15 +1662,14 @@ int load_state(const char *file, const char *initfile, const char *cardname,
- if (stdio) {
- err = snd_input_stdio_attach(&in, stdin, 0);
- } else {
-- err = state_lock(file, 1, 10);
-- locked = err >= 0;
-- err = err >= 0 ? snd_input_stdio_open(&in, file, "r") : err;
-+ lock_fd = state_lock(file, 10);
-+ err = lock_fd >= 0 ? snd_input_stdio_open(&in, file, "r") : lock_fd;
- }
- if (err >= 0) {
- err = snd_config_load(config, in);
- snd_input_close(in);
-- if (locked)
-- state_lock(file, 0, 10);
-+ if (lock_fd >= 0)
-+ state_unlock(lock_fd, file);
- if (err < 0) {
- error("snd_config_load error: %s", snd_strerror(err));
- goto out;
---
-1.9.3
-
-From 74e5d57c999f8afed4f87046dcac84f6709b9196 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 24 Sep 2014 10:46:02 +0200
-Subject: [PATCH 1/2] alsactl: aded missing monitor() prototype
-
----
- alsactl/alsactl.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h
-index bd9bf23..4f969ec 100644
---- a/alsactl/alsactl.h
-+++ b/alsactl/alsactl.h
-@@ -31,6 +31,7 @@ int save_state(const char *file, const char *cardname);
- int load_state(const char *file, const char *initfile, const char *cardname,
- int do_init);
- int power(const char *argv[], int argc);
-+int monitor(const char *name);
- int state_daemon(const char *file, const char *cardname, int period,
- const char *pidfile);
- int state_daemon_kill(const char *pidfile, const char *cmd);
---
-1.9.3
-
-
-From da7a2f91de1c2089bf2b4ba247807cb716f30424 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 24 Sep 2014 10:47:48 +0200
-Subject: [PATCH 2/2] speaker-text: fix simple signess assignment warning
-
----
- speaker-test/speaker-test.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/speaker-test/speaker-test.c b/speaker-test/speaker-test.c
-index 362efa7..ccf2671 100644
---- a/speaker-test/speaker-test.c
-+++ b/speaker-test/speaker-test.c
-@@ -113,7 +113,7 @@ static snd_pcm_t *pcm_handle = NULL;
- #ifdef CONFIG_SUPPORT_CHMAP
- static snd_pcm_chmap_t *channel_map;
- static int channel_map_set;
--static unsigned int *ordered_channels;
-+static int *ordered_channels;
- #endif
-
- static const char *const channel_name[MAX_CHANNELS] = {
---
-1.9.3
-
-From 17d4a5dd35e3e72a194ca295da98e62060a180a8 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 24 Sep 2014 10:50:54 +0200
-Subject: [PATCH 1/2] monitor: fix clang warning - Declared variable-length
- array (VLA) has zero size
-
----
- alsactl/monitor.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/alsactl/monitor.c b/alsactl/monitor.c
-index 536176d..29379ad 100644
---- a/alsactl/monitor.c
-+++ b/alsactl/monitor.c
-@@ -91,7 +91,7 @@ int monitor(const char *name)
- snd_ctl_t *ctls[MAX_CARDS];
- int ncards = 0;
- int show_cards;
-- int i, err;
-+ int i, err = 0;
-
- if (!name) {
- int card = -1;
-@@ -117,7 +117,7 @@ int monitor(const char *name)
- show_cards = 0;
- }
-
-- for (;;) {
-+ for (;ncards > 0;) {
- struct pollfd fds[ncards];
-
- for (i = 0; i < ncards; i++)
---
-1.9.3
-
-
-From 89a4f490bd974e454d82942100f241bb1a2270f3 Mon Sep 17 00:00:00 2001
-From: Jaroslav Kysela
-Date: Wed, 24 Sep 2014 10:52:17 +0200
-Subject: [PATCH 2/2] =?UTF-8?q?alsactl:=20coverity=20-=20missing=5Fva=5Fen?=
- =?UTF-8?q?d=20=E2=80=93=20va=5Fend=20was=20not=20called=20for=20"ap"?=
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
----
- alsactl/utils.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/alsactl/utils.c b/alsactl/utils.c
-index b5d183c..304df7c 100644
---- a/alsactl/utils.c
-+++ b/alsactl/utils.c
-@@ -157,8 +157,8 @@ void cerror_(const char *fcn, long line, int cond, const char *fmt, ...)
- fprintf(stderr, "%s: %s:%ld: ", command, fcn, line);
- vfprintf(stderr, fmt, ap);
- putc('\n', stderr);
-- va_end(ap);
- }
-+ va_end(ap);
- }
-
- void dbg_(const char *fcn, long line, const char *fmt, ...)
-@@ -174,6 +174,6 @@ void dbg_(const char *fcn, long line, const char *fmt, ...)
- fprintf(stderr, "%s: %s:%ld: ", command, fcn, line);
- vfprintf(stderr, fmt, ap);
- putc('\n', stderr);
-- va_end(ap);
- }
-+ va_end(ap);
- }
---
-1.9.3
-
diff --git a/SOURCES/alsa-utils-1.1.1-post.patch b/SOURCES/alsa-utils-1.1.1-post.patch
new file mode 100644
index 0000000..d8991df
--- /dev/null
+++ b/SOURCES/alsa-utils-1.1.1-post.patch
@@ -0,0 +1,377 @@
+From 85827fbb642463ab724a9471a7a88f93fa2a217d Mon Sep 17 00:00:00 2001
+From: David Fries
+Date: Wed, 13 Apr 2016 23:32:46 -0500
+Subject: [PATCH 1/4] aplay: fix lurking capture file overwrite bug
+
+If -d was given to arecord while commit
+8aa13eec80eac312e4b99423909387660fb99b8f (now reverted) was in effect,
+the last read would be shorter than the chunk size, but pcm_read would
+read and return the chunk size, the samples were discarded, and
+capture() continued in a loop because count never reached 0. arecord
+opens a new file each loop iteration, if arecord is dynamically naming
+files, --use-strftime option or beyond the wave 2GB limit, this will
+generate a series of header only wave files. If the file is unique
+the originally recorded data is lost and it will continue overwriting
+the same file with a header only wave file.
+
+While the current pcm_read can't fail (it can exit), it is better to
+just fix this lurking bug in case it is "fixed" again.
+
+Signed-off-by: Takashi Iwai
+---
+ aplay/aplay.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/aplay/aplay.c b/aplay/aplay.c
+index 7acaa83..2da7dda 100644
+--- a/aplay/aplay.c
++++ b/aplay/aplay.c
+@@ -3067,11 +3067,14 @@ static void capture(char *orig_name)
+ size_t c = (rest <= (off64_t)chunk_bytes) ?
+ (size_t)rest : chunk_bytes;
+ size_t f = c * 8 / bits_per_frame;
+- if (pcm_read(audiobuf, f) != f)
++ if (pcm_read(audiobuf, f) != f) {
++ in_aborting = 1;
+ break;
++ }
+ if (write(fd, audiobuf, c) != c) {
+ perror(name);
+- prg_exit(EXIT_FAILURE);
++ in_aborting = 1;
++ break;
+ }
+ count -= c;
+ rest -= c;
+@@ -3091,7 +3094,7 @@ static void capture(char *orig_name)
+ }
+
+ if (in_aborting)
+- break;
++ prg_exit(EXIT_FAILURE);
+
+ /* repeat the loop when format is raw without timelimit or
+ * requested counts of data are recorded
+--
+2.5.5
+
+
+From 569f2c116ee30de8a16fef0822e13dd33a41f33e Mon Sep 17 00:00:00 2001
+From: "Lu, Han"
+Date: Sun, 17 Apr 2016 09:26:45 +0800
+Subject: [PATCH 2/4] alsabat: add terminate status check for capture thread
+
+In loopback test, alsabat use pthread_join(pthread_t thread, **retval)
+to wait for the capture thread to terminate. If the capture thread was
+canceled, PTHREAD_CANCELED is placed in *retval, and the access to the
+**retval will fail. Add status check to prevent illegal access to the
+**retval.
+
+Signed-off-by: Lu, Han
+Signed-off-by: Takashi Iwai
+---
+ bat/bat.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/bat/bat.c b/bat/bat.c
+index e824065..1afdcb4 100644
+--- a/bat/bat.c
++++ b/bat/bat.c
+@@ -192,6 +192,12 @@ static void test_loopback(struct bat *bat)
+ exit(EXIT_FAILURE);
+ }
+
++ /* check if capture thread is canceled or not */
++ if (thread_result_capture == PTHREAD_CANCELED) {
++ fprintf(bat->log, _("Capture canceled.\n"));
++ return;
++ }
++
+ /* check capture status */
+ if (*thread_result_capture != 0) {
+ fprintf(bat->err, _("Exit capture thread fail: %d\n"),
+--
+2.5.5
+
+
+From 9e196efda4463452db51e295cd57bbf0bdaa4715 Mon Sep 17 00:00:00 2001
+From: "vivian,zhang"
+Date: Tue, 31 May 2016 15:31:32 +0800
+Subject: [PATCH 3/4] alsabat: add buffer size and period size settings
+
+Add buffer size and period size settings in alsabat.
+With -E and -B options, alsabat performs the test with
+specified buffer size and period size
+
+Signed-off-by: Zhang Vivian
+Acked-by: Liam Girdwood
+Signed-off-by: Takashi Iwai
+---
+ bat/alsa.c | 95 ++++++++++++++++++++++++++++++++++++++++------------------
+ bat/bat.c | 18 +++++++++--
+ bat/common.h | 8 +++++
+ bat/tinyalsa.c | 5 +++-
+ 4 files changed, 94 insertions(+), 32 deletions(-)
+
+diff --git a/bat/alsa.c b/bat/alsa.c
+index 75158cb..0a37714 100644
+--- a/bat/alsa.c
++++ b/bat/alsa.c
+@@ -74,6 +74,8 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
+ snd_pcm_format_t format;
+ unsigned int buffer_time = 0;
+ unsigned int period_time = 0;
++ snd_pcm_uframes_t buffer_size = 0;
++ snd_pcm_uframes_t period_size = 0;
+ unsigned int rate;
+ int err;
+ const char *device_name = snd_pcm_name(sndpcm->handle);
+@@ -145,39 +147,71 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
+ return -EINVAL;
+ }
+
+- if (snd_pcm_hw_params_get_buffer_time_max(params,
+- &buffer_time, 0) < 0) {
+- fprintf(bat->err, _("Get parameter from device error: "));
+- fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
+- buffer_time,
+- device_name, snd_strerror(err), err);
+- return -EINVAL;
+- }
++ if (bat->buffer_size > 0 && bat->period_size == 0)
++ bat->period_size = bat->buffer_size / DIV_BUFFERTIME;
+
+- if (buffer_time > MAX_BUFFERTIME)
+- buffer_time = MAX_BUFFERTIME;
++ if (bat->buffer_size > 0) {
++ buffer_size = bat->buffer_size;
++ period_size = bat->period_size;
+
+- period_time = buffer_time / DIV_BUFFERTIME;
++ fprintf(bat->log, _("Set period size: %d buffer size: %d\n"),
++ (int) period_size, (int) buffer_size);
+
+- /* Set buffer time and period time */
+- err = snd_pcm_hw_params_set_buffer_time_near(sndpcm->handle, params,
+- &buffer_time, 0);
+- if (err < 0) {
+- fprintf(bat->err, _("Set parameter to device error: "));
+- fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
+- buffer_time,
+- device_name, snd_strerror(err), err);
+- return err;
+- }
++ err = snd_pcm_hw_params_set_buffer_size_near(sndpcm->handle,
++ params, &buffer_size);
++ if (err < 0) {
++ fprintf(bat->err, _("Set parameter to device error: "));
++ fprintf(bat->err, _("buffer size: %d %s: %s(%d)\n"),
++ (int) buffer_size,
++ device_name, snd_strerror(err), err);
++ return err;
++ }
+
+- err = snd_pcm_hw_params_set_period_time_near(sndpcm->handle, params,
+- &period_time, 0);
+- if (err < 0) {
+- fprintf(bat->err, _("Set parameter to device error: "));
+- fprintf(bat->err, _("period time: %d %s: %s(%d)\n"),
+- period_time,
+- device_name, snd_strerror(err), err);
+- return err;
++ err = snd_pcm_hw_params_set_period_size_near(sndpcm->handle,
++ params, &period_size, 0);
++ if (err < 0) {
++ fprintf(bat->err, _("Set parameter to device error: "));
++ fprintf(bat->err, _("period size: %d %s: %s(%d)\n"),
++ (int) period_size,
++ device_name, snd_strerror(err), err);
++ return err;
++ }
++ } else {
++ if (snd_pcm_hw_params_get_buffer_time_max(params,
++ &buffer_time, 0) < 0) {
++ fprintf(bat->err,
++ _("Get parameter from device error: "));
++ fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
++ buffer_time,
++ device_name, snd_strerror(err), err);
++ return -EINVAL;
++ }
++
++ if (buffer_time > MAX_BUFFERTIME)
++ buffer_time = MAX_BUFFERTIME;
++
++ period_time = buffer_time / DIV_BUFFERTIME;
++
++ /* Set buffer time and period time */
++ err = snd_pcm_hw_params_set_buffer_time_near(sndpcm->handle,
++ params, &buffer_time, 0);
++ if (err < 0) {
++ fprintf(bat->err, _("Set parameter to device error: "));
++ fprintf(bat->err, _("buffer time: %d %s: %s(%d)\n"),
++ buffer_time,
++ device_name, snd_strerror(err), err);
++ return err;
++ }
++
++ err = snd_pcm_hw_params_set_period_time_near(sndpcm->handle,
++ params, &period_time, 0);
++ if (err < 0) {
++ fprintf(bat->err, _("Set parameter to device error: "));
++ fprintf(bat->err, _("period time: %d %s: %s(%d)\n"),
++ period_time,
++ device_name, snd_strerror(err), err);
++ return err;
++ }
+ }
+
+ /* Write the parameters to the driver */
+@@ -214,6 +248,9 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm)
+ return -EINVAL;
+ }
+
++ fprintf(bat->log, _("Get period size: %d buffer size: %d\n"),
++ (int) sndpcm->period_size, (int) sndpcm->buffer_size);
++
+ err = snd_pcm_format_physical_width(format);
+ if (err < 0) {
+ fprintf(bat->err, _("Invalid parameters: "));
+diff --git a/bat/bat.c b/bat/bat.c
+index 1afdcb4..cd4ea2d 100644
+--- a/bat/bat.c
++++ b/bat/bat.c
+@@ -292,6 +292,8 @@ _("Usage: alsabat [-options]...\n"
+ " -k parameter for frequency detecting threshold\n"
+ " -F target frequency\n"
+ " -p total number of periods to play/capture\n"
++" -B buffer size in frames\n"
++" -E period size in frames\n"
+ " --log=# file that both stdout and strerr redirecting to\n"
+ " --file=# file for playback\n"
+ " --saveplay=# file that storing playback content, for debug\n"
+@@ -324,6 +326,8 @@ static void set_defaults(struct bat *bat)
+ bat->capture.device = NULL;
+ bat->buf = NULL;
+ bat->local = false;
++ bat->buffer_size = 0;
++ bat->period_size = 0;
+ #ifdef HAVE_LIBTINYALSA
+ bat->channels = 2;
+ bat->playback.fct = &playback_tinyalsa;
+@@ -342,8 +346,8 @@ static void set_defaults(struct bat *bat)
+
+ static void parse_arguments(struct bat *bat, int argc, char *argv[])
+ {
+- int c, option_index;
+- static const char short_options[] = "D:P:C:f:n:F:c:r:s:k:p:lth";
++ int c, option_index, err;
++ static const char short_options[] = "D:P:C:f:n:F:c:r:s:k:p:B:E:lth";
+ static const struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"log", 1, 0, OPT_LOG},
+@@ -414,6 +418,16 @@ static void parse_arguments(struct bat *bat, int argc, char *argv[])
+ bat->periods_total = atoi(optarg);
+ bat->period_is_limited = true;
+ break;
++ case 'B':
++ err = atoi(optarg);
++ bat->buffer_size = err >= MIN_BUFFERSIZE
++ && err < MAX_BUFFERSIZE ? err : 0;
++ break;
++ case 'E':
++ err = atoi(optarg);
++ bat->period_size = err >= MIN_PERIODSIZE
++ && err < MAX_PERIODSIZE ? err : 0;
++ break;
+ case 'h':
+ default:
+ usage(bat);
+diff --git a/bat/common.h b/bat/common.h
+index b789af5..ad02a5a 100644
+--- a/bat/common.h
++++ b/bat/common.h
+@@ -46,6 +46,12 @@
+ #define DIV_BUFFERTIME 8
+ /* margin to avoid sign inversion when generate sine wav */
+ #define RANGE_FACTOR 0.95
++#define MAX_BUFFERSIZE 200000
++#define MIN_BUFFERSIZE 32
++#define MAX_PERIODSIZE 200000
++#define MIN_PERIODSIZE 32
++/* default period size for tinyalsa */
++#define TINYALSA_PERIODSIZE 1024
+
+ #define EBATBASE 1000
+ #define ENOPEAK (EBATBASE + 1)
+@@ -152,6 +158,8 @@ struct bat {
+ int frame_size; /* size of frame */
+ int sample_size; /* size of sample */
+ enum _bat_pcm_format format; /* PCM format */
++ int buffer_size; /* buffer size in frames */
++ int period_size; /* period size in frames */
+
+ float sigma_k; /* threshold for peak detection */
+ float target_freq[MAX_CHANNELS];
+diff --git a/bat/tinyalsa.c b/bat/tinyalsa.c
+index ea5f848..a19dd90 100644
+--- a/bat/tinyalsa.c
++++ b/bat/tinyalsa.c
+@@ -57,7 +57,10 @@ static int init_config(struct bat *bat, struct pcm_config *config)
+ {
+ config->channels = bat->channels;
+ config->rate = bat->rate;
+- config->period_size = 1024;
++ if (bat->period_size > 0)
++ config->period_size = bat->period_size;
++ else
++ config->period_size = TINYALSA_PERIODSIZE;
+ config->period_count = 4;
+ config->start_threshold = 0;
+ config->stop_threshold = 0;
+--
+2.5.5
+
+
+From 2b3adf8668ab4e0e57168725f2562006bb5472ef Mon Sep 17 00:00:00 2001
+From: "Lu, Han"
+Date: Wed, 1 Jun 2016 16:54:28 +0800
+Subject: [PATCH 4/4] alsabat: fix a possible memory leak
+
+Fix a possible memory leak in generate_sine_wave(). Memory free was
+ignored when the function return an error.
+
+Signed-off-by: Lu, Han
+Signed-off-by: Takashi Iwai
+---
+ bat/signal.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/bat/signal.c b/bat/signal.c
+index a47ba97..61d2824 100644
+--- a/bat/signal.c
++++ b/bat/signal.c
+@@ -168,16 +168,17 @@ int generate_sine_wave(struct bat *bat, int frames, void *buf)
+ /* reorder samples to interleaved mode */
+ err = reorder(bat, sinus_f, frames);
+ if (err != 0)
+- return err;
++ goto exit;
+
+ /* adjust amplitude and offset of waveform */
+ err = adjust_waveform(bat, sinus_f, frames);
+ if (err != 0)
+- return err;
++ goto exit;
+
+ bat->convert_float_to_sample(sinus_f, buf, frames, bat->channels);
+
++exit:
+ free(sinus_f);
+
+- return 0;
++ return err;
+ }
+--
+2.5.5
+
diff --git a/SPECS/alsa-utils.spec b/SPECS/alsa-utils.spec
index 16b0149..911ff3a 100644
--- a/SPECS/alsa-utils.spec
+++ b/SPECS/alsa-utils.spec
@@ -1,10 +1,10 @@
-%define baseversion 1.0.28
+%define baseversion 1.1.1
#define fixversion .1
Summary: Advanced Linux Sound Architecture (ALSA) utilities
Name: alsa-utils
Version: %{baseversion}%{?fixversion}
-Release: 4%{?dist}
+Release: 1%{?dist}
License: GPLv2+
Group: Applications/Multimedia
URL: http://www.alsa-project.org/
@@ -12,13 +12,13 @@ Source: ftp://ftp.alsa-project.org/pub/utils/alsa-utils-%{version}.tar.bz2
Source4: alsaunmute
Source5: alsaunmute.1
Source7: alsa-delay
+Source8: alsa-delay.1
Source10: alsa.rules
Source11: alsactl.conf
Source20: alsa-restore.service
Source21: alsa-store.service
Source22: alsa-state.service
-Patch0: alsa-utils-1.0.28-post.patch
-Patch1: alsa-utils-1.0.28-duration.patch
+Patch0: alsa-utils-1.1.1-post.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: alsa-lib-devel >= %{baseversion}
BuildRequires: libsamplerate-devel
@@ -38,7 +38,6 @@ Architecture (ALSA).
%prep
%setup -q -n %{name}-%{version}
%patch0 -p1 -b .post
-%patch1 -p1 -b .duration
%build
%configure CFLAGS="$RPM_OPT_FLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" --disable-alsaconf \
@@ -86,6 +85,7 @@ ln -s alsa-info %{buildroot}/usr/sbin/alsa-info.sh
# Install alsa-delay script
install -p -m 755 %{SOURCE7} %{buildroot}/usr/bin/alsa-delay
+install -p -m 644 %{SOURCE8} %{buildroot}/%{_mandir}/man1/alsa-delay.1
%files -f %{name}.lang
%defattr(-,root,root,-)
@@ -94,7 +94,6 @@ install -p -m 755 %{SOURCE7} %{buildroot}/usr/bin/alsa-delay
%{_prefix}/lib/udev/rules.d/*
%{_unitdir}/*
%{_unitdir}/basic.target.wants/*
-%{_unitdir}/shutdown.target.wants/*
%{_prefix}/lib/alsa/init/*
%{_bindir}/*
%{_sbindir}/*
@@ -122,6 +121,11 @@ if [ -s /etc/asound.state -a ! -s /var/lib/alsa/asound.state ] ; then
fi
%changelog
+* Mon Jun 6 2016 Jaroslav Kysela - 1.1.1-1
+- Updated to 1.1.1
+- Add alsa-delay man page
+- Resolves: rhbz#1264129
+
* Fri Dec 12 2014 Jaroslav Kysela - 1.0.28-4
- Fixed aplay -d regression
- Resolves: rhbz#1172189
@@ -346,7 +350,7 @@ fi
- added more funcionality to salsa (save/load sound settings),
moved volume settings to /etc/alsa/
-* Thu Apr 10 2007 Martin Stransky 1.0.14-0.4.rc2
+* Tue Apr 10 2007 Martin Stransky 1.0.14-0.4.rc2
- added support for large files
- minor fix in alsaunmute
- fixed #209239 - alsaconf: Stale language-dependent files