diff --git a/BUILD.gn b/BUILD.gn index e81aa8d..b6e2207 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -148,6 +148,9 @@ ohos_executable("alsactl") { "alsactl/monitor.c", "alsactl/state.c", "alsactl/utils.c", + "alsactl/export.c", + "alsactl/wait.c", + "alsactl/boot_params.c", ] include_dirs = [ @@ -166,7 +169,7 @@ ohos_executable("alsactl") { install_images = [ "system" ] } -group("alsa-utils") { +group("entry") { deps = [ ":aconnect", ":alsactl", diff --git a/README.OpenSource b/README.OpenSource index 3914d63..fdd2f5e 100644 --- a/README.OpenSource +++ b/README.OpenSource @@ -3,7 +3,7 @@ "Name": "alsa-utils", "License": "GPL V2", "License File": "COPYING", - "Version Number": "v1.2.11", + "Version Number": "v1.2.15.2", "Owner": "zhangyunhu@huawei.com", "Upstream URL": "https://github.com/alsa-project/alsa-utils", "Description": "This package contains the command line utilities for the ALSA project.", diff --git a/alsa-info/Makefile.am b/alsa-info/Makefile.am index 6e35926..92679b3 100644 --- a/alsa-info/Makefile.am +++ b/alsa-info/Makefile.am @@ -1,3 +1,3 @@ -EXTRA_DIST = alsa-info.sh alsa-info.sh.1 +EXTRA_DIST = alsa-info.sh alsa-info.sh.8 sbin_SCRIPTS = alsa-info.sh -man_MANS = alsa-info.sh.1 +man_MANS = alsa-info.sh.8 diff --git a/alsa-info/alsa-info.sh b/alsa-info/alsa-info.sh index 8f05934..77ca624 100755 --- a/alsa-info/alsa-info.sh +++ b/alsa-info/alsa-info.sh @@ -244,7 +244,7 @@ withpackages() { RPM="$(command -v rpmquery)" DPKG="$(command -v dpkg)" [ -n "$RPM$DPKG" ] || return - local PATTERN='(alsa-(lib|oss|plugins|tools|(topology|ucm)-conf|utils|sof-firmware)|libalsa|tinycompress|sof-firmware)' + local PATTERN='(alsa-(lib|oss|plugins|tools|ucm|(topology|ucm)-conf|utils|sof-firmware)|libalsa|tinycompress|sof-firmware)' { echo "!!Packages installed" echo "!!--------------------" @@ -461,6 +461,20 @@ if [ -d /sys/bus/acpi/devices ]; then done fi +# Check for SoundWire ACPI _adr device status +if [ -d /sys/bus/acpi/devices ]; then + for f in /sys/bus/acpi/devices/*/adr; do + ACPI_ADR=$(cat $f 2>/dev/null); + if [[ "$ACPI_ADR" -ne 0 ]]; then + case $ACPI_ADR in + 0x??????025d*) echo "Realtek $ACPI_ADR" >>$TEMPDIR/sdwstatus.tmp;; + 0x??????01fa*) echo "Cirrus Logic $ACPI_ADR" >>$TEMPDIR/sdwstatus.tmp;; + 0x??????0102*) echo "TI $ACPI_ADR" >>$TEMPDIR/sdwstatus.tmp;; + esac + fi + done +fi + awk '{ print $2 " (card " $1 ")" }' < /proc/asound/modules > $TEMPDIR/alsamodules.tmp 2> /dev/null cat /proc/asound/cards > $TEMPDIR/alsacards.tmp if [[ ! -z "$LSPCI" ]]; then @@ -528,6 +542,12 @@ echo "" >> $FILE cat $TEMPDIR/acpidevicestatus.tmp >> $FILE echo "" >> $FILE echo "" >> $FILE +echo "!!ACPI SoundWire Device Status Information" >> $FILE +echo "!!---------------" >> $FILE +echo "" >> $FILE +cat $TEMPDIR/sdwstatus.tmp >> $FILE +echo "" >> $FILE +echo "" >> $FILE echo "!!Kernel Information" >> $FILE echo "!!------------------" >> $FILE echo "" >> $FILE diff --git a/alsa-info/alsa-info.sh.8 b/alsa-info/alsa-info.sh.8 new file mode 100644 index 0000000..7168b3e --- /dev/null +++ b/alsa-info/alsa-info.sh.8 @@ -0,0 +1,62 @@ +.TH ALSA-INFO.SH 1 "13 January 2016" +.SH NAME +alsa-info.sh \- command\-line utility to gather information about +the ALSA subsystem +.SH SYNOPSIS +\fBalsa-info.sh\fP [\fIoptions\fP] + +.SH DESCRIPTION +\fBalsa-info.sh\fP is a command\-line utility gathering information +about the ALSA subsystem. It is used mostly for debugging purposes. + +.SH OPTIONS +.TP +\fI\-\-upload\fP +Upload contents to the server (www.alsa-project.org or pastebin.ca). +.TP +\fI\-\-no-upload\fP +Do not upload contents to the remote server. +.TP +\fI\-\-stdout\fP +Print information to standard output. +.TP +\fI\-\-output FILE\fP +Specify file for output in no-upload mode. +.TP +\fI\-\-debug\fP +Run utility as normal, but will not delete file (usually +/tmp/alsa-info.txt). +.TP +\fI\-\-with-aplay\fP +Includes output from \fIaplay -l\fP. +.TP +\fI\-\-with-amixer\fP +Includes output from \fIamixer\fP. +.TP +\fI\-\-with-alsactl\fP +Includes output from \fIalsactl\fP. +.TP +\fI\-\-with-configs\fP +Includes output from ~/.asoundrc and /etc/asound.conf if they exist. +.TP +\fI\-\-update\fP +Check server for updates. +.TP +\fI\-\-about\fP +Print information about authors. + +.SH EXAMPLES + +.TP +\fBalsa-info.sh \-\-no-upload\fR +Will gather all information and show the output file. + +.SH SEE ALSO +\fB +aplay(1) +amixer(1) +alsactl(1) +\fP + +.SH AUTHOR +\fBalsa-info.sh\fP was created by the ALSA team, see \fI\-\-about\fP . diff --git a/alsactl/.gitignore b/alsactl/.gitignore index 56ab3a2..e8fe186 100644 --- a/alsactl/.gitignore +++ b/alsactl/.gitignore @@ -1,3 +1,5 @@ -alsa-store.service -alsa-restore.service -90-alsa-restore.rules +conf/90-alsa-restore.rules +conf/alsa-state.service +conf/alsa-store.service +conf/alsa-restore.service +conf/alsa-card-wait@.service diff --git a/alsactl/Makefile.am b/alsactl/Makefile.am index fb32c4f..c8729e0 100644 --- a/alsactl/Makefile.am +++ b/alsactl/Makefile.am @@ -11,8 +11,9 @@ AM_CFLAGS = -D_GNU_SOURCE AM_CPPFLAGS = -I$(top_srcdir)/include -alsactl_SOURCES=alsactl.c state.c lock.c utils.c init_parse.c init_ucm.c \ - daemon.c monitor.c clean.c info.c +alsactl_SOURCES=alsactl.c state.c lock.c utils.c wait.c \ + init_parse.c init_ucm.c boot_params.c \ + daemon.c monitor.c clean.c info.c export.c alsactl_CFLAGS=$(AM_CFLAGS) -D__USE_GNU \ -DSYS_ASOUNDRC=\"$(ASOUND_STATE_DIR)/asound.state\" \ @@ -24,13 +25,14 @@ noinst_HEADERS=alsactl.h list.h init_sysdeps.c init_utils_string.c \ init_utils_run.c init_sysfs.c udevrules_DATA = \ - 90-alsa-restore.rules + conf/90-alsa-restore.rules if HAVE_SYSTEMD systemdsystemunit_DATA = \ - alsa-state.service \ - alsa-restore.service + conf/alsa-state.service \ + conf/alsa-restore.service \ + conf/alsa-card-wait@.service install-data-hook: $(MKDIR_P) -m 0755 \ @@ -43,30 +45,40 @@ install-data-hook: endif edit = \ + extratest=$$(echo ' $(ALSACTL_UDEV_EXTRATEST)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ + args=$$(echo ' $(ALSACTL_UDEV_ARGS)' | sed -e 's/__/ /g' -e 's/^ $$//'); \ + mkdir -p conf; \ $(SED) -r -e 's,@sbindir\@,$(sbindir),g' \ -e 's,@mydatadir\@,$(mydatadir),g' \ -e 's,@daemonswitch\@,$(ALSACTL_DAEMONSWITCH),g' \ -e 's,@asoundrcfile\@,$(ASOUND_STATE_DIR)/asound.state,g' \ + -e "s;@extratest\@;$${extratest};g" \ + -e "s;@args\@;$${args};g" \ < $< > $@ || rm $@ -alsa-state.service: alsa-state.service.in +conf/alsa-state.service: conf/alsa-state.service.in $(edit) -alsa-restore.service: alsa-restore.service.in +conf/alsa-restore.service: conf/alsa-restore.service.in $(edit) -90-alsa-restore.rules: 90-alsa-restore.rules.in +conf/alsa-card-wait@.service: conf/alsa-card-wait@.service.in + $(edit) + +conf/90-alsa-restore.rules: conf/90-alsa-restore.rules.in $(edit) EXTRA_DIST += \ - alsa-state.service.in \ - alsa-restore.service.in \ - 90-alsa-restore.rules.in + conf/alsa-state.service.in \ + conf/alsa-restore.service.in \ + conf/alsa-card-wait@.service.in \ + conf/90-alsa-restore.rules.in CLEANFILES = \ - alsa-state.service \ - alsa-restore.service \ - 90-alsa-restore.rules + conf/alsa-state.service \ + conf/alsa-restore.service \ + conf/alsa-card-wait@.service \ + conf/90-alsa-restore.rules %.7: %.xml xmlto man $? diff --git a/alsactl/alsactl.1 b/alsactl/alsactl.1 index 2a31a2f..29da65f 100644 --- a/alsactl/alsactl.1 +++ b/alsactl/alsactl.1 @@ -90,7 +90,7 @@ Note that the configuration hooks are evaluated. .SH OPTIONS .TP -\fI\-h, \-\-help\fP +\fI\-h, \-\-help\fP Help: show available flags and commands. .TP @@ -223,7 +223,7 @@ aplay(1), alsactl_init(7) \fP -.SH BUGS +.SH BUGS None known. .SH AUTHOR diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c index 8ad991a..a91462e 100644 --- a/alsactl/alsactl.c +++ b/alsactl/alsactl.c @@ -44,14 +44,19 @@ #ifndef SYS_LOCKPATH #define SYS_LOCKPATH "/var/lock" #endif +#ifndef SYS_CARD_GROUP +#define SYS_CARD_GROUP SYS_ASOUND_DIR "/card-group.state" +#endif int debugflag = 0; int force_restore = 1; int ignore_nocards = 0; int do_lock = 0; int use_syslog = 0; +int do_export = 0; char *command; char *statefile = NULL; +char *groupfile = SYS_CARD_GROUP; char *lockpath = SYS_LOCKPATH; char *lockfile = SYS_LOCKFILE; @@ -78,6 +83,7 @@ static struct arg args[] = { { 'v', "version", "print version of this program" }, { HEADER, NULL, "Available state options:" }, { FILEARG | 'f', "file", "configuration file (default " SYS_ASOUNDRC ")" }, +{ FILEARG | 'G', "group-file", "card group configuration file (default " SYS_CARD_GROUP ")" }, { FILEARG | 'a', "config-dir", "boot / hotplug configuration directory (default " SYS_ASOUND_DIR ")" }, { 'l', "lock", "use file locking to serialize concurrent access" }, { 'L', "no-lock", "do not use file locking to serialize concurrent access" }, @@ -92,6 +98,7 @@ static struct arg args[] = { { FILEARG | 'r', "runstate", "save restore and init state to this file (only errors)" }, { 0, NULL, " default settings is 'no file set'" }, { 'R', "remove", "remove runstate file at first, otherwise append errors" }, +{ 'Y', "export", "export card state as key=value pairs (restore command only)" }, { INTARG | 'p', "period", "store period in seconds for the daemon command" }, { FILEARG | 'e', "pid-file", "pathname for the process id (daemon mode)" }, { HEADER, NULL, "Available init options:" }, @@ -105,6 +112,7 @@ static struct arg args[] = { #ifdef HAVE_ALSA_USE_CASE_H { 'D', "ucm-defaults", "execute also the UCM 'defaults' section" }, { 'U', "no-ucm", "don't init with UCM" }, +{ 'm', "force-ucm-restore", "force UCM restore for boot card groups" }, #if SND_LIB_VER(1, 2, 5) < SND_LIB_VERSION { 'X', "ucm-nodev", "show UCM no device errors" }, #endif @@ -115,6 +123,7 @@ static struct arg args[] = { { CARDCMD, "restore", "load current driver setup for one or each soundcards" }, { EMPCMD, NULL, " from configuration file" }, { CARDCMD, "nrestore", "like restore, but notify the daemon to rescan soundcards" }, +{ CARDCMD, "wrestore", "wait for card ready, then restore" }, { CARDCMD, "init", "initialize driver to a default state" }, { CARDCMD, "daemon", "store state periodically for one or each soundcards" }, { CARDCMD, "rdaemon", "like daemon but do the state restore at first" }, @@ -301,6 +310,9 @@ int main(int argc, char *argv[]) case 'f': cfgfile = optarg; break; + case 'G': + groupfile = optarg; + break; case 'a': cfgdir = optarg; break; @@ -341,6 +353,9 @@ int main(int argc, char *argv[]) case 'U': initflags |= FLAG_UCM_DISABLED; break; + case 'm': + initflags |= FLAG_UCM_RESTORE; + break; case 'X': initflags |= FLAG_UCM_NODEV; break; @@ -350,6 +365,9 @@ int main(int argc, char *argv[]) case 'R': removestate = 1; break; + case 'Y': + do_export = 1; + break; case 'P': force_restore = 0; break; @@ -441,7 +459,11 @@ int main(int argc, char *argv[]) syslog(LOG_INFO, "alsactl " SND_UTIL_VERSION_STR " daemon started"); } +#if SND_LIB_VER(1, 2, 15) < SND_LIB_VERSION snd_lib_error_set_handler(error_handler); +#else + snd_lib_log_set_handler(log_handler); +#endif if (!strcmp(cmd, "init")) { res = init(cfgdir, initfile, initflags | FLAG_UCM_FBOOT | FLAG_UCM_BOOT, cardname); @@ -450,10 +472,15 @@ int main(int argc, char *argv[]) res = save_state(cfgfile, cardname); } else if (!strcmp(cmd, "restore") || !strcmp(cmd, "rdaemon") || - !strcmp(cmd, "nrestore")) { + !strcmp(cmd, "nrestore") || + !strcmp(cmd, "wrestore")) { if (removestate) remove(statefile); + if (!strcmp(cmd, "wrestore")) + initflags |= FLAG_UCM_WAIT; res = load_state(cfgdir, cfgfile, initfile, initflags, cardname, init_fallback); + if (do_export && res >= 0) + res = export_cards(cardname); if (!strcmp(cmd, "rdaemon")) { do_nice(use_nice, sched_idle); res = state_daemon(cfgfile, cardname, period, pidfile); diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h index 6ae45e3..9f17284 100644 --- a/alsactl/alsactl.h +++ b/alsactl/alsactl.h @@ -2,14 +2,17 @@ #include #define LOCK_TIMEOUT 10 +#define DEFAULT_SYNC_TIME 20 extern int debugflag; extern int force_restore; extern int ignore_nocards; extern int do_lock; extern int use_syslog; +extern int do_export; extern char *command; extern char *statefile; +extern char *groupfile; extern char *lockpath; extern char *lockfile; @@ -24,7 +27,8 @@ void info_(const char *fcn, long line, const char *fmt, ...); void error_(const char *fcn, long line, const char *fmt, ...); void cerror_(const char *fcn, long line, int cond, const char *fmt, ...); void dbg_(const char *fcn, long line, const char *fmt, ...); -void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...); +void error_handler(const char *file, int line, const char *function, int errcode, const char *fmt, ...); +void log_handler(int prio, int interface, const char *file, int line, const char *function, int errcode, const char *fmt, va_list arg); #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) #define info(...) do { info_(__func__, __LINE__, __VA_ARGS__); } while (0) @@ -43,6 +47,19 @@ void error_handler(const char *file, int line, const char *function, int err, co #define FLAG_UCM_BOOT (1<<2) #define FLAG_UCM_DEFAULTS (1<<3) #define FLAG_UCM_NODEV (1<<4) +#define FLAG_UCM_RESTORE (1<<5) +#define FLAG_UCM_WAIT (1<<6) + +enum { + CARD_STATE_WAIT = 1, /* skip configuration (wait for sync) */ + CARD_STATE_SKIP = 2, /* skip card */ + CARD_STATE_RESTORED = 3, /* card was restored */ +}; + +static inline bool card_state_is_okay(int state) +{ + return state >= CARD_STATE_WAIT && state <= CARD_STATE_RESTORED; +} void snd_card_iterator_init(struct snd_card_iterator *iter, int cardno); int snd_card_iterator_sinit(struct snd_card_iterator *iter, const char *cardname); @@ -51,15 +68,28 @@ int snd_card_iterator_error(struct snd_card_iterator *iter); int load_configuration(const char *file, snd_config_t **top, int *open_failed); int init(const char *cfgdir, const char *file, int flags, const char *cardname); -int init_ucm(int flags, int cardno); +int init_ucm(const char *cfgdir, int flags, int cardno); +bool validate_boot_time(long long boot_time, long long current_time, long long synctime); +int read_boot_params(snd_ctl_t *handle, long long *boot_time, long long *sync_time, long long *restore_time, long long *primary_card); +int write_boot_params(snd_ctl_t *handle, long long boot_time, long long sync_time, long long restore_time, long long primary_card); +int card_group_load(snd_config_t **config); +int card_group_save(snd_config_t *config); +int card_group_get_int64(snd_config_t *config_group, const char *id, long long *val); +int card_group_set_int64(snd_config_t *config_group, const char *id, long long val); +int check_boot_params_validity(snd_ctl_t *handle, int cardno, char **boot_card_group, bool *valid, bool *in_sync, bool *restored, int *primary_card, long long *synctime); +int update_boot_params(snd_ctl_t *handle, int cardno, const char *boot_card_group, bool valid, bool restored, long long synctime); +int boot_params_remove_card(int cardno); int state_lock(const char *file, int timeout); int state_unlock(int lock_fd, const char *file); int card_lock(int card_number, int timeout); int card_unlock(int lock_fd, int card_number); +int group_state_lock(const char *file, int timeout); +int group_state_unlock(int lock_fd, const char *file); int save_state(const char *file, const char *cardname); int load_state(const char *cfgdir, const char *file, const char *initfile, int initflags, const char *cardname, int do_init); +int wait_for_card(long long timeout, int cardno); int power(const char *argv[], int argc); int monitor(const char *name); int general_info(const char *name); @@ -68,6 +98,12 @@ int state_daemon(const char *file, const char *cardname, int period, int state_daemon_kill(const char *pidfile, const char *cmd); int clean(const char *cardname, char *const *extra_args); int snd_card_clean_cfgdir(const char *cfgdir, int cardno); +void add_linked_card(int cardno); + +/* export */ + +int export_card_state_set(int card, int state); +int export_cards(const char *cardname); /* utils */ diff --git a/alsactl/boot_params.c b/alsactl/boot_params.c new file mode 100644 index 0000000..af0f4fd --- /dev/null +++ b/alsactl/boot_params.c @@ -0,0 +1,1085 @@ +/* + * Advanced Linux Sound Architecture Control Program - Boot Parameters + * Copyright (c) by Jaroslav Kysela + * + * + * 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 + * + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include +#include "alsactl.h" + +/* + * Validate boot time + * Returns: true if boot_time is valid and within synchronization time, false otherwise + */ +bool validate_boot_time(long long boot_time, long long current_time, long long synctime) +{ + long long diff; + + if (boot_time <= 0) + return false; + + diff = current_time - boot_time; + if (diff < 0) { + /* boot_time is in the future - invalid */ + return false; + } + + if (synctime > 0 && diff >= synctime) { + /* boot_time has exceeded timeout - invalid */ + return false; + } + + return true; +} + +/* + * Read boot parameters from the '.Boot' control element + * Returns: 0 on success, negative error code on failure + */ +int read_boot_params(snd_ctl_t *handle, long long *boot_time, long long *sync_time, + long long *restore_time, long long *primary_card) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_value_t *value; + snd_ctl_elem_info_t *info; + int err; + + if (boot_time) + *boot_time = -1; + if (sync_time) + *sync_time = -1; + if (restore_time) + *restore_time = -1; + if (primary_card) + *primary_card = -1; + + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&value); + snd_ctl_elem_info_alloca(&info); + + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); + snd_ctl_elem_id_set_name(id, ".Boot"); + snd_ctl_elem_id_set_index(id, 0); + + snd_ctl_elem_info_set_id(info, id); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + if (err == -ENOENT) + return 0; + error("Cannot read '.Boot' control info: %s", snd_strerror(err)); + return err; + } + + if (snd_ctl_elem_info_get_type(info) != SND_CTL_ELEM_TYPE_INTEGER64) { + error("'.Boot' control element is not of type INTEGER64"); + return -EINVAL; + } + + if (snd_ctl_elem_info_get_count(info) != 4) { + error("'.Boot' control element does not have 3 values"); + return -EINVAL; + } + + snd_ctl_elem_value_set_id(value, id); + err = snd_ctl_elem_read(handle, value); + if (err < 0) { + error("Cannot read '.Boot' control: %s", snd_strerror(err)); + return err; + } + + dbg("Read boot params: boot_time=%lld sync_time=%lld restore_time=%lld primary_card=%lld", + snd_ctl_elem_value_get_integer64(value, 0), + snd_ctl_elem_value_get_integer64(value, 1), + snd_ctl_elem_value_get_integer64(value, 2), + snd_ctl_elem_value_get_integer64(value, 3)); + + if (boot_time) + *boot_time = snd_ctl_elem_value_get_integer64(value, 0); + if (sync_time) + *sync_time = snd_ctl_elem_value_get_integer64(value, 1); + if (restore_time) + *restore_time = snd_ctl_elem_value_get_integer64(value, 2); + if (primary_card) + *primary_card = snd_ctl_elem_value_get_integer64(value, 3); + + return 0; +} + +/* + * Write boot parameters to the '.Boot' control element + * Returns: 0 on success, negative error code on failure + */ +int write_boot_params(snd_ctl_t *handle, long long boot_time, long long sync_time, + long long restore_time, long long primary_card) +{ + snd_ctl_elem_id_t *id; + snd_ctl_elem_value_t *value; + snd_ctl_elem_info_t *info; + int err; + + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_value_alloca(&value); + snd_ctl_elem_info_alloca(&info); + + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); + snd_ctl_elem_id_set_name(id, ".Boot"); + snd_ctl_elem_id_set_index(id, 0); + + snd_ctl_elem_info_set_id(info, id); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + if (err == -ENOENT) { + /* Element not found, create a new user element with 3 integer64 values */ + dbg("'.Boot' control not found, creating new user element"); + /* Do not save this element to the state file */ + snd_ctl_elem_info_set_inactive(info, 1); + snd_ctl_elem_info_set_read_write(info, 1, 1); + err = snd_ctl_add_integer64_elem_set(handle, info, 1, 4, -1, LLONG_MAX, 0); + if (err < 0) { + error("Cannot create '.Boot' user element: %s", snd_strerror(err)); + return err; + } + /* Re-read the element info after creation */ + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + error("Cannot read '.Boot' control info after creation: %s", snd_strerror(err)); + return err; + } + } else { + error("Cannot read '.Boot' control info: %s", snd_strerror(err)); + return err; + } + } + + dbg("Write boot params: boot_time=%lld sync_time=%lld restore_time=%lld primary_card=%lld", + boot_time, sync_time, restore_time, primary_card); + + if (snd_ctl_elem_info_get_type(info) != SND_CTL_ELEM_TYPE_INTEGER64) { + error("'.Boot' control element is not of type INTEGER64"); + return -EINVAL; + } + + if (snd_ctl_elem_info_get_count(info) != 4) { + error("'.Boot' control element does not have 3 values"); + return -EINVAL; + } + + snd_ctl_elem_value_set_id(value, id); + snd_ctl_elem_value_set_integer64(value, 0, boot_time); + snd_ctl_elem_value_set_integer64(value, 1, sync_time); + snd_ctl_elem_value_set_integer64(value, 2, restore_time); + snd_ctl_elem_value_set_integer64(value, 3, primary_card); + + err = snd_ctl_elem_write(handle, value); + if (err < 0) { + error("Cannot write '.Boot' control: %s", snd_strerror(err)); + return err; + } + + return 0; +} + +/* + * Structure for the group configuration file: + * + * { + * card.0 # primary card in group + * card.1 # optional - next card in group + * card.2 # optional - next card in group + * boot_realtime # boot time (CLOCK_REALTIME) in seconds + * boot_last_update # timestamp of last configuration update (CLOCK_REALTIME) in seconds + * boot_monotonic # boot time (CLOCK_MONOTONIC_RAW) in seconds + * boot_synctime # synchronization time window in seconds + * } + */ + +/* + * Read card group configuration from file + * Returns: 0 on success, negative error code on failure + */ +int card_group_load(snd_config_t **config) +{ + snd_input_t *in; + int err; + + if (!config) + return -EINVAL; + + *config = NULL; + + err = snd_config_top(config); + if (err < 0) { + error("Cannot create top config: %s", snd_strerror(err)); + return err; + } + + err = snd_input_stdio_open(&in, groupfile, "r"); + if (err < 0) { + if (err == -ENOENT) { + dbg("Card group file '%s' not found", groupfile); + return 0; + } + error("Cannot open card group file '%s' for reading: %s", groupfile, snd_strerror(err)); + goto _err; + } + + err = snd_config_load(*config, in); + snd_input_close(in); + if (err < 0) { + error("Cannot load card group file '%s': %s", groupfile, snd_strerror(err)); + goto _err; + } + + return 0; + +_err: + snd_config_delete(*config); + *config = NULL; + return err; +} + +/* + * Write card group configuration to file + * Returns: 0 on success, negative error code on failure + */ +int card_group_save(snd_config_t *config) +{ + snd_output_t *out; + char temp_file[PATH_MAX]; + int err; + + if (!config) + return -EINVAL; + + snprintf(temp_file, sizeof(temp_file), "%s.new", groupfile); + + err = snd_output_stdio_open(&out, temp_file, "w"); + if (err < 0) { + error("Cannot open temporary card group file '%s' for writing: %s", temp_file, snd_strerror(err)); + return err; + } + + err = snd_config_save(config, out); + snd_output_close(out); + if (err < 0) { + error("Cannot save temporary card group file '%s': %s", temp_file, snd_strerror(err)); + return err; + } + + err = rename(temp_file, groupfile); + if (err < 0) { + err = -errno; + error("Cannot rename temporary card group file '%s' to '%s': %s", temp_file, groupfile, strerror(errno)); + return err; + } + + return 0; +} + +/* + * Get int64 value from card group configuration + * Returns: 0 on success, negative error code on failure + */ +int card_group_get_int64(snd_config_t *config_group, const char *id, long long *val) +{ + snd_config_t *node; + int err; + + if (!config_group || !id || !val) + return -EINVAL; + + err = snd_config_search(config_group, id, &node); + if (err < 0) + return err; + + err = snd_config_get_integer64(node, val); + if (err < 0) { + long ival; + err = snd_config_get_integer(node, &ival); + if (err < 0) + return err; + *val = ival; + } + + return 0; +} + +/* + * Set int64 value in card group configuration + * Returns: 0 on success, negative error code on failure + */ +int card_group_set_int64(snd_config_t *config_group, const char *id, long long val) +{ + snd_config_t *node; + int err; + + if (!config_group || !id) + return -EINVAL; + + err = snd_config_search(config_group, id, &node); + if (err < 0) { +_create: + err = snd_config_make_integer64(&node, id); + if (err < 0) { + error("Cannot create int64 node for id '%s': %s", id, snd_strerror(err)); + return err; + } + err = snd_config_add(config_group, node); + if (err < 0) { + error("Cannot add int64 node for id '%s': %s", id, snd_strerror(err)); + snd_config_delete(node); + return err; + } + } else { + /* alsa-lib should implement automatic type conversion */ + if (snd_config_get_type(node) == SND_CONFIG_TYPE_INTEGER) { + snd_config_delete(node); + goto _create; + } + } + + err = snd_config_set_integer64(node, val); + if (err < 0) { + error("Cannot set int64 value for id '%s': %s", id, snd_strerror(err)); + return err; + } + + return 0; +} + +/* + * Helper: Find or create card compound within a group + * Returns: 0 on success, negative error code on failure + */ +static int card_group_get_or_create_card_compound(snd_config_t *config_group, snd_config_t **card_compound) +{ + int err; + + if (!config_group || !card_compound) + return -EINVAL; + + err = snd_config_search(config_group, "card", card_compound); + if (err < 0) { + /* Create card compound */ + err = snd_config_make_compound(card_compound, "card", 0); + if (err < 0) { + error("Cannot create card compound: %s", snd_strerror(err)); + return err; + } + err = snd_config_add(config_group, *card_compound); + if (err < 0) { + error("Cannot add card compound: %s", snd_strerror(err)); + snd_config_delete(*card_compound); + return err; + } + } + + return 0; +} + +/* + * Helper: Determine the primary card in the card compound + * Returns: card number, otherwise error code + */ +static long card_group_find_primary(snd_config_t *card_compound) +{ + snd_config_iterator_t i, next; + + if (!card_compound) + return -EINVAL; + + if (snd_config_get_type(card_compound) != SND_CONFIG_TYPE_COMPOUND) + return -EINVAL; + + snd_config_for_each(i, next, card_compound) { + snd_config_t *card_node = snd_config_iterator_entry(i); + long card_val; + int err; + + err = snd_config_get_integer(card_node, &card_val); + if (err < 0) + return -EINVAL; + + return card_val; + } + + return -ENOENT; +} + +/* + * Helper: Find card node in card compound + * Returns: card node if found, NULL otherwise + */ +static snd_config_t *card_group_find_card_node(snd_config_t *card_compound, int cardno) +{ + snd_config_iterator_t i, next; + + if (!card_compound) + return NULL; + + if (snd_config_get_type(card_compound) != SND_CONFIG_TYPE_COMPOUND) + return NULL; + + snd_config_for_each(i, next, card_compound) { + snd_config_t *card_node = snd_config_iterator_entry(i); + long card_val; + int err; + + err = snd_config_get_integer(card_node, &card_val); + if (err < 0) + continue; + + if ((int)card_val == cardno) + return card_node; + } + + return NULL; +} + +/* + * Helper: Add card to card compound + * Returns: 0 on success, negative error code on failure + */ +static int card_group_add_card(snd_config_t *card_compound, int cardno) +{ + snd_config_t *new_card_node; + char card_id[16]; + int card_index = 0; + int err; + + if (!card_compound) + return -EINVAL; + + /* Find next available card index */ + while (card_index < 100) { + snprintf(card_id, sizeof(card_id), "%d", card_index); + if (snd_config_search(card_compound, card_id, &new_card_node) < 0) + break; + card_index++; + } + + err = snd_config_make_integer(&new_card_node, card_id); + if (err < 0) { + error("Cannot create card node: %s", snd_strerror(err)); + return err; + } + + err = snd_config_set_integer(new_card_node, cardno); + if (err < 0) { + error("Cannot set card number: %s", snd_strerror(err)); + snd_config_delete(new_card_node); + return err; + } + + err = snd_config_add(card_compound, new_card_node); + if (err < 0) { + error("Cannot add card node: %s", snd_strerror(err)); + snd_config_delete(new_card_node); + return err; + } + + return 0; +} + +/* + * Check boot parameters validity + * Returns: 0 on success, negative error code on failure + */ +int check_boot_params_validity(snd_ctl_t *handle, int cardno, char **boot_card_group, bool *valid, bool *in_sync, bool *restored, int *primary_card, long long *synctime) +{ + long long boot_time = -1; + long long restore_time = -1; + long long primary_card_val = -1; + long long boot_synctime = -1; + snd_config_t *config = NULL; + snd_config_t *config_group = NULL; + const char *card_group_name = NULL; + long long group_boot_realtime = -1; + long long group_boot_monotonic = -1; + long long group_boot_synctime = -1; + struct timespec ts_realtime, ts_monotonic; + long long diff_realtime, diff_monotonic, diff; + snd_config_iterator_t i, next; + int err = 0; + bool is_valid = false; + + if (valid) + *valid = false; + if (in_sync) + *in_sync = false; + if (restored) + *restored = false; + if (primary_card) + *primary_card = -1; + if (boot_card_group) + *boot_card_group = NULL; + + err = read_boot_params(handle, &boot_time, &boot_synctime, &restore_time, &primary_card_val); + if (err < 0) { + dbg("Boot element not present or error reading: %s", snd_strerror(err)); + err = 0; + goto out; + } + + if (boot_time <= 0) { + dbg("boot_time is not greater than zero: %lld", boot_time); + goto out; + } + + err = card_group_load(&config); + if (err < 0) { + dbg("Error loading card group configuration: %s", snd_strerror(err)); + err = 0; + goto out; + } + + if (!config) { + dbg("No group configuration found"); + goto out; + } + + /* Find the card number in card groups - prefer group with newest boot_realtime */ + snd_config_for_each(i, next, config) { + snd_config_t *n = snd_config_iterator_entry(i); + snd_config_t *card_compound; + const char *group_id; + long long current_boot_realtime; + + if (snd_config_get_id(n, &group_id) < 0) + continue; + + if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) + continue; + + err = snd_config_search(n, "card", &card_compound); + if (err < 0) + continue; + + if (!card_group_find_card_node(card_compound, cardno)) + continue; + + err = card_group_get_int64(n, "boot_realtime", ¤t_boot_realtime); + if (err < 0) { + dbg("boot_realtime not found in group '%s', skipping", group_id); + continue; + } + + if (current_boot_realtime > group_boot_realtime) { + group_boot_realtime = current_boot_realtime; + config_group = n; + card_group_name = group_id; + } + } + + if (!card_group_name) { + dbg("Card %d not found in any group configuration", cardno); + err = 0; + goto out; + } + + err = card_group_get_int64(config_group, "boot_monotonic", &group_boot_monotonic); + if (err < 0) { + dbg("boot_monotonic not found in group '%s'", card_group_name); + err = 0; + goto out; + } + + err = card_group_get_int64(config_group, "boot_synctime", &group_boot_synctime); + if (err < 0) { + dbg("boot_synctime not found in group '%s'", card_group_name); + err = 0; + goto out; + } + + if (*synctime > 0 && group_boot_synctime != *synctime) { + err = -EINVAL; + error("Synchronization time window does not match (%lld != %lld)", *synctime, group_boot_synctime); + goto out; + } + + if (boot_synctime > 0 && group_boot_synctime != boot_synctime) { + err = -EINVAL; + error("Element synchronization time window does not match (%lld != %lld)", boot_synctime, group_boot_synctime); + goto out; + } + + if (clock_gettime(CLOCK_REALTIME, &ts_realtime) < 0) { + err = -errno; + error("Failed to get CLOCK_REALTIME: %s", strerror(errno)); + goto out; + } + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts_monotonic) < 0) { + err = -errno; + error("Failed to get CLOCK_MONOTONIC_RAW: %s", strerror(errno)); + goto out; + } + + diff_monotonic = ts_monotonic.tv_sec - group_boot_monotonic; + diff_realtime = ts_realtime.tv_sec - group_boot_realtime; + diff = diff_realtime - diff_monotonic; + dbg("Card group '%s' sync diffs - %lld, %lld, %lld", + card_group_name, (long long)diff_monotonic, (long long)diff_realtime, (long long)diff); + /* if the time difference is too big (30 seconds) - obsolete configuration */ + is_valid = diff < 30 || diff > -30; + + if (valid) + *valid = is_valid; + + if (is_valid) { + if (boot_card_group) { + *boot_card_group = strdup(card_group_name); + if (!*boot_card_group) { + err = -ENOMEM; + goto out; + } + } + if (primary_card) { + *primary_card = (int)primary_card_val; + dbg("Card group '%s' primary_card %d", card_group_name, *primary_card); + } + if (restored) { + *restored = restore_time > 0; + dbg("Card group '%s' restored %d", card_group_name, *restored); + } + if (in_sync) { + *in_sync = ts_realtime.tv_sec - group_boot_realtime < group_boot_synctime; + dbg("Card group '%s' in_sync %d - %lld, %lld, %lld", + card_group_name, *in_sync, (long long)ts_realtime.tv_sec, + (long long)group_boot_realtime, (long long)group_boot_synctime); + } + + if (synctime) + *synctime = group_boot_synctime; + } + +out: + if (config) + snd_config_delete(config); + return err; +} + +/* + * Remove card from boot parameters - scans all groups and removes all invalid + * cards in group containing the card. + * Returns: 0 = no change, 1 = change (card(s) removed), negative error code on failure + */ +static int boot_params_remove_card_config(snd_config_t *group_config, int cardno) +{ + snd_config_t *card_compound, *card_node; + snd_config_iterator_t i, next; + const char *group_id; + struct timespec ts_monotonic = {0}; + long primary_card, card_val; + int err, changes; + bool valid; + + if (snd_config_get_id(group_config, &group_id) < 0) + return -EINVAL; + + err = snd_config_search(group_config, "card", &card_compound); + if (err < 0) + return 0; + + primary_card = card_group_find_primary(card_compound); + if (primary_card == cardno) { +_primary: + dbg("Removing group '%s' (primary card %d)", group_id, cardno); + snd_config_delete(group_config); + return 1; + } + + card_node = card_group_find_card_node(card_compound, cardno); + if (card_node == NULL) + return 0; + + dbg("Removing card %d in group '%s'", cardno, group_id); + + changes = 1; + snd_config_delete(card_node); + +_retry: + snd_config_for_each(i, next, card_compound) { + snd_config_t *card_node = snd_config_iterator_entry(i); + snd_ctl_t *handle = NULL; + char name[32]; + long long boot_time = -1; + + err = snd_config_get_integer(card_node, &card_val); + if (err < 0) + continue; + + valid = false; + + sprintf(name, "hw:%ld", card_val); + err = snd_ctl_open(&handle, name, SND_CTL_READONLY); + if (err >= 0) { + err = read_boot_params(handle, &boot_time, NULL, NULL, NULL); + snd_ctl_close(handle); + if (err < 0) { + dbg("Unable to read boot params for card %ld: %s", card_val, snd_strerror(err)); + continue; + } + + if (ts_monotonic.tv_sec == 0) { + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts_monotonic) < 0) { + dbg("Failed to get CLOCK_MONOTONIC_RAW: %s", strerror(errno)); + return changes; + } + } + valid = validate_boot_time(boot_time, ts_monotonic.tv_sec, 0); + } else { + dbg("Unable to open ctl handle for card %ld: %s", card_val, snd_strerror(err)); + } + + if (!valid) { + if (card_val == primary_card) { + dbg("Primary card %ld is invalid in group '%s'", card_val, group_id); + goto _primary; + } + changes++; + dbg("Removing another card %ld in group '%s'", card_val, group_id); + snd_config_delete(card_node); + goto _retry; + } + } + if (snd_config_is_empty(card_compound)) { + dbg("No other cards in group '%s', removing", group_id); + snd_config_delete(group_config); + } + + return changes > 0; +} + +/* + * Remove card from boot parameters - scans all groups and removes all invalid + * cards in group containing the card. + * Returns: 0 on success, negative error code on failure + */ +int boot_params_remove_card(int cardno) +{ + snd_config_t *config = NULL; + snd_config_iterator_t i, next; + const char *group_id = NULL; + int groups_changed = 0; + int err = 0; + + /* Load the group configuration */ + err = card_group_load(&config); + if (err < 0) { + error("Error loading card group configuration: %s", snd_strerror(err)); + goto out; + } + + if (!config) { + dbg("No group configuration found"); + err = 0; + goto out; + } + + /* Scan all groups and remove any that contain this card */ +restart_scan: + snd_config_for_each(i, next, config) { + snd_config_t *group = snd_config_iterator_entry(i); + + if (snd_config_get_id(group, &group_id) < 0) + continue; + + if (snd_config_get_type(group) != SND_CONFIG_TYPE_COMPOUND) + continue; + + err = boot_params_remove_card_config(group, cardno); + if (err < 0) { + error("Unable to remove card %d from group '%s': %s", cardno, group_id, snd_strerror(err)); + continue; + } + if (err > 0) + groups_changed++; + goto restart_scan; + } + + if (groups_changed == 0) { + dbg("Card %d not found in any group", cardno); + err = 0; + goto out; + } + + dbg("Update %d group(s) containing card %d", groups_changed, cardno); + + /* Save the updated configuration */ + err = card_group_save(config); + if (err < 0) { + error("Cannot save card group configuration: %s", snd_strerror(err)); + goto out; + } + +out: + if (config) + snd_config_delete(config); + return err; +} + +/* + * Update restored time for all cards in boot group + * cards in group containing the card. + */ +static void boot_params_update_restored(snd_config_t *card_compound, int skip_cardno, + long long boot_time, long long restored, long long primary_cardno) +{ + snd_config_iterator_t i, next; + int err; + + /* Scan all groups and remove any that contain this card */ + snd_config_for_each(i, next, card_compound) { + snd_config_t *card_node = snd_config_iterator_entry(i); + long long boot_time_val, boot_synctime, boot_primary; + snd_ctl_t *handle; + char name[32]; + long card_val; + + err = snd_config_get_integer(card_node, &card_val); + if (err < 0) + continue; + + if (skip_cardno == (long)card_val) + continue; + + sprintf(name, "hw:%ld", card_val); + err = snd_ctl_open(&handle, name, SND_CTL_READONLY); + if (err < 0) { + dbg("Unable to open ctl handle for card %ld: %s", card_val, snd_strerror(err)); + continue; + } + + err = read_boot_params(handle, &boot_time_val, &boot_synctime, NULL, &boot_primary); + if (err < 0) { + dbg("Unable to read boot params for card %ld: %s", card_val, snd_strerror(err)); + goto _next; + } + + if (boot_time_val != boot_time) { + dbg("Boot time mismatch (%lld != %lld)", boot_time, boot_time_val); + goto _next; + } + + if (boot_primary != primary_cardno) { + dbg("Primary card mismatch (%lld != %lld)", boot_primary, primary_cardno); + goto _next; + } + + err = write_boot_params(handle, boot_time_val, boot_synctime, restored, boot_primary); + if (err < 0) { + dbg("Unable to save boot params: %s", snd_strerror(err)); + goto _next; + } + + add_linked_card(card_val); + +_next: + snd_ctl_close(handle); + } +} + +/* + * Update boot parameters + * Returns: 0 on success, negative error code on failure + */ +int update_boot_params(snd_ctl_t *handle, int cardno, const char *boot_card_group, + bool valid, bool restored, long long synctime) +{ + snd_config_t *config = NULL; + snd_config_t *config_group = NULL; + snd_config_t *card_compound = NULL; + struct timespec ts_realtime, ts_monotonic; + long long value; + long long boot_time = 0; + long long restore_time; + long long primary_card; + int err = 0; + + if (!boot_card_group) { + error("boot_card_group parameter is required"); + return -EINVAL; + } + + if (synctime <= 0) { + error("synchronization time window is required"); + return -EINVAL; + } + + err = card_group_load(&config); + if (err < 0) { + error("Error loading card group configuration: %s", snd_strerror(err)); + goto out; + } + + if (!config) { + err = snd_config_top(&config); + if (err < 0) { + error("Cannot create top config: %s", snd_strerror(err)); + goto out; + } + } + + /* If valid is false, remove the boot_card_group from configuration */ + if (!valid) { + err = snd_config_search(config, boot_card_group, &config_group); + if (err == 0 && config_group) { + err = boot_params_remove_card_config(config_group, cardno); + if (err < 0) { + error("Cannot manage group '%s': %s", boot_card_group, snd_strerror(err)); + goto out; + } + dbg("Updated group '%s' in configuration", boot_card_group); + } + } + + if (clock_gettime(CLOCK_REALTIME, &ts_realtime) < 0) { + err = -errno; + error("Failed to get CLOCK_REALTIME: %s", strerror(errno)); + goto out; + } + ts_realtime.tv_nsec = 0; + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts_monotonic) < 0) { + err = -errno; + error("Failed to get CLOCK_MONOTONIC_RAW: %s", strerror(errno)); + goto out; + } + ts_monotonic.tv_nsec = 0; + restore_time = ts_monotonic.tv_sec; + + err = snd_config_search(config, boot_card_group, &config_group); + if (err < 0) { + err = snd_config_make_compound(&config_group, boot_card_group, 0); + if (err < 0) { + error("Cannot create group '%s': %s", boot_card_group, snd_strerror(err)); + goto out; + } + err = snd_config_add(config, config_group); + if (err < 0) { + error("Cannot add group '%s': %s", boot_card_group, snd_strerror(err)); + snd_config_delete(config_group); + goto out; + } + } + + err = card_group_get_or_create_card_compound(config_group, &card_compound); + if (err < 0) + goto out; + + primary_card = card_group_find_primary(card_compound); + if (primary_card < 0) { + dbg("Primary card not found, using %d", cardno); + primary_card = cardno; + } + + if (!card_group_find_card_node(card_compound, cardno)) { + err = card_group_add_card(card_compound, cardno); + if (err < 0) + goto out; + } + + if (primary_card != cardno || valid) { + err = card_group_get_int64(config_group, "boot_realtime", &value); + if (err < 0) { + err = card_group_set_int64(config_group, "boot_realtime", ts_realtime.tv_sec); + if (err < 0) { + error("Cannot set boot_realtime: %s", snd_strerror(err)); + goto out; + } + dbg("Set boot_realtime to %lld", (long long)ts_realtime.tv_sec); + } else { + dbg("Preserving existing boot_realtime: %lld", value); + ts_realtime.tv_sec = value; + } + + err = card_group_get_int64(config_group, "boot_monotonic", &value); + if (err < 0) { + err = card_group_set_int64(config_group, "boot_monotonic", ts_monotonic.tv_sec); + if (err < 0) { + error("Cannot set boot_monotonic: %s", snd_strerror(err)); + goto out; + } + dbg("Set boot_monotonic to %lld", (long long)ts_monotonic.tv_sec); + } else { + dbg("Preserving existing boot_monotonic: %lld", value); + ts_monotonic.tv_sec = value; + } + } else { + err = card_group_set_int64(config_group, "boot_realtime", ts_realtime.tv_sec); + if (err < 0) { + error("Cannot set boot_realtime: %s", snd_strerror(err)); + goto out; + } + dbg("Set boot_realtime to %lld", (long long)ts_realtime.tv_sec); + err = card_group_set_int64(config_group, "boot_monotonic", ts_monotonic.tv_sec); + if (err < 0) { + error("Cannot set boot_monotonic: %s", snd_strerror(err)); + goto out; + } + dbg("Set boot_monotonic to %lld", (long long)ts_monotonic.tv_sec); + } + + if (synctime > 0) { + err = card_group_set_int64(config_group, "boot_synctime", synctime); + if (err < 0) { + error("Cannot set boot_synctime: %s", snd_strerror(err)); + goto out; + } + } + + err = card_group_set_int64(config_group, "boot_last_update", ts_realtime.tv_sec); + if (err < 0) { + error("Cannot set boot_last_update: %s", snd_strerror(err)); + goto out; + } + + err = card_group_save(config); + if (err < 0) { + error("Cannot save card group configuration: %s", snd_strerror(err)); + goto out; + } + + /* Update '.Boot' control element on the card */ + boot_time = ts_monotonic.tv_sec; + if (!restored) + restore_time = -1; + + err = write_boot_params(handle, boot_time, synctime, restore_time, primary_card); + if (err < 0) { + error("Cannot write boot parameters: %s", snd_strerror(err)); + goto out; + } + + if (primary_card == cardno) + boot_params_update_restored(card_compound, primary_card, boot_time, restore_time, primary_card); + + dbg("Updated boot parameters for card %d in group '%s'", cardno, boot_card_group); + +out: + if (config) + snd_config_delete(config); + return err; +} + diff --git a/alsactl/conf/90-alsa-restore.rules.in b/alsactl/conf/90-alsa-restore.rules.in new file mode 100644 index 0000000..6edf97a --- /dev/null +++ b/alsactl/conf/90-alsa-restore.rules.in @@ -0,0 +1,31 @@ +# do not edit this file, it will be overwritten on update + +ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*",@extratest@ GOTO="alsa_restore_go" +GOTO="alsa_restore_end" + +LABEL="alsa_restore_go" + +ENV{ALSA_CARD_NUMBER}="$attr{device/number}" + +# mark HDA analog card; HDMI/DP card does not have capture devices +DRIVERS=="snd_hda_intel", TEST=="device/pcmC$env{ALSA_CARD_NUMBER}D0c", RUN+="/bin/sh -c 'echo ALSA_CARD_HDA_ANALOG=$env{ALSA_CARD_NUMBER} >> /run/udev/alsa-hda-analog-card'" + +# check for ACP hardware +TEST=="device/device/acp3x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp6x-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp63-dmic-capture", GOTO="alsa_hda_analog" +TEST=="device/device/acp-dmic-codec", GOTO="alsa_hda_analog" +GOTO="alsa_restore_std" + +LABEL="alsa_hda_analog" +# restore configuration for profile with combined cards (HDA + digital mic) +TEST!="/run/udev/alsa-hda-analog-card", GOTO="alsa_restore_std" +IMPORT{program}="/usr/bin/cat /run/udev/alsa-hda-analog-card" +ENV{ALSA_CARD_HDA_ANALOG}!="", ENV{ALSA_CARD_NUMBER}="$env{ALSA_CARD_HDA_ANALOG}" + +LABEL="alsa_restore_std" +TEST!="@daemonswitch@", IMPORT{program}="@sbindir@/alsactl@args@ --export restore $env{ALSA_CARD_NUMBER}" +TEST=="@daemonswitch@", IMPORT{program}="@sbindir@/alsactl@args@ --export nrestore $env{ALSA_CARD_NUMBER}" +ENV{ALSA_CARD_STATE}=="waiting", ENV{SYSTEMD_WANTS}="alsa-card-wait@$env{ALSA_CARD_NUMBER}.service" + +LABEL="alsa_restore_end" diff --git a/alsactl/conf/alsa-card-wait@.service.in b/alsactl/conf/alsa-card-wait@.service.in new file mode 100644 index 0000000..816074f --- /dev/null +++ b/alsactl/conf/alsa-card-wait@.service.in @@ -0,0 +1,12 @@ +# +# ALSA card initialization handler for cards in waiting state +# This service is triggered by udev when ALSA_CARD_STATE=waiting +# + +[Unit] +Description=ALSA Card Initialization for card %I + +[Service] +Type=oneshot +RemainAfterExit=no +ExecStart=@sbindir@/alsactl@args@ wrestore %i diff --git a/alsactl/conf/alsa-restore.service.in b/alsactl/conf/alsa-restore.service.in new file mode 100644 index 0000000..80fd5fd --- /dev/null +++ b/alsactl/conf/alsa-restore.service.in @@ -0,0 +1,15 @@ +# +# Note that two different ALSA card state management schemes exist and they +# can be switched using a file exist check - /etc/alsa/state-daemon.conf . +# + +[Unit] +Description=Save/Restore Sound Card State +ConditionPathExists=!@daemonswitch@ +ConditionPathExistsGlob=/dev/snd/control* + +[Service] +Type=oneshot +RemainAfterExit=true +ExecStart=-@sbindir@/alsactl restore +ExecStop=-@sbindir@/alsactl store diff --git a/alsactl/conf/alsa-state.service.in b/alsactl/conf/alsa-state.service.in new file mode 100644 index 0000000..5a8fe5e --- /dev/null +++ b/alsactl/conf/alsa-state.service.in @@ -0,0 +1,13 @@ +# +# Note that two different ALSA card state management schemes exist and they +# can be switched using a file exist check - /etc/alsa/state-daemon.conf . +# + +[Unit] +Description=Manage Sound Card State (restore and store) +ConditionPathExists=@daemonswitch@ + +[Service] +Type=simple +ExecStart=-@sbindir@/alsactl -s -n 19 -c rdaemon +ExecStop=-@sbindir@/alsactl -s kill save_and_quit diff --git a/alsactl/daemon.c b/alsactl/daemon.c index 5109015..4b9d392 100644 --- a/alsactl/daemon.c +++ b/alsactl/daemon.c @@ -79,6 +79,8 @@ static void card_free(struct card **card) { struct card *c = *card; + if (c == NULL) + return; free_list(&c->blacklist); free_list(&c->whitelist); if (c->handle) diff --git a/alsactl/export.c b/alsactl/export.c new file mode 100644 index 0000000..422a92c --- /dev/null +++ b/alsactl/export.c @@ -0,0 +1,133 @@ +/* + * Advanced Linux Sound Architecture Control Program - Export + * Copyright (c) by Jaroslav Kysela + * + * + * 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 + * + */ + +/** + * Export variable syntax: + * + * For single card: + * + * ALSA_CARD_NUMBER= + * ALSA_CARD_STATE= + * + * For multiple cards: + * + * ALSA_CARD#_STATE= # where # is replaced with the card number + * + * State list: + * + * active # card was initialized and active + * skip # card was skipped (other card in group) + * waiting # card is waiting for the initial configuration + */ + +#include "aconfig.h" +#include "version.h" +#include +#include +#include +#include "alsactl.h" + +/* Global array to store card states (0 = active, 1 = waiting) */ +static int export_card_state[32]; + +/** + * export_card_state_set - Set card state + * @card: Card number + * @state: Card state (0 = active, 1 = waiting) + * + * Returns 0 on success, negative error code on failure + */ +int export_card_state_set(int card, int state) +{ + /* Check bounds */ + if (card < 0 || (unsigned long)card >= ARRAY_SIZE(export_card_state)) + return -EINVAL; + + export_card_state[card] = state; + return 0; +} + +/** + * export_card_state_print - Export and print card state information + * @iter: Card iterator containing current card information + * + * Prints key=value pairs based on iterator's single flag and export_card_state array. + * Returns 0 on success, negative error code on failure + */ +static int export_card_state_print(struct snd_card_iterator *iter) +{ + const char *state; + int istate; + + if (!iter) + return -EINVAL; + + /* Check bounds */ + if (iter->card < 0 || (unsigned long)iter->card >= ARRAY_SIZE(export_card_state)) + return -EINVAL; + + /* Determine state from export_card_state array */ + istate = export_card_state[iter->card]; + switch (istate) { + case CARD_STATE_WAIT: state = "waiting"; break; + case CARD_STATE_SKIP: state = "skip"; break; + default: state = "active"; break; + } + + if (iter->single) { + /* Single card export format */ + printf("ALSA_CARD_NUMBER=%d\n", iter->card); + printf("ALSA_CARD_STATE=%s\n", state); + } else { + /* Multiple cards export format */ + printf("ALSA_CARD%d_STATE=%s\n", iter->card, state); + } + + return 0; +} + +/** + * export_cards - Export state for all cards + * @cardname: Card name or NULL for all cards + * + * Returns 0 on success, negative error code on failure + */ +int export_cards(const char *cardname) +{ + struct snd_card_iterator iter; + const char *name; + int ret; + + ret = snd_card_iterator_sinit(&iter, cardname); + if (ret < 0) + return ret; + + while ((name = snd_card_iterator_next(&iter)) != NULL) { + ret = export_card_state_print(&iter); + if (ret < 0) + break; + } + + if (ret == 0) + ret = snd_card_iterator_error(&iter); + + return ret; +} diff --git a/alsactl/info.c b/alsactl/info.c index 1d648d8..9acd701 100644 --- a/alsactl/info.c +++ b/alsactl/info.c @@ -35,7 +35,9 @@ static int pcm_device_list(snd_ctl_t *ctl, snd_pcm_stream_t stream, bool *first) streamfirst = true; while (1) { if ((err = snd_ctl_pcm_next_device(ctl, &dev)) < 0) { - error("snd_ctl_pcm_next_device"); + if (err == ENOTTY) /* no kernel support */ + return 0; + error("snd_ctl_pcm_next_device: %s", snd_strerror(err)); return err; } if (dev < 0) @@ -102,7 +104,9 @@ static int rawmidi_device_list(snd_ctl_t *ctl, snd_rawmidi_stream_t stream, bool streamfirst = true; while (1) { if ((err = snd_ctl_rawmidi_next_device(ctl, &dev)) < 0) { - error("snd_ctl_rawmidi_next_device"); + if (err == ENOTTY) /* no kernel support */ + return 0; + error("snd_ctl_rawmidi_next_device: %s", snd_strerror(err)); return err; } if (dev < 0) @@ -159,7 +163,9 @@ static int hwdep_device_list(snd_ctl_t *ctl) first = true; while (1) { if ((err = snd_ctl_hwdep_next_device(ctl, &dev)) < 0) { - error("snd_ctl_pcm_next_device"); + if (err == ENOTTY) /* no kernel support */ + return 0; + error("snd_ctl_pcm_next_device: %s", snd_strerror(err)); return err; } if (dev < 0) diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c index 267db4b..a437392 100644 --- a/alsactl/init_parse.c +++ b/alsactl/init_parse.c @@ -1761,8 +1761,8 @@ int init(const char *cfgdir, const char *filename, int flags, const char *cardna lasterr = err; continue; } - err = init_ucm(flags, iter.card); - if (err == 0) + err = init_ucm(cfgdir, flags, iter.card); + if (err == 0 || card_state_is_okay(err)) continue; err = init_space(&space, iter.card); if (err != 0) diff --git a/alsactl/init_ucm.c b/alsactl/init_ucm.c index 31e8daf..c168427 100644 --- a/alsactl/init_ucm.c +++ b/alsactl/init_ucm.c @@ -21,6 +21,8 @@ #include "aconfig.h" #include +#include +#include #include "alsactl.h" #ifdef HAVE_ALSA_USE_CASE_H @@ -28,51 +30,290 @@ #include /* - * Keep it as simple as possible. Execute commands from the - * FixedBootSequence and BootSequence only. + * Helper: Check if card should skip initialization based on boot parameters + * Returns: 1 if should skip, 2 if should skip other card, 0 if should continue, negative on error + * If check_restored is true, also checks if card state is already restored */ -int init_ucm(int flags, int cardno) +static int should_skip_initialization(snd_ctl_t *ctl, int cardno, int flags, + char **boot_card_group, bool *valid, + bool *in_sync, bool *restored, int *primary_card, + long long *synctime) +{ + int err; + + err = check_boot_params_validity(ctl, cardno, boot_card_group, valid, in_sync, restored, primary_card, synctime); + if (err < 0) { + dbg("boot parameters validity failed: %s", snd_strerror(err)); + return err; + } + + /* do nothing for other cards in group */ + if (*valid && *primary_card != cardno) { + dbg("Skipping card %d - not primary (primary is %d)", cardno, *primary_card); + return CARD_STATE_SKIP; + } + + /* for immediate initialization, caller must set UCM force-restore flag */ + if (*valid && *in_sync && (flags & FLAG_UCM_RESTORE) == 0) { + dbg("Skipping card %d - in sync and no force-restore flag", cardno); + return CARD_STATE_WAIT; + } + return 0; +} + +/* + * Helper: Get boot card group configuration from UCM + * Returns: 0 on success, negative on error + */ +static int get_boot_card_group_config(snd_use_case_mgr_t *uc_mgr, char **boot_card_group, long long *synctime) +{ + char *sync_time = NULL; + int err; + + err = snd_use_case_get(uc_mgr, "=BootCardGroup", (const char **)boot_card_group); + if (err != 0 || *boot_card_group == NULL) { + return -ENOENT; + } + + dbg("BootCardGroup found: %s", *boot_card_group); + + /* Get optional sync time */ + err = snd_use_case_get(uc_mgr, "=BootCardSyncTime", (const char **)&sync_time); + if (err == 0 && sync_time != NULL) { + char *endptr; + errno = 0; + *synctime = strtoll(sync_time, &endptr, 10); + if (errno != 0 || *endptr != '\0' || endptr == sync_time) { + error("Invalid BootCardSyncTime value '%s'", sync_time); + *synctime = DEFAULT_SYNC_TIME; + } + free(sync_time); + } + + return 0; +} + +/* + * Helper: Open UCM manager with appropriate flags + * Returns: 0 on success, negative on error + */ +static int open_ucm_manager(snd_use_case_mgr_t **uc_mgr, int cardno, int flags, + bool valid, bool fixed_boot) +{ + char id[64], *nodev, *in_boot; + int err; + + nodev = (flags & FLAG_UCM_NODEV) ? "" : "-"; + in_boot = (valid || !fixed_boot) ? "" : "<<>>"; + snprintf(id, sizeof(id), "%s%shw:%d", nodev, in_boot, cardno); + + err = snd_use_case_mgr_open(uc_mgr, id); + dbg("ucm open '%s': %d", id, err); + + return err; +} + +/* + * Helper: Reopen UCM manager without InBoot flag + * Returns: 0 on success, negative on error + */ +static int reopen_ucm_manager(snd_use_case_mgr_t **uc_mgr, int cardno, int flags) +{ + char id[64], *nodev; + int err; + + snd_use_case_mgr_close(*uc_mgr); + + nodev = (flags & FLAG_UCM_NODEV) ? "" : "-"; + snprintf(id, sizeof(id), "%shw:%d", nodev, cardno); + + err = snd_use_case_mgr_open(uc_mgr, id); + dbg("ucm reopen '%s': %d", id, err); + + return err; +} + +/* + * Helper: Execute boot sequences + * Returns: 0 on success, negative on error + */ +static int execute_boot_sequences(const char *cfgdir, snd_use_case_mgr_t *uc_mgr, + int cardno, int flags, bool fixed_boot) +{ + int err = 0; + + if (fixed_boot) { + err = snd_card_clean_cfgdir(cfgdir, cardno); + if (err < 0) { + dbg("ucm clean cfgdir: %d", err); + return err; + } + err = snd_use_case_set(uc_mgr, "_fboot", NULL); + dbg("ucm _fboot: %d", err); + if (err == -ENOENT && (flags & FLAG_UCM_BOOT) != 0) { + /* _fboot not found but _boot requested - continue */ + err = 0; + } else if (err < 0) { + return err; + } + } + + if (flags & FLAG_UCM_BOOT) { + err = snd_use_case_set(uc_mgr, "_boot", NULL); + dbg("ucm _boot: %d", err); + if (err < 0) + return err; + + if ((flags & FLAG_UCM_DEFAULTS) != 0) + err = snd_use_case_set(uc_mgr, "_defaults", NULL); + } + + return err; +} + +/* + * Execute commands from the FixedBootSequence and BootSequence. + * Handle also card groups. + * Returns: 0 = success, 1 = skip this card (e.g. linked or in-sync), negative on error + */ +int init_ucm(const char *cfgdir, int flags, int cardno) { snd_use_case_mgr_t *uc_mgr; - char id[32], *nodev; - int err; + char id[64]; + char *boot_card_group = NULL, *boot_card_group_verify = NULL; + bool fixed_boot, valid = false, in_sync = false, restored = false; + snd_ctl_t *ctl = NULL; + int err, primary_card = -1, lock_fd = -1; + long long synctime = -1; if (flags & FLAG_UCM_DISABLED) { dbg("ucm disabled"); return -ENXIO; } - nodev = (flags & FLAG_UCM_NODEV) ? "" : "-"; - snprintf(id, sizeof(id), "%shw:%d", nodev, cardno); - err = snd_use_case_mgr_open(&uc_mgr, id); - dbg("ucm open '%s': %d", id, err); - if (err < 0) + fixed_boot = (flags & FLAG_UCM_FBOOT) != 0; + + snprintf(id, sizeof(id), "hw:%d", cardno); + err = snd_ctl_open(&ctl, id, 0); + if (err < 0) { + dbg("UCM: unable to open control device '%s': %s", id, snd_strerror(err)); return err; - if (flags & FLAG_UCM_FBOOT) { - err = snd_use_case_set(uc_mgr, "_fboot", NULL); - dbg("ucm _fboot: %d", err); - if (err == -ENOENT && (flags & FLAG_UCM_BOOT) != 0) { - /* nothing */ + } + + err = should_skip_initialization(ctl, cardno, flags, &boot_card_group, &valid, + &in_sync, &restored, &primary_card, &synctime); + if (err != 0) + goto _fin; + + if (valid) { + if (restored) { + err = CARD_STATE_RESTORED; + goto _fin; + } + lock_fd = group_state_lock(groupfile, LOCK_TIMEOUT); + if (lock_fd < 0) { + err = lock_fd; + goto _fin; + } + } + + err = open_ucm_manager(&uc_mgr, cardno, flags, valid, fixed_boot); + if (err < 0) + goto _fin; + + if (!fixed_boot) + goto _execute_boot; + + if (!valid) { + err = get_boot_card_group_config(uc_mgr, &boot_card_group, &synctime); + if (err == -ENOENT) { + /* No BootCardGroup - remove any existing boot params */ + err = boot_params_remove_card(cardno); + if (err < 0) + goto _error; + goto _execute_boot; } else if (err < 0) { goto _error; } + + if (lock_fd < 0) { + lock_fd = group_state_lock(groupfile, LOCK_TIMEOUT); + if (lock_fd < 0) { + err = lock_fd; + goto _error; + } + } + + err = should_skip_initialization(ctl, cardno, flags, &boot_card_group_verify, + &valid, &in_sync, &restored, &primary_card, &synctime); + if (err != 0) + goto _error; + + if (valid && (boot_card_group_verify == NULL || strcmp(boot_card_group_verify, boot_card_group) != 0)) { + dbg("expected different boot card group (got '%s', expected '%s')", boot_card_group_verify, boot_card_group); + err = -EINVAL; + goto _error; + } + + if ((flags & FLAG_UCM_RESTORE) == 0 && (!valid || restored)) { + dbg("Skipping card %d (group '%s') - %s and no force-restore flag", cardno, boot_card_group, + !valid ? "validity not passed" : "already restored"); + if (!valid) { + /* create initial 'Boot' element */ + err = update_boot_params(ctl, cardno, boot_card_group, 0, restored, synctime); + if (err < 0) + goto _error; + } + err = restored ? CARD_STATE_RESTORED : CARD_STATE_WAIT; + goto _error; + } + + err = reopen_ucm_manager(&uc_mgr, cardno, flags); + if (err < 0) + goto _fin; } - if (flags & FLAG_UCM_BOOT) { - err = snd_use_case_set(uc_mgr, "_boot", NULL); - dbg("ucm _boot: %d", err); + +_execute_boot: + if (fixed_boot) + restored = true; + + if (boot_card_group) { + err = update_boot_params(ctl, cardno, boot_card_group, valid, restored, synctime); if (err < 0) goto _error; - if ((flags & FLAG_UCM_DEFAULTS) != 0) - err = snd_use_case_set(uc_mgr, "_defaults", NULL); } + + err = execute_boot_sequences(cfgdir, uc_mgr, cardno, flags, fixed_boot); + if (err < 0) + goto _error; + + err = 0; + _error: snd_use_case_mgr_close(uc_mgr); +_fin: + if (fixed_boot && primary_card >= 0 && primary_card != cardno) { + /* remove card specific configuration files for other cards in group */ + int clean_err = snd_card_clean_cfgdir(cfgdir, cardno); + if (clean_err < 0) { + dbg("ucm clean cfgdir: %d", clean_err); + if (err >= 0) + err = clean_err; + } + } + if (lock_fd >= 0) + group_state_unlock(lock_fd, groupfile); + if (ctl) + snd_ctl_close(ctl); + free(boot_card_group); + free(boot_card_group_verify); + dbg("ucm init complete %d", err); return err; } #else -int init_ucm(int flags, int cardno) +int init_ucm(const char *cfgdir, int flags, int cardno) { return -ENXIO; } diff --git a/alsactl/lock.c b/alsactl/lock.c index 4927b70..e3df982 100644 --- a/alsactl/lock.c +++ b/alsactl/lock.c @@ -181,6 +181,40 @@ int state_unlock(int _fd, const char *file) return err; } +static void group_state_lock_file(char *buf, size_t buflen) +{ + const char *name = strrchr(groupfile, '/'); + if (name && name[0]) + name++; + else + name = "card-group.state"; + snprintf(buf, buflen, "%s/%s.lock", lockpath, name); +} + +int group_state_lock(const char *file, int timeout) +{ + char fn[PATH_SIZE]; + int err; + + group_state_lock_file(fn, sizeof(fn)); + err = state_lock_(fn, 1, timeout, -1); + if (err < 0) + error("file %s lock error: %s", file, strerror(-err)); + return err; +} + +int group_state_unlock(int _fd, const char *file) +{ + char fn[PATH_SIZE]; + int err; + + group_state_lock_file(fn, sizeof(fn)); + err = state_lock_(fn, 0, 10, _fd); + if (err < 0) + error("file %s unlock error: %s", file, strerror(-err)); + return err; +} + static void card_lock_file(char *buf, size_t buflen, int card_number) { snprintf(buf, buflen, "%s/card%i.lock", lockpath, card_number); diff --git a/alsactl/monitor.c b/alsactl/monitor.c index 36e9398..e830ba5 100644 --- a/alsactl/monitor.c +++ b/alsactl/monitor.c @@ -176,7 +176,7 @@ static int check_control_cdev(int infd, bool *retry) ssize_t len = read(infd, buf, sizeof(*ev) + NAME_MAX); if (len < 0) { if (errno != EAGAIN) - err = errno; + err = -errno; break; } else if (len == 0) { break; diff --git a/alsactl/state.c b/alsactl/state.c index 88996d4..79bd309 100644 --- a/alsactl/state.c +++ b/alsactl/state.c @@ -29,6 +29,33 @@ #include #include "alsactl.h" +static int linked_cards[16]; + +static void init_linked_cards(void) +{ + size_t index; + + for (index = 0; index < ARRAY_SIZE(linked_cards); index++) + linked_cards[index] = -1; +} + +void add_linked_card(int cardno) +{ + size_t index; + + for (index = 0; index < ARRAY_SIZE(linked_cards); index++) { + if (linked_cards[index] == cardno) + return; + } + + for (index = 0; index < ARRAY_SIZE(linked_cards); index++) { + if (linked_cards[index] < 0) { + linked_cards[index] = cardno; + return; + } + } + error("Too many linked cards!"); +} static char *id_str(snd_ctl_elem_id_t *id) { @@ -1201,32 +1228,114 @@ static int restore_config_value2(snd_ctl_t *handle, snd_ctl_elem_info_t *info, return 0; } -static int set_control(snd_ctl_t *handle, snd_config_t *control, - int *maxnumid, int doit) +static int parse_config_id(snd_config_t *control, snd_ctl_elem_id_t *id, + snd_config_t **comment, snd_config_t **value, int doit) +{ + snd_config_iterator_t i, next; + const char *numid; + snd_ctl_elem_iface_t iface = -1; + long device = -1; + long subdevice = -1; + const char *name = NULL; + long index = -1; + + snd_ctl_elem_id_clear(id); + if (snd_config_get_id(control, &numid) < 0) + return -EINVAL; + snd_config_for_each(i, next, control) { + snd_config_t *n = snd_config_iterator_entry(i); + const char *fld; + if (snd_config_get_id(n, &fld) < 0) + continue; + if (strcmp(fld, "comment") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { + cerror(doit, "control.%s.%s is invalid", numid, fld); + return -EINVAL; + } + if (comment) + *comment = n; + continue; + } + if (strcmp(fld, "iface") == 0) { + iface = (snd_ctl_elem_iface_t)config_iface(n); + if (iface < 0) + return -EINVAL; + continue; + } + if (strcmp(fld, "device") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%s.%s is invalid", numid, fld); + return -EINVAL; + } + if (snd_config_get_integer(n, &device) < 0) + return -EINVAL; + continue; + } + if (strcmp(fld, "subdevice") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%s.%s is invalid", numid, fld); + return -EINVAL; + } + if (snd_config_get_integer(n, &subdevice) < 0) + return -EINVAL; + continue; + } + if (strcmp(fld, "name") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_STRING) { + cerror(doit, "control.%s.%s is invalid", numid, fld); + return -EINVAL; + } + if (snd_config_get_string(n, &name) < 0) + return -EINVAL; + continue; + } + if (strcmp(fld, "index") == 0) { + if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { + cerror(doit, "control.%s.%s is invalid", numid, fld); + return -EINVAL; + } + if (snd_config_get_integer(n, &index) < 0) + return -EINVAL; + continue; + } + if (strcmp(fld, "value") == 0) { + if (value) + *value = n; + continue; + } + cerror(doit, "unknown control.%s.%s field", numid, fld); + } + if (device < 0) + device = 0; + if (subdevice < 0) + subdevice = 0; + if (index < 0) + index = 0; + snd_ctl_elem_id_set_interface(id, iface); + snd_ctl_elem_id_set_device(id, device); + snd_ctl_elem_id_set_subdevice(id, subdevice); + snd_ctl_elem_id_set_name(id, name); + snd_ctl_elem_id_set_index(id, index); + return 0; +} + +static int set_control(snd_ctl_t *handle, snd_config_t *control, int doit) { snd_ctl_elem_value_t *ctl; snd_ctl_elem_info_t *info; snd_config_iterator_t i, next; - unsigned int numid1; - snd_ctl_elem_iface_t iface = -1; - int iface1; - const char *name1; + snd_ctl_elem_id_t *elem_id, *elem_id1; unsigned int numid; snd_ctl_elem_type_t type; unsigned int count; - long device = -1; - long device1; - long subdevice = -1; - long subdevice1; - const char *name = NULL; - long index1; - long index = -1; snd_config_t *value = NULL; snd_config_t *comment = NULL; unsigned int idx; int err; char *set; const char *id; + snd_ctl_elem_id_alloca(&elem_id); + snd_ctl_elem_id_alloca(&elem_id1); snd_ctl_elem_value_alloca(&ctl); snd_ctl_elem_info_alloca(&info); if (snd_config_get_type(control) != SND_CONFIG_TYPE_COMPOUND) { @@ -1239,92 +1348,17 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control, return -EINVAL; } numid = atoi(id); - if ((int)numid > *maxnumid) - *maxnumid = numid; - snd_config_for_each(i, next, control) { - snd_config_t *n = snd_config_iterator_entry(i); - const char *fld; - if (snd_config_get_id(n, &fld) < 0) - continue; - if (strcmp(fld, "comment") == 0) { - if (snd_config_get_type(n) != SND_CONFIG_TYPE_COMPOUND) { - cerror(doit, "control.%d.%s is invalid", numid, fld); - return -EINVAL; - } - comment = n; - continue; - } - if (strcmp(fld, "iface") == 0) { - iface = (snd_ctl_elem_iface_t)config_iface(n); - if (iface < 0) - return -EINVAL; - continue; - } - if (strcmp(fld, "device") == 0) { - if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { - cerror(doit, "control.%d.%s is invalid", numid, fld); - return -EINVAL; - } - if (snd_config_get_integer(n, &device) < 0) - return -EINVAL; - continue; - } - if (strcmp(fld, "subdevice") == 0) { - if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { - cerror(doit, "control.%d.%s is invalid", numid, fld); - return -EINVAL; - } - if (snd_config_get_integer(n, &subdevice) < 0) - return -EINVAL; - continue; - } - if (strcmp(fld, "name") == 0) { - if (snd_config_get_type(n) != SND_CONFIG_TYPE_STRING) { - cerror(doit, "control.%d.%s is invalid", numid, fld); - return -EINVAL; - } - if (snd_config_get_string(n, &name) < 0) - return -EINVAL; - continue; - } - if (strcmp(fld, "index") == 0) { - if (snd_config_get_type(n) != SND_CONFIG_TYPE_INTEGER) { - cerror(doit, "control.%d.%s is invalid", numid, fld); - return -EINVAL; - } - if (snd_config_get_integer(n, &index) < 0) - return -EINVAL; - continue; - } - if (strcmp(fld, "value") == 0) { - value = n; - continue; - } - cerror(doit, "unknown control.%d.%s field", numid, fld); - } - if (!value) { - cerror(doit, "missing control.%d.value", numid); - return -EINVAL; - } - if (device < 0) - device = 0; - if (subdevice < 0) - subdevice = 0; - if (index < 0) - index = 0; - + err = parse_config_id(control, elem_id, &comment, &value, doit); + if (err < 0) + return err; err = -EINVAL; if (!force_restore) { snd_ctl_elem_info_set_numid(info, numid); err = snd_ctl_elem_info(handle, info); } - if (err < 0 && name) { - snd_ctl_elem_info_set_numid(info, 0); - snd_ctl_elem_info_set_interface(info, iface); - snd_ctl_elem_info_set_device(info, device); - snd_ctl_elem_info_set_subdevice(info, subdevice); - snd_ctl_elem_info_set_name(info, name); - snd_ctl_elem_info_set_index(info, index); + id = snd_ctl_elem_id_get_name(elem_id); + if (err < 0 && id && id[0]) { + snd_ctl_elem_info_set_id(info, elem_id); err = snd_ctl_elem_info(handle, info); if (err < 0 && comment && check_comment_access(comment, "user")) { err = add_user_control(handle, info, comment); @@ -1339,28 +1373,39 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control, cerror(doit, "failed to obtain info for control #%d (%s)", numid, snd_strerror(err)); return -ENOENT; } - numid1 = snd_ctl_elem_info_get_numid(info); - iface1 = snd_ctl_elem_info_get_interface(info); - device1 = snd_ctl_elem_info_get_device(info); - subdevice1 = snd_ctl_elem_info_get_subdevice(info); - name1 = snd_ctl_elem_info_get_name(info); - index1 = snd_ctl_elem_info_get_index(info); count = snd_ctl_elem_info_get_count(info); + snd_ctl_elem_info_get_id(info, elem_id1); type = snd_ctl_elem_info_get_type(info); - if (err |= numid != numid1 && !force_restore) - cerror(doit, "warning: numid mismatch (%d/%d) for control #%d", - numid, numid1, numid); - if (err |= (int)iface != iface1) - cerror(doit, "warning: iface mismatch (%d/%d) for control #%d", iface, iface1, numid); - if (err |= device != device1) - cerror(doit, "warning: device mismatch (%ld/%ld) for control #%d", device, device1, numid); - if (err |= subdevice != subdevice1) - cerror(doit, "warning: subdevice mismatch (%ld/%ld) for control #%d", subdevice, subdevice1, numid); - if (err |= strcmp(name, name1)) - cerror(doit, "warning: name mismatch (%s/%s) for control #%d", name, name1, numid); - if (err |= index != index1) - cerror(doit, "warning: index mismatch (%ld/%ld) for control #%d", index, index1, numid); - if (err < 0) { + err = 0; + if (err |= !force_restore && numid != snd_ctl_elem_id_get_numid(elem_id1)) + cerror(doit, "warning: numid mismatch (%u/%u) for control #%d", + (unsigned int)numid, snd_ctl_elem_id_get_numid(elem_id1), numid); + if (err |= snd_ctl_elem_id_get_interface(elem_id) != snd_ctl_elem_id_get_interface(elem_id1)) + cerror(doit, "warning: iface mismatch (%d/%d) for control #%d", + (int)snd_ctl_elem_id_get_interface(elem_id), + (int)snd_ctl_elem_id_get_interface(elem_id1), + numid); + if (err |= snd_ctl_elem_id_get_device(elem_id) != snd_ctl_elem_id_get_device(elem_id1)) + cerror(doit, "warning: device mismatch (%u/%u) for control #%d", + snd_ctl_elem_id_get_device(elem_id), + snd_ctl_elem_id_get_device(elem_id1), + numid); + if (err |= snd_ctl_elem_id_get_subdevice(elem_id) != snd_ctl_elem_id_get_subdevice(elem_id1)) + cerror(doit, "warning: subdevice mismatch (%u/%%u) for control #%d", + snd_ctl_elem_id_get_subdevice(elem_id), + snd_ctl_elem_id_get_subdevice(elem_id1), + numid); + if (err |= strcmp(snd_ctl_elem_id_get_name(elem_id), snd_ctl_elem_id_get_name(elem_id1))) + cerror(doit, "warning: name mismatch (%s/%s) for control #%d", + snd_ctl_elem_id_get_name(elem_id), + snd_ctl_elem_id_get_name(elem_id1), + numid); + if (err |= snd_ctl_elem_id_get_index(elem_id) != snd_ctl_elem_id_get_index(elem_id1)) + cerror(doit, "warning: index mismatch (%u/%u) for control #%d", + snd_ctl_elem_id_get_index(elem_id), + snd_ctl_elem_id_get_index(elem_id1), + numid); + if (err) { cerror(doit, "failed to obtain info for control #%d (%s)", numid, snd_strerror(err)); return -ENOENT; } @@ -1383,7 +1428,7 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control, if (snd_ctl_elem_info_is_inactive(info) || !snd_ctl_elem_info_is_writable(info)) return 0; - snd_ctl_elem_value_set_numid(ctl, numid1); + snd_ctl_elem_value_set_numid(ctl, snd_ctl_elem_id_get_numid(elem_id1)); if (count == 1) { err = restore_config_value(handle, info, type, value, ctl, 0, doit); @@ -1472,8 +1517,14 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control, _ok: err = doit ? snd_ctl_elem_write(handle, ctl) : 0; if (err < 0) { - error("Cannot write control '%d:%ld:%ld:%s:%ld' : %s", (int)iface, device, subdevice, name, index, snd_strerror(err)); + char *s = snd_ctl_ascii_elem_id_get(elem_id1); + error("Cannot write control '%s' : %s", s, snd_strerror(err)); + free(s); return err; + } else if (debugflag) { + char *s = snd_ctl_ascii_elem_id_get(elem_id1); + dbg("control '%s' restored", s); + free(s); } return 0; } @@ -1487,7 +1538,7 @@ static int set_controls(int card, snd_config_t *top, int doit) snd_ctl_elem_id_t *elem_id; snd_config_t *control; snd_config_iterator_t i, next; - int err, maxnumid = -1, maxnumid2 = -1; + int err, controls1 = -1, controls2 = -1, ucontrols = -1, diff; unsigned int idx, count = 0; char name[32], tmpid[16]; const char *id; @@ -1527,11 +1578,13 @@ static int set_controls(int card, snd_config_t *top, int doit) cerror(doit, "state.%s.control is not a compound\n", id); return -EINVAL; } + controls1 = 0; snd_config_for_each(i, next, control) { snd_config_t *n = snd_config_iterator_entry(i); - err = set_control(handle, n, &maxnumid, doit); + err = set_control(handle, n, doit); if (err < 0 && (!force_restore || !doit)) goto _close; + controls1++; } if (doit) @@ -1545,7 +1598,7 @@ static int set_controls(int card, snd_config_t *top, int doit) count = snd_ctl_elem_list_get_count(list); dbg("list count: %u", count); if (count == 0) - goto _check; + goto _free; snd_ctl_elem_list_set_offset(list, 0); if (snd_ctl_elem_list_alloc_space(list, count) < 0) { error("No enough memory..."); @@ -1555,28 +1608,30 @@ static int set_controls(int card, snd_config_t *top, int doit) error("Cannot determine controls (2): %s", snd_strerror(err)); goto _free; } - maxnumid2 = 0; - /* skip non-readable elements */ + controls2 = ucontrols = 0; + /* skip non-readable and count user elements */ for (idx = 0; idx < count; ++idx) { snd_ctl_elem_info_clear(elem_info); snd_ctl_elem_list_get_id(list, idx, elem_id); snd_ctl_elem_info_set_id(elem_info, elem_id); if (snd_ctl_elem_info(handle, elem_info) == 0) { + if (snd_ctl_elem_info_is_user(elem_info)) + ucontrols++; if (!snd_ctl_elem_info_is_readable(elem_info)) continue; - maxnumid2++; + controls2++; } } /* check if we have additional controls in driver */ /* in this case we should go through init procedure */ - _check: - dbg("maxnumid=%i maxnumid2=%i", maxnumid, maxnumid2); - if (maxnumid >= 0 && maxnumid != maxnumid2) { + diff = controls2 - controls1; + dbg("controls1=%i controls2=%i ucontrols=%i diff=%i", controls1, controls2, ucontrols, diff); + if (controls1 >= 0 && (-diff > ucontrols || diff > ucontrols)) { /* not very informative */ /* but value is used for check only */ err = -EAGAIN; - dbg("more controls than maxnumid?"); + dbg("config controls mismatch with hardware?"); } _free: @@ -1675,10 +1730,11 @@ int load_state(const char *cfgdir, const char *file, const char *initfile, int initflags, const char *cardname, int do_init) { - int err, finalerr = 0, open_failed, lock_fd; + int err, finalerr = 0, open_failed, lock_fd, cardno; struct snd_card_iterator iter; snd_config_t *config; const char *cardname1; + size_t index; config = NULL; err = load_configuration(file, &config, &open_failed); @@ -1695,6 +1751,9 @@ int load_state(const char *cfgdir, const char *file, while ((cardname1 = snd_card_iterator_next(&iter)) != NULL) { if (!do_init) break; + init_linked_cards(); + if (initflags & FLAG_UCM_WAIT) + wait_for_card(-1, iter.card); lock_fd = card_lock(iter.card, LOCK_TIMEOUT); if (lock_fd < 0) { finalerr = lock_fd; @@ -1703,9 +1762,12 @@ int load_state(const char *cfgdir, const char *file, } err = init(cfgdir, initfile, initflags | FLAG_UCM_FBOOT | FLAG_UCM_BOOT, cardname1); card_unlock(lock_fd, iter.card); + if (card_state_is_okay(err)) + export_card_state_set(iter.card, err); if (err < 0) { finalerr = err; initfailed(iter.card, "init", err); + continue; } initfailed(iter.card, "restore", -ENOENT); } @@ -1719,6 +1781,9 @@ int load_state(const char *cfgdir, const char *file, if (err < 0) goto out; while ((cardname1 = snd_card_iterator_next(&iter)) != NULL) { + init_linked_cards(); + if (initflags & FLAG_UCM_WAIT) + wait_for_card(-1, iter.card); lock_fd = card_lock(iter.card, LOCK_TIMEOUT); if (lock_fd < 0) { initfailed(iter.card, "lock", lock_fd); @@ -1726,7 +1791,20 @@ int load_state(const char *cfgdir, const char *file, continue; } /* error is ignored */ - init_ucm(initflags | FLAG_UCM_FBOOT, iter.card); + err = init_ucm(cfgdir, initflags | FLAG_UCM_FBOOT, iter.card); + /* return code 1 and 2 -> postpone initialization */ + if (card_state_is_okay(err)) { + export_card_state_set(iter.card, err); + goto unlock_card; + } else if (err < 0) { + /* no UCM - remove card specific configuration */ + err = snd_card_clean_cfgdir(cfgdir, iter.card); + if (err < 0) { + initfailed(iter.card, "cfgdir", err); + finalerr = err; + continue; + } + } /* do a check if controls matches state file */ if (do_init && set_controls(iter.card, config, 0)) { err = init(cfgdir, initfile, initflags | FLAG_UCM_BOOT, cardname1); @@ -1740,6 +1818,18 @@ int load_state(const char *cfgdir, const char *file, finalerr = err; initfailed(iter.card, "restore", err); } + /* for linked cards, restore controls, too */ + for (index = 0; index < ARRAY_SIZE(linked_cards); index++) { + if ((cardno = linked_cards[index]) < 0) + break; + dbg("Restore for linked card %d", cardno); + if ((err = set_controls(cardno, config, 1))) { + if (!force_restore) + finalerr = err; + initfailed(cardno, "restore", err); + } + } +unlock_card: card_unlock(lock_fd, iter.card); } err = finalerr ? finalerr : snd_card_iterator_error(&iter); diff --git a/alsactl/utils.c b/alsactl/utils.c index d8cbf53..d0f8940 100644 --- a/alsactl/utils.c +++ b/alsactl/utils.c @@ -177,7 +177,7 @@ void dbg_(const char *fcn, long line, const char *fmt, ...) va_end(ap); } -void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...) +void error_handler(const char *file, int line, const char *function, int errcode, const char *fmt, ...) { char buf[2048]; va_list arg; @@ -187,12 +187,36 @@ void error_handler(const char *file, int line, const char *function, int err, co va_end(arg); if (use_syslog) syslog(LOG_ERR, "alsa-lib %s:%i:(%s) %s%s%s\n", file, line, function, - buf, err ? ": " : "", err ? snd_strerror(err) : ""); + buf, errcode ? ": " : "", errcode ? snd_strerror(errcode) : ""); else fprintf(stderr, "alsa-lib %s:%i:(%s) %s%s%s\n", file, line, function, - buf, err ? ": " : "", err ? snd_strerror(err) : ""); + buf, errcode ? ": " : "", errcode ? snd_strerror(errcode) : ""); } +#if SND_LIB_VER(1, 2, 15) >= SND_LIB_VERSION +void log_handler(int prio, int interface, const char *file, int line, const char *function, int errcode, const char *fmt, va_list arg) +{ + char buf[2048], level[50] = ""; + const char *text1, *text2; + + if (!snd_lib_log_filter(prio, interface, NULL)) + return; + + text1 = snd_lib_log_priority(prio); + text2 = snd_lib_log_interface(interface); + if (text1 || text2) + snprintf(level, sizeof(level), "[%s.%s] ", text1 ? text1 : "", text2 ? text2 : ""); + + vsnprintf(buf, sizeof(buf), fmt, arg); + if (use_syslog) + syslog(LOG_ERR, "alsa-lib %s:%i:(%s) %s%s%s%s\n", file, line, function, level, + buf, errcode ? ": " : "", errcode ? snd_strerror(errcode) : ""); + else + fprintf(stderr, "alsa-lib %s:%i:(%s) %s%s%s%s\n", file, line, function, level, + buf, errcode ? ": " : "", errcode ? snd_strerror(errcode) : ""); +} +#endif + int load_configuration(const char *file, snd_config_t **top, int *open_failed) { snd_config_t *config; @@ -329,6 +353,7 @@ int snd_card_clean_cfgdir(const char *cfgdir, int cardno) lasterr = -errno; } } + free(list); return lasterr; } diff --git a/alsactl/wait.c b/alsactl/wait.c new file mode 100644 index 0000000..bebcc3c --- /dev/null +++ b/alsactl/wait.c @@ -0,0 +1,200 @@ +/* + * Advanced Linux Sound Architecture Control Program - Wait for Boot + * Copyright (c) by Jaroslav Kysela + * + * + * 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 + * + */ + +#include "aconfig.h" +#include "version.h" +#include +#include +#include +#include +#include +#include "alsactl.h" + +/** + * \brief Wait for card boot synchronization using Boot control element + * \param timeout Maximum wait time in seconds + * \param cardno Card number + * \return 0 on success, negative error code on failure + * + * This function waits until the card releases the 'waiting' state (UCM). + * It monitors the '.Boot' control element and uses snd_ctl_wait() and + * snd_ctl_read() for event-based waiting, similar to boot_wait() in + * ../alsa-lib/alsa-lib/src/ucm/main.c + */ +int wait_for_card(long long timeout, int cardno) +{ + snd_ctl_t *handle; + snd_ctl_event_t *event; + snd_ctl_elem_id_t *id; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *value; + long long boot_time_val, restore_time_val; + long long synctime = -1; + struct timespec start_time, now; + char name[32]; + int err; + + sprintf(name, "hw:%d", cardno); + err = snd_ctl_open(&handle, name, SND_CTL_READONLY); + if (err < 0) { + error("snd_ctl_open error for %s: %s", name, snd_strerror(err)); + return err; + } + + /* Try to get synctime from boot_synctime in group configuration */ + if (timeout <= 0) { + bool valid = false, restored = false; + err = check_boot_params_validity(handle, cardno, NULL, &valid, NULL, &restored, NULL, &synctime); + if (err == 0 && synctime > 0) { + timeout = synctime; + dbg("Using boot_synctime value: %lld seconds", timeout); + } else { + timeout = DEFAULT_SYNC_TIME; + } + /* Break early if boot params are invalid or already restored */ + if (!valid || restored) { + dbg("Boot params check: valid=%d, restored=%d - skipping wait", valid, restored); + snd_ctl_close(handle); + return 0; + } + } + + snd_ctl_event_alloca(&event); + snd_ctl_elem_id_alloca(&id); + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_value_alloca(&value); + + snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_CARD); + snd_ctl_elem_id_set_name(id, ".Boot"); + + snd_ctl_elem_info_set_id(info, id); + err = snd_ctl_elem_info(handle, info); + if (err < 0) { + dbg("Boot control element not present on card %d, skipping wait", cardno); + snd_ctl_close(handle); + return 0; /* No Boot element, no wait needed */ + } + + if (snd_ctl_elem_info_get_type(info) != SND_CTL_ELEM_TYPE_INTEGER64) { + error("Boot control element is not INTEGER64 type on card %d", cardno); + snd_ctl_close(handle); + return -EINVAL; + } + + if (snd_ctl_elem_info_get_count(info) < 3) { + error("Boot control element does not have count >= 3 on card %d", cardno); + snd_ctl_close(handle); + return -EINVAL; + } + + err = snd_ctl_subscribe_events(handle, 1); + if (err < 0) { + error("Cannot subscribe to control events: %s", snd_strerror(err)); + snd_ctl_close(handle); + return err; + } + + clock_gettime(CLOCK_MONOTONIC_RAW, &start_time); + + dbg("Waiting for card %d to become ready (timeout=%lld seconds)", cardno, timeout); + + while (1) { + long long diff, remaining = 0; + long long sync_time_val = -1; + + clock_gettime(CLOCK_MONOTONIC_RAW, &now); + + /* Read current Boot control values */ + err = read_boot_params(handle, &boot_time_val, &sync_time_val, &restore_time_val, NULL); + if (err < 0) { + error("Failed to read Boot control element: %s", snd_strerror(err)); + goto _fin; + } + + dbg("Boot info: boot_time=%lld, sync_time=%lld, restore_time=%lld", boot_time_val, sync_time_val, restore_time_val); + + if (restore_time_val > 0) { + diff = now.tv_sec - restore_time_val; + dbg("Controls already restored (diff=%lld seconds), card is ready", diff); + err = 0; + goto _fin; + } + + /* note that realtime may differ from monotonic time, add one second for safety */ + diff = now.tv_sec - start_time.tv_sec; + if (diff > timeout + 1) { + dbg("Maximum wait time exceeded (%lld >= %lld seconds), proceeding", diff, timeout); + break; + } + + remaining = timeout - diff; + + /* Use synctime from element to limit timeout if available */ + if (sync_time_val > 0 && sync_time_val < timeout) { + dbg("Limiting timeout from %lld to sync_time %lld seconds", timeout, sync_time_val); + timeout = sync_time_val; + } + + if (!validate_boot_time(boot_time_val, now.tv_sec, timeout)) { + if (boot_time_val > 0) { + diff = now.tv_sec - boot_time_val; + dbg("Boot timeout reached (%lld >= %lld seconds), proceeding", diff, timeout); + } + break; + } + + diff = now.tv_sec - boot_time_val; + if (timeout - diff < remaining) + remaining = timeout - diff; + if (remaining <= 0) + remaining = 1; + + dbg("Waiting %lld seconds", remaining); + err = snd_ctl_wait(handle, remaining * 1000); + if (err < 0) { + error("snd_ctl_wait failed: %s", snd_strerror(err)); + goto _fin; + } + + if (err == 0) + continue; /* Timeout, no events */ + + /* Read and check events */ + while (snd_ctl_read(handle, event) > 0) { + if (!(snd_ctl_event_elem_get_mask(event) & SND_CTL_EVENT_MASK_VALUE)) + continue; /* Not a value change event */ + + if (snd_ctl_event_elem_get_interface(event) != SND_CTL_ELEM_IFACE_CARD || + snd_ctl_event_elem_get_index(event) != 0 || + strcmp(snd_ctl_event_elem_get_name(event), ".Boot") != 0) + continue; + + dbg("Boot control element value changed"); + break; + } + } + + err = 0; +_fin: + snd_ctl_subscribe_events(handle, 0); + snd_ctl_close(handle); + return err; +} diff --git a/alsaloop/pcmjob.c b/alsaloop/pcmjob.c index ffb439b..2720f55 100644 --- a/alsaloop/pcmjob.c +++ b/alsaloop/pcmjob.c @@ -647,13 +647,15 @@ static int xrun(struct loopback_handle *lhandle) int err; if (lhandle == lhandle->loopback->play) { - logit(LOG_DEBUG, "underrun for %s\n", lhandle->id); + if (verbose) + logit(LOG_DEBUG, "underrun for %s\n", lhandle->id); xrun_stats(lhandle->loopback); if ((err = snd_pcm_prepare(lhandle->handle)) < 0) return err; lhandle->xrun_pending = 1; } else { - logit(LOG_DEBUG, "overrun for %s\n", lhandle->id); + if (verbose) + logit(LOG_DEBUG, "overrun for %s\n", lhandle->id); xrun_stats(lhandle->loopback); if ((err = snd_pcm_prepare(lhandle->handle)) < 0) return err; diff --git a/alsamixer/mainloop.c b/alsamixer/mainloop.c index 7ca785b..3cb51b4 100644 --- a/alsamixer/mainloop.c +++ b/alsamixer/mainloop.c @@ -34,6 +34,7 @@ static WINDOW *curses_initialized; +#if SND_LIB_VER(1, 2, 15) < SND_LIB_VERSION static void black_hole_error_handler(const char *file ATTRIBUTE_UNUSED, int line ATTRIBUTE_UNUSED, const char *function ATTRIBUTE_UNUSED, @@ -41,6 +42,18 @@ static void black_hole_error_handler(const char *file ATTRIBUTE_UNUSED, const char *fmt ATTRIBUTE_UNUSED, ...) { } +#else +static void black_hole_log_handler(int prio ATTRIBUTE_UNUSED, + int interface ATTRIBUTE_UNUSED, + const char *file ATTRIBUTE_UNUSED, + int line ATTRIBUTE_UNUSED, + const char *function ATTRIBUTE_UNUSED, + int errcode ATTRIBUTE_UNUSED, + const char *fmt ATTRIBUTE_UNUSED, + va_list arg ATTRIBUTE_UNUSED) +{ +} +#endif void initialize_curses(bool use_color, bool use_mouse) { @@ -55,7 +68,11 @@ void initialize_curses(bool use_color, bool use_mouse) if (use_mouse) mousemask(ALL_MOUSE_EVENTS, NULL); +#if SND_LIB_VER(1, 2, 15) < SND_LIB_VERSION snd_lib_error_set_handler(black_hole_error_handler); +#else + snd_lib_log_set_handler(black_hole_log_handler); +#endif } void app_shutdown(void) diff --git a/alsamixer/volume_mapping.c b/alsamixer/volume_mapping.c index 29ab061..f34801c 100644 --- a/alsamixer/volume_mapping.c +++ b/alsamixer/volume_mapping.c @@ -146,6 +146,8 @@ static int set_normalized_volume(snd_mixer_elem_t *elem, min_norm = pow(10, (min - max) / 6000.0); volume = volume * (1 - min_norm) + min_norm; } + if (volume <= 0) + volume = 1e-36; value = lrint_dir(6000.0 * log10(volume), dir) + max; return set_dB[ctl_dir](elem, channel, value, dir); } diff --git a/amidi/amidi.1 b/amidi/amidi.1 index 5bc24ba..d3d321f 100644 --- a/amidi/amidi.1 +++ b/amidi/amidi.1 @@ -52,6 +52,11 @@ Prints the current version. .I \-l, \-\-list\-devices Prints a list of all hardware MIDI ports. +.TP +.I \-x, \-\-list\-inactive +Use together with \fI\-l\fP option. +Print all MIDI ports including inactive ports. + .TP .I \-L, \-\-list\-rawmidis Prints all RawMIDI definitions. diff --git a/amidi/amidi.c b/amidi/amidi.c index 75fb8c0..9a2aaf7 100644 --- a/amidi/amidi.c +++ b/amidi/amidi.c @@ -57,6 +57,7 @@ static int stop; static int sysex_interval; static snd_rawmidi_t *input, **inputp; static snd_rawmidi_t *output, **outputp; +static int list_all; static void error(const char *format, ...) { @@ -76,6 +77,7 @@ static void usage(void) "-h, --help this help\n" "-V, --version print current version\n" "-l, --list-devices list all hardware ports\n" + "-x, --list-inactive list inactive ports, too\n" "-L, --list-rawmidis list all RawMIDI definitions\n" "-p, --port=name select port by name\n" "-s, --send=file send the contents of a (.syx) file\n" @@ -151,6 +153,9 @@ static void list_device(snd_ctl_t *ctl, int card, int device) card, device, sub, snd_strerror(err)); return; } + if (!list_all && + (snd_rawmidi_info_get_flags(info) & SNDRV_RAWMIDI_INFO_STREAM_INACTIVE)) + continue; name = snd_rawmidi_info_get_name(info); sub_name = snd_rawmidi_info_get_subdevice_name(info); if (sub == 0 && sub_name[0] == '\0') { @@ -471,11 +476,12 @@ static void add_send_hex_data(const char *str) int main(int argc, char *argv[]) { - static const char short_options[] = "hVlLp:s:r:S::dt:aci:T:"; + static const char short_options[] = "hVlxLp:s:r:S::dt:aci:T:"; static const struct option long_options[] = { {"help", 0, NULL, 'h'}, {"version", 0, NULL, 'V'}, {"list-devices", 0, NULL, 'l'}, + {"list-inactive", 0, NULL, 'x'}, {"list-rawmidis", 0, NULL, 'L'}, {"port", 1, NULL, 'p'}, {"send", 1, NULL, 's'}, @@ -508,6 +514,9 @@ int main(int argc, char *argv[]) case 'l': do_device_list = 1; break; + case 'x': + list_all = 1; + break; case 'L': do_rawmidi_list = 1; break; diff --git a/amixer/amixer.c b/amixer/amixer.c index 8b8000b..07e9819 100644 --- a/amixer/amixer.c +++ b/amixer/amixer.c @@ -587,10 +587,17 @@ static void decode_tlv(unsigned int spaces, unsigned int *tlv, unsigned int tlv_ #endif default: printf("unk-%u-", type); - while (size > 0) { + while (size > sizeof(unsigned int)) { printf("0x%08x,", tlv[idx++]); size -= sizeof(unsigned int); } + if (size > 0) { + unsigned char *b = (void *)&tlv[idx]; + while (size > 0) { + printf("E-0x%02x,", *b++); + size--; + } + } break; } if (lf) diff --git a/aplay/aplay.1 b/aplay/aplay.1 index 3bba59d..83d359d 100644 --- a/aplay/aplay.1 +++ b/aplay/aplay.1 @@ -1,6 +1,6 @@ .TH APLAY 1 "1 January 2010" .SH NAME -arecord, aplay \- command\-line sound recorder and player for ALSA +arecord, aplay \- command\-line sound recorder and player for ALSA soundcard driver .SH SYNOPSIS \fBarecord\fP [\fIflags\fP] [filename] @@ -84,41 +84,41 @@ A value of zero means infinity. The default is zero, so if this options is omitted then the record/playback process will run until it is killed. Either '-d' or '-s' option is available exclusively. .TP -\fI\-M, \-\-mmap\fP +\fI\-M, \-\-mmap\fP Use memory\-mapped (mmap) I/O mode for the audio stream. If this option is not set, the read/write I/O mode will be used. .TP -\fI\-N, \-\-nonblock\fP +\fI\-N, \-\-nonblock\fP Open the audio device in non\-blocking mode. If the device is busy the program will exit immediately. If this option is not set the program will block until the audio device is available again. .TP -\fI\-F, \-\-period\-time=#\fP +\fI\-F, \-\-period\-time=#\fP Distance between interrupts is # microseconds. If no period time and no period size is given then a quarter of the buffer time is set. .TP -\fI\-B, \-\-buffer\-time=#\fP +\fI\-B, \-\-buffer\-time=#\fP Buffer duration is # microseconds If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. .TP -\fI\-\-period\-size=#\fP +\fI\-\-period\-size=#\fP Distance between interrupts is # frames If no period size and no period time is given then a quarter of the buffer size is set. .TP -\fI\-\-buffer\-size=#\fP +\fI\-\-buffer\-size=#\fP Buffer duration is # frames If no buffer time and no buffer size is given then the maximal allowed buffer time but not more than 500ms is set. .TP -\fI\-A, \-\-avail\-min=#\fP +\fI\-A, \-\-avail\-min=#\fP Min available space for wakeup is # microseconds .TP -\fI\-R, \-\-start\-delay=#\fP -Delay for automatic PCM start is # microseconds +\fI\-R, \-\-start\-delay=#\fP +Delay for automatic PCM start is # microseconds (relative to buffer size if <= 0) .TP -\fI\-T, \-\-stop\-delay=#\fP +\fI\-T, \-\-stop\-delay=#\fP Delay for automatic PCM stop is # microseconds from xrun .TP -\fI\-v, \-\-verbose\fP +\fI\-v, \-\-verbose\fP Show PCM structure and setup. This option is accumulative. The VU meter is displayed when this is given twice or three times. @@ -128,7 +128,7 @@ Specifies the VU\-meter type, either \fIstereo\fP or \fImono\fP. The stereo VU\-meter is available only for 2\-channel stereo samples with interleaved format. .TP -\fI\-I, \-\-separate\-channels\fP +\fI\-I, \-\-separate\-channels\fP One file for each channel. This option disables max\-file\-time and use\-strftime, and ignores SIGUSR1. The stereo VU meter is not available with separate channels. @@ -212,7 +212,7 @@ Disables recovery attempts when errors (e.g. xrun) are encountered; the aplay process instead aborts immediately. .SH SIGNALS -When recording, SIGINT, SIGTERM and SIGABRT will close the output +When recording, SIGINT, SIGTERM and SIGABRT will close the output file and exit. SIGUSR1 will close the output file, open a new one, and continue recording. However, SIGUSR1 does not work with \-\-separate\-channels. @@ -222,7 +222,7 @@ and continue recording. However, SIGUSR1 does not work with .TP \fBaplay \-c 1 \-t raw \-r 22050 \-f mu_law foobar\fR will play the raw file "foobar" as a -22050\-Hz, mono, 8\-bit, Mu\-Law .au file. +22050\-Hz, mono, 8\-bit, Mu\-Law .au file. .TP \fBarecord \-d 10 \-f cd \-t wav \-D copy foobar.wav\fP @@ -257,7 +257,7 @@ alsamixer(1), amixer(1) \fP -.SH BUGS +.SH BUGS Note that .aiff files are not currently supported. .SH AUTHOR diff --git a/aplay/aplay.c b/aplay/aplay.c index 6c5a07e..0050032 100644 --- a/aplay/aplay.c +++ b/aplay/aplay.c @@ -1245,6 +1245,12 @@ static int test_au(int fd, void *buffer) fprintf(stderr, _("Warning: format is changed to S16_BE\n")); hwparams.format = SND_PCM_FORMAT_S16_BE; break; + case AU_FMT_ALAW: + if (hwparams.format != DEFAULT_FORMAT && + hwparams.format != SND_PCM_FORMAT_A_LAW) + fprintf(stderr, _("Warning: format is changed to A_LAW\n")); + hwparams.format = SND_PCM_FORMAT_A_LAW; + break; default: return -1; } @@ -1464,6 +1470,13 @@ static void set_params(void) chunk_size, buffer_size); prg_exit(EXIT_FAILURE); } + if (dump_hw_params) { + fprintf(stderr, _("HW Params of device \"%s\":\n"), + snd_pcm_name(handle)); + fprintf(stderr, "--------------------\n"); + snd_pcm_hw_params_dump(params, log); + fprintf(stderr, "--------------------\n"); + } err = snd_pcm_sw_params_current(handle, swparams); if (err < 0) { error(_("Unable to get current sw params.")); @@ -1618,6 +1631,8 @@ static void do_pause(void) error(_("pause push error: %s"), snd_strerror(err)); return; } + fprintf(stderr, _("\r=== PAUSE === ")); + fflush(stderr); while (1) { b = wait_for_input(); if (b == ' ' || b == '\r') { @@ -1642,8 +1657,6 @@ static void check_stdin(void) while (read(fileno(stdin), &b, 1) == 1) { if (b == ' ' || b == '\r') { while (read(fileno(stdin), &b, 1) == 1); - fprintf(stderr, _("\r=== PAUSE === ")); - fflush(stderr); do_pause(); fprintf(stderr, " \r"); fflush(stderr); @@ -2703,7 +2716,7 @@ static void begin_wave(int fd, size_t cnt) WaveHeader h; WaveFmtBody f; WaveChunkHeader cf, cd; - int bits; + int width, physical_width; uint32_t tmp; uint16_t tmp2; @@ -2711,23 +2724,22 @@ static void begin_wave(int fd, size_t cnt) if (cnt == (size_t)-2) cnt = 0x7fffff00; - bits = 8; + width = snd_pcm_format_physical_width(hwparams.format); + physical_width = snd_pcm_format_width(hwparams.format); + + if (width < 0 || physical_width < 0) + goto _format; + switch ((unsigned long) hwparams.format) { case SND_PCM_FORMAT_U8: - bits = 8; - break; case SND_PCM_FORMAT_S16_LE: - bits = 16; - break; + case SND_PCM_FORMAT_S24_LE: /* S24_LE is 24 bits stored in 32 bit width with 8 bit padding */ case SND_PCM_FORMAT_S32_LE: - case SND_PCM_FORMAT_FLOAT_LE: - bits = 32; - break; - case SND_PCM_FORMAT_S24_LE: + case SND_PCM_FORMAT_FLOAT_LE: case SND_PCM_FORMAT_S24_3LE: - bits = 24; break; default: +_format: error(_("Wave doesn't support %s format..."), snd_pcm_format_name(hwparams.format)); prg_exit(EXIT_FAILURE); } @@ -2745,17 +2757,11 @@ static void begin_wave(int fd, size_t cnt) f.format = LE_SHORT(WAV_FMT_PCM); f.channels = LE_SHORT(hwparams.channels); f.sample_fq = LE_INT(hwparams.rate); -#if 0 - tmp2 = (samplesize == 8) ? 1 : 2; - f.byte_p_spl = LE_SHORT(tmp2); - tmp = dsp_speed * hwparams.channels * (uint32_t) tmp2; -#else - tmp2 = hwparams.channels * snd_pcm_format_physical_width(hwparams.format) / 8; + tmp2 = hwparams.channels * physical_width / 8; f.byte_p_spl = LE_SHORT(tmp2); tmp = (uint32_t) tmp2 * hwparams.rate; -#endif f.byte_p_sec = LE_INT(tmp); - f.bit_p_spl = LE_SHORT(bits); + f.bit_p_spl = LE_SHORT(width); cd.type = WAV_DATA; cd.length = LE_INT(cnt); @@ -2787,6 +2793,9 @@ static void begin_au(int fd, size_t cnt) case SND_PCM_FORMAT_S16_BE: ah.encoding = BE_INT(AU_FMT_LIN16); break; + case SND_PCM_FORMAT_A_LAW: + ah.encoding = BE_INT(AU_FMT_ALAW); + break; default: error(_("Sparc Audio doesn't support %s format..."), snd_pcm_format_name(hwparams.format)); prg_exit(EXIT_FAILURE); diff --git a/aplay/formats.h b/aplay/formats.h index d82505e..c5408f2 100644 --- a/aplay/formats.h +++ b/aplay/formats.h @@ -120,6 +120,7 @@ typedef struct { #define AU_FMT_ULAW 1 #define AU_FMT_LIN8 2 #define AU_FMT_LIN16 3 +#define AU_FMT_ALAW 27 typedef struct au_header { uint32_t magic; /* '.snd' */ diff --git a/axfer/waiter.h b/axfer/waiter.h index 0f4e9b9..6c4f4cb 100644 --- a/axfer/waiter.h +++ b/axfer/waiter.h @@ -9,7 +9,7 @@ #ifndef __ALSA_UTILS_AXFER_WAITER__H_ #define __ALSA_UTILS_AXFER_WAITER__H_ -#include +#include #include enum waiter_type { diff --git a/bat/alsa.c b/bat/alsa.c index 67489c4..457e79a 100644 --- a/bat/alsa.c +++ b/bat/alsa.c @@ -221,7 +221,17 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm) period_time = buffer_time / DIV_BUFFERTIME; - /* Set buffer time and period time */ + /* Set period time and buffer time */ + 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_buffer_time_near(sndpcm->handle, params, &buffer_time, 0); if (err < 0) { @@ -231,16 +241,6 @@ static int set_snd_pcm_params(struct bat *bat, struct pcm_container *sndpcm) 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 */ diff --git a/bundle.json b/bundle.json index 5551e05..3cfa324 100644 --- a/bundle.json +++ b/bundle.json @@ -27,7 +27,7 @@ "third_party": [ "alsa-lib" ] }, "build": { - "sub_component": [ "//third_party/alsa-utils:alsa-utils" ], + "sub_component": [ "//third_party/alsa-utils:entry" ], "inner_kits": [], "test": [] } diff --git a/configure.ac b/configure.ac index 02b47fc..22a1e0d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT(alsa-utils, 1.2.11) +AC_INIT(alsa-utils, 1.2.15.2) AC_CONFIG_SRCDIR([aplay/aplay.c]) AC_PREFIX_DEFAULT(/usr) AM_INIT_AUTOMAKE([subdir-objects]) @@ -8,7 +8,7 @@ AM_INIT_AUTOMAKE([subdir-objects]) AM_MAINTAINER_MODE([enable]) AM_GNU_GETTEXT([external]) -AM_GNU_GETTEXT_VERSION([0.19.8]) +AM_GNU_GETTEXT_VERSION([0.22.5]) dnl Checks for programs. @@ -21,7 +21,7 @@ AC_PROG_SED AC_DISABLE_STATIC AM_PROG_LIBTOOL PKG_PROG_PKG_CONFIG -AM_PATH_ALSA(1.2.5) +AM_PATH_ALSA(1.2.13) if test "x$enable_alsatest" = "xyes"; then AC_CHECK_FUNC([snd_ctl_elem_add_enumerated], , [AC_ERROR([No user enum control support in alsa-lib])]) @@ -47,17 +47,6 @@ AC_CHECK_HEADERS([samplerate.h], [have_samplerate="yes"], [have_samplerate="no"] [#include ]) AC_CHECK_LIB([asound], [snd_seq_client_info_get_card], [HAVE_SEQ_CLIENT_INFO_GET_CARD="yes"]) -if test "$HAVE_SEQ_CLIENT_INFO_GET_CARD" = "yes" ; then - AC_DEFINE([HAVE_SEQ_CLIENT_INFO_GET_CARD], 1, [alsa-lib supports snd_seq_client_info_get_card]) -fi -AC_CHECK_LIB([asound], [snd_seq_client_info_get_pid], [HAVE_SEQ_CLIENT_INFO_GET_PID="yes"]) -if test "$HAVE_SEQ_CLIENT_INFO_GET_PID" = "yes" ; then - AC_DEFINE([HAVE_SEQ_CLIENT_INFO_GET_PID], 1, [alsa-lib supports snd_seq_client_info_get_pid]) -fi -AC_CHECK_LIB([asound], [snd_seq_client_info_get_midi_version], [HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION="yes"]) -if test "$HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION" = "yes" -a "$have_rawmidi" = "yes"; then - AC_DEFINE([HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION], 1, [alsa-lib supports snd_seq_client_info_get_midi_version]) -fi AC_CHECK_LIB([atopology], [snd_tplg_save], [have_topology="yes"], [have_topology="no"]) # @@ -430,8 +419,8 @@ AC_ARG_WITH([systemdsystemunitdir], if test "x$with_systemdsystemunitdir" != xno; then AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir]) fi -AM_CONDITIONAL(HAVE_SYSTEMD, [test "$have_min_systemd" = "yes" \ - -a -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ]) +AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir" \ + -a "x$with_systemdsystemunitdir" != xno ]) AC_ARG_WITH([asound-state-dir], AS_HELP_STRING([--with-asound-state-dir=DIR], [Directory to place asound.state file in]), @@ -457,6 +446,21 @@ AC_ARG_WITH([alsactl-daemonswitch], [ALSACTL_DAEMONSWITCH="/etc/alsa/state-daemon.conf"]) AC_SUBST(ALSACTL_DAEMONSWITCH) +AC_ARG_WITH([alsactl-udev-extra-test], + AS_HELP_STRING([--with-alsactl-udev-extra-test=TEST], [Extra udev tests]), + [ALSACTL_UDEV_EXTRATEST="$withval"], + [ALSACTL_UDEV_EXTRATEST="default"]) +if test "$ALSACTL_UDEV_EXTRATEST" = "default"; then + ALSACTL_UDEV_EXTRATEST="TEST==\"${sbindir}\", TEST==\"${mydatadir}\"," +fi +AC_SUBST(ALSACTL_UDEV_EXTRATEST) + +AC_ARG_WITH([alsactl-udev-args], + AS_HELP_STRING([--with-alsactl-udev-args=ARGS], [Extra alsactl arguments (udev rules)]), + [ALSACTL_UDEV_ARGS="$withval"], + [ALSACTL_UDEV_ARGS=""]) +AC_SUBST(ALSACTL_UDEV_ARGS) + dnl pre-process plugin directory AC_ARG_WITH(plugindir, AS_HELP_STRING([--with-plugindir=dir], @@ -486,8 +490,8 @@ AC_OUTPUT(Makefile alsactl/Makefile alsactl/init/Makefile \ bat/Makefile bat/tests/Makefile bat/tests/asound_state/Makefile \ aplay/Makefile include/Makefile iecset/Makefile utils/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 \ + seq/aplaymidi/Makefile seq/aplaymidi2/Makefile seq/aseqdump/Makefile seq/aseqnet/Makefile \ + seq/aseqsend/Makefile speaker-test/Makefile speaker-test/samples/Makefile \ alsaloop/Makefile alsa-info/Makefile \ axfer/Makefile axfer/test/Makefile \ nhlt/Makefile) diff --git a/gitcompile b/gitcompile index 93c21a7..19dd1d5 100644 --- a/gitcompile +++ b/gitcompile @@ -1,9 +1,9 @@ #!/bin/bash if test -d ../alsa-lib/utils && ! test -r `aclocal --print-ac-dir`/alsa.m4; then - alsa_m4_flags="-I ../alsa-lib/utils" + ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I ../alsa-lib/utils" fi -aclocal $alsa_m4_flags $ACLOCAL_FLAGS +aclocal $ACLOCAL_FLAGS # save original files to avoid stupid modifications by gettextize cp Makefile.am Makefile.am.ok cp configure.ac configure.ac.ok diff --git a/include/aconfig.h b/include/aconfig.h index 7fc58b3..923f61e 100644 --- a/include/aconfig.h +++ b/include/aconfig.h @@ -2,10 +2,10 @@ /* include/aconfig.h.in. Generated from configure.ac by autoheader. */ /* directory containing ALSA topology pre-process plugins */ -#define ALSA_TOPOLOGY_PLUGIN_DIR "/home/xuxuehai/code/alsa-utils-1.2.11/build/lib/alsa-topology" +#define ALSA_TOPOLOGY_PLUGIN_DIR "/usr/lib/alsa-topology" /* directory containing alsa configuration */ -#define DATADIR "/home/xuxuehai/code/alsa-utils-1.2.11/build/share/alsa" +#define DATADIR "/usr/share/alsa" /* Define to 1 if translation of program messages to the user's native language is requested. */ @@ -32,9 +32,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_ALSA_USE_CASE_H 1 -/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the - CoreFoundation framework. */ -/* #undef HAVE_CFLOCALECOPYCURRENT */ +/* Define to 1 if you have the Mac OS X function + CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES */ /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ @@ -92,9 +92,6 @@ /* Define if Linux kernel supports memfd_create system call */ #define HAVE_MEMFD_CREATE 1 -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - /* Define to 1 if you have the header file. */ #define HAVE_MENU_H 1 @@ -104,18 +101,12 @@ /* Define to 1 if you have the header file. */ /* #undef HAVE_SAMPLERATE_H */ -/* alsa-lib supports snd_seq_client_info_get_card */ -#define HAVE_SEQ_CLIENT_INFO_GET_CARD 1 - -/* alsa-lib supports snd_seq_client_info_get_midi_version */ -/* #undef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION */ - -/* alsa-lib supports snd_seq_client_info_get_pid */ -#define HAVE_SEQ_CLIENT_INFO_GET_PID 1 - /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 @@ -128,6 +119,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 @@ -147,7 +141,7 @@ #define PACKAGE_NAME "alsa-utils" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "alsa-utils 1.2.11" +#define PACKAGE_STRING "alsa-utils 1.2.15.2" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "alsa-utils" @@ -156,28 +150,26 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.2.11" +#define PACKAGE_VERSION "1.2.15.2" /* directory containing sample data */ -#define SOUNDSDIR "/home/xuxuehai/code/alsa-utils-1.2.11/build/share/sounds/alsa" +#define SOUNDSDIR "/usr/share/sounds/alsa" -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #define STDC_HEADERS 1 -/* Define to 1 if you can safely include both and . */ +/* Define to 1 if you can safely include both and . This + macro is obsolete. */ #define TIME_WITH_SYS_TIME 1 /* ALSA util version */ -#define VERSION "1.2.11" +#define VERSION "1.2.15.2" /* Define if FFADO library is available */ /* #undef WITH_FFADO */ -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ diff --git a/include/version.h b/include/version.h index cbf1232..24977b2 100644 --- a/include/version.h +++ b/include/version.h @@ -4,9 +4,9 @@ #define SND_UTIL_MAJOR 1 #define SND_UTIL_MINOR 2 -#define SND_UTIL_SUBMINOR 11 +#define SND_UTIL_SUBMINOR 15 #define SND_UTIL_VERSION ((SND_UTIL_MAJOR<<16)|\ (SND_UTIL_MINOR<<8)|\ SND_UTIL_SUBMINOR) -#define SND_UTIL_VERSION_STR "1.2.11" +#define SND_UTIL_VERSION_STR "1.2.15.2" diff --git a/po/de.po b/po/de.po index a3ac111..a9249e4 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.23\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-10 09:07+0100\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2010-11-09 21:12+0100\n" "Last-Translator: Clemens Ladisch \n" "Language-Team: German\n" @@ -16,33 +16,45 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +#: alsamixer/card_select.c:77 alsamixer/device_name.c:127 msgid "Sound Card" msgstr "Soundkarte" -#: alsamixer/card_select.c:181 +#: alsamixer/card_select.c:115 msgid "(default)" msgstr "(Standard)" -#: alsamixer/card_select.c:191 +#: alsamixer/card_select.c:125 msgid "cannot enumerate sound cards" msgstr "Fehler beim Aufzählen der Soundkarten" -#: alsamixer/card_select.c:215 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "Gerätenamen eingeben..." -#: alsamixer/cli.c:40 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "Verwendung: alsamixer [Optionen]" -#: alsamixer/cli.c:41 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" " -c, --card=NUMBER sound card number or id\n" " -D, --device=NAME mixer device name\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -m, --mouse enable mouse\n" +" -M, --no-mouse disable mouse\n" +" -f, --config=FILE configuration file\n" +" -F, --no-config do not load configuration file\n" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "Optionen:\n" " -h, --help Hilfe\n" @@ -51,7 +63,7 @@ msgstr "" " -V, --view=MODUS Ansicht beim Starten: playback=Wiedergabe, " "capture=Aufnahme, all=alle" -#: alsamixer/cli.c:46 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -61,22 +73,22 @@ msgstr "" " -g, --no-color keine Farben\n" " -a, --abstraction=NAME Mixer-Abstraktion: none/basic" -#: alsamixer/cli.c:77 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "ungültige Karten-Nummer: %s\n" -#: alsamixer/cli.c:103 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "unbekannte Abstraktion: %s\n" -#: alsamixer/cli.c:108 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "unbekannte Option: %c\n" -#: alsamixer/cli.c:110 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "siehe `alsamixer --help' für mehr Informationen\n" @@ -89,138 +101,138 @@ msgstr "Gerätename:" msgid "%s: %s\n" msgstr "%s: %s\n" -#: alsamixer/mixer_display.c:98 +#: alsamixer/mixer_display.c:99 msgid "Card:" msgstr "Gerät:" -#: alsamixer/mixer_display.c:99 +#: alsamixer/mixer_display.c:100 msgid "Chip:" msgstr "Chip:" -#: alsamixer/mixer_display.c:100 +#: alsamixer/mixer_display.c:101 msgid "View:" msgstr "Ansicht:" -#: alsamixer/mixer_display.c:101 +#: alsamixer/mixer_display.c:102 msgid "Item:" msgstr "Element:" -#: alsamixer/mixer_display.c:104 +#: alsamixer/mixer_display.c:105 msgid "F1: Help" msgstr "F1: Hilfe" -#: alsamixer/mixer_display.c:105 +#: alsamixer/mixer_display.c:106 msgid "F2: System information" msgstr "F2: System-Informationen" -#: alsamixer/mixer_display.c:106 +#: alsamixer/mixer_display.c:107 msgid "F6: Select sound card" msgstr "F6: Soundkarte auswählen" -#: alsamixer/mixer_display.c:107 +#: alsamixer/mixer_display.c:108 msgid "Esc: Exit" msgstr "Esc: Beenden" -#: alsamixer/mixer_display.c:174 +#: alsamixer/mixer_display.c:179 msgid "(unplugged)" msgstr "(entfernt)" -#: alsamixer/mixer_display.c:192 +#: alsamixer/mixer_display.c:197 msgid "Playback" msgstr "Wiedergabe" -#: alsamixer/mixer_display.c:193 +#: alsamixer/mixer_display.c:198 msgid "Capture" msgstr "Aufnahme" -#: alsamixer/mixer_display.c:194 +#: alsamixer/mixer_display.c:199 msgid "All" msgstr "Alle" -#: alsamixer/mixer_display.c:234 +#: alsamixer/mixer_display.c:240 msgid "mute" msgstr "stumm" -#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:281 alsamixer/mixer_display.c:291 msgid "dB gain:" msgstr "dB-Änderung:" -#: alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:291 #, c-format msgid " [%s %s, %s]" msgstr " [%s %s; %s]" -#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 -#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:306 +#: alsamixer/mixer_display.c:312 alsamixer/mixer_display.c:318 msgid "Off" msgstr "Aus" -#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:318 msgid "On" msgstr "An" -#: alsamixer/mixer_display.c:363 +#: alsamixer/mixer_display.c:370 msgid "The sound device was unplugged." msgstr "Das Gerät wurde entfernt." -#: alsamixer/mixer_display.c:364 +#: alsamixer/mixer_display.c:371 msgid "Press F6 to select another sound card." msgstr "Drücken Sie F6, um eine andere Soundkarte auszuwählen." -#: alsamixer/mixer_display.c:379 +#: alsamixer/mixer_display.c:386 msgid "This sound device does not have any playback controls." msgstr "Dieses Gerät hat keine Wiedergabe-Regler." -#: alsamixer/mixer_display.c:381 +#: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." msgstr "Dieses Gerät hat keine Aufnahme-Regler." -#: alsamixer/mixer_display.c:383 +#: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." msgstr "Dieses Gerät hat keine Regler." #. TRANSLATORS: playback on; one character -#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +#: alsamixer/mixer_display.c:523 alsamixer/mixer_display.c:528 msgid "O" msgstr "O" #. TRANSLATORS: playback muted; one character -#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +#: alsamixer/mixer_display.c:525 alsamixer/mixer_display.c:529 msgid "M" msgstr "M" #. TRANSLATORS: "left"; no more than two characters -#: alsamixer/mixer_display.c:536 +#: alsamixer/mixer_display.c:545 msgid "L" msgstr "L" #. TRANSLATORS: "right"; no more than two characters -#: alsamixer/mixer_display.c:540 +#: alsamixer/mixer_display.c:551 msgid "R" msgstr "R" #. TRANSLATORS: no more than eight characters -#: alsamixer/mixer_display.c:542 +#: alsamixer/mixer_display.c:555 msgid "CAPTURE" msgstr "AUFNAHME" -#: alsamixer/mixer_display.c:592 +#: alsamixer/mixer_display.c:611 msgid "Front" msgstr "Vorne" -#: alsamixer/mixer_display.c:595 +#: alsamixer/mixer_display.c:614 msgid "Rear" msgstr "Hinten" -#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:125 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "Mitte" -#: alsamixer/mixer_display.c:601 +#: alsamixer/mixer_display.c:620 msgid "Woofer" msgstr "Bass" -#: alsamixer/mixer_display.c:604 +#: alsamixer/mixer_display.c:623 msgid "Side" msgstr "Seiten" @@ -352,11 +364,11 @@ msgstr " Clemens Ladisch " msgid "Help" msgstr "Hilfe" -#: alsamixer/proc_files.c:103 +#: alsamixer/proc_files.c:56 msgid "Select File" msgstr "Datei wählen" -#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +#: alsamixer/textbox.c:51 alsamixer/textbox.c:65 msgid "Error" msgstr "Fehler" @@ -365,23 +377,23 @@ msgstr "Fehler" msgid "Cannot open file \"%s\"." msgstr "Fehler beim Öffnen der Datei \"%s\"." -#: aplay/aplay.c:178 +#: aplay/aplay.c:184 msgid "raw data" msgstr "Rohdaten" -#: aplay/aplay.c:179 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:181 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:182 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "Sparc-Audio" -#: aplay/aplay.c:203 +#: aplay/aplay.c:209 #, fuzzy, c-format msgid "" "Usage: %s [OPTION]... [FILE]...\n" @@ -395,6 +407,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -472,12 +485,12 @@ msgstr "" " --process-id-file=# schreibe Prozess-ID in diese Datei\n" " --use-strftime formatiere Dateiname mit strftime; %%v=Dateinummer\n" -#: aplay/aplay.c:248 speaker-test/speaker-test.c:1023 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "Unterstützte Sample-Formate:" -#: aplay/aplay.c:254 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -486,199 +499,205 @@ msgstr "" "\n" "Nicht alle davon sind auf jeder Hardware verfügbar.\n" -#: aplay/aplay.c:255 +#: aplay/aplay.c:262 #, fuzzy, c-format msgid "The available format shortcuts are:\n" msgstr "Unterstütze Format-Abkürzungen:\n" -#: aplay/aplay.c:256 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 Bits, Little Endian, 44100 Hz, stereo)\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 Bits, Big Endian, 44100 Hz, stereo)\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 Bits, Little Endian, 48000 Hz, stereo)\n" -#: aplay/aplay.c:272 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "keine Soundkarten gefunden ..." -#: aplay/aplay.c:275 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** Liste der Hardware-Geräte (%s) ****\n" -#: aplay/aplay.c:304 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "Karte %i: %s [%s], Gerät %i: %s [%s]\n" -#: aplay/aplay.c:310 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " Sub-Geräte: %i/%i\n" -#: aplay/aplay.c:317 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " Sub-Gerät #%i: %s\n" -#: aplay/aplay.c:398 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "Abbruch durch Signal %s ...\n" -#: aplay/aplay.c:553 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "Befehl sollte arecord oder aplay sein" -#: aplay/aplay.c:597 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "unbekanntes Dateiformat %s" -#: aplay/aplay.c:604 +#: aplay/aplay.c:614 #, fuzzy, c-format msgid "invalid channels argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:608 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "Kanalanzahl %i ist ungültig" -#: aplay/aplay.c:627 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "erweitertes Format '%s' ist ungültig" -#: aplay/aplay.c:635 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "erweitertes Format '%s' ist ungültig" + +#: aplay/aplay.c:657 #, fuzzy, c-format msgid "invalid rate argument '%s'" msgstr "ungültige Quell-Adresse %s\n" -#: aplay/aplay.c:642 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "ungültige Rate %i" -#: aplay/aplay.c:648 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "" -#: aplay/aplay.c:653 +#: aplay/aplay.c:675 #, fuzzy, c-format msgid "invalid duration argument '%s'" msgstr "ungültige Ziel-Adresse %s\n" -#: aplay/aplay.c:660 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "" -#: aplay/aplay.c:665 +#: aplay/aplay.c:687 #, fuzzy, c-format msgid "invalid samples argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:677 +#: aplay/aplay.c:699 #, fuzzy, c-format msgid "invalid period time argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:684 +#: aplay/aplay.c:706 #, fuzzy, c-format msgid "invalid buffer time argument '%s'" msgstr "ungültige Quell-Adresse %s\n" -#: aplay/aplay.c:691 +#: aplay/aplay.c:713 #, fuzzy, c-format msgid "invalid period size argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:698 +#: aplay/aplay.c:720 #, fuzzy, c-format msgid "invalid buffer size argument '%s'" msgstr "ungültige Quell-Adresse %s\n" -#: aplay/aplay.c:705 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "" -#: aplay/aplay.c:712 +#: aplay/aplay.c:734 #, fuzzy, c-format msgid "invalid start delay argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:719 +#: aplay/aplay.c:741 #, fuzzy, c-format msgid "invalid stop delay argument '%s'" msgstr "ungültige Sender-Adresse %s\n" -#: aplay/aplay.c:774 +#: aplay/aplay.c:796 #, fuzzy, c-format msgid "invalid test coef argument '%s'" msgstr "ungültige Quell-Adresse %s\n" -#: aplay/aplay.c:786 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "" -#: aplay/aplay.c:806 speaker-test/speaker-test.c:666 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, fuzzy, c-format msgid "Unable to parse channel map string: %s\n" msgstr "Fehler beim Setzen des Mindest-verfügbar-Wertes: %s\n" -#: aplay/aplay.c:812 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Siehe `%s --help' für mehr Informationen.\n" -#: aplay/aplay.c:828 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "Fehler beim Öffnen des Gerätes: %s" -#: aplay/aplay.c:833 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "Fehler beim Lesen der Geräteinformationen: %s" -#: aplay/aplay.c:840 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "Fehler beim Setzen des nonblock-Modus: %s" -#: aplay/aplay.c:850 aplay/aplay.c:974 aplay/aplay.c:1264 aplay/aplay.c:1458 -#: aplay/aplay.c:1979 aplay/aplay.c:2009 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "nicht genug Speicher" -#: aplay/aplay.c:874 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "Fehler beim Schreiben der Prozess-ID-Datei %s: %s" -#: aplay/aplay.c:964 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "Lesefehler (aufgerufen von Zeile %i)" -#: aplay/aplay.c:1031 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "" "unbekannte Länge des 'fmt '-Blocks (gelesen: %u, sollte mindestens %u sein)" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" @@ -686,243 +705,266 @@ msgstr "" "unbekannte Länge des erweiterten 'fmt '-Blocks (gelesen: %u, sollte " "mindestens %u sein)" -#: aplay/aplay.c:1047 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "ungültiger Format-Wert im erweiterten 'fmt '-Block" -#: aplay/aplay.c:1054 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "" "kann WAVE-Datei-Format 0x%04x nicht abspielen; ist weder PCM noch FLOAT" -#: aplay/aplay.c:1059 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "kann WAVE-Datei mit %d Kanälen nicht abspielen" -#: aplay/aplay.c:1067 aplay/aplay.c:1193 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "Warnung: benutztes Format ist U8\n" -#: aplay/aplay.c:1077 aplay/aplay.c:1090 aplay/aplay.c:1101 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, fuzzy, c-format msgid "Warning: format is changed to %s\n" msgstr "Warnung: benutztes Format ist U8\n" -#: aplay/aplay.c:1106 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" msgstr "" "kann WAVE-Datei mit %d-Bit-Samples in %d Bytes (%d Kanäle) nicht abspielen" -#: aplay/aplay.c:1129 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr "kann WAVE-Datei mit %d-Bit-Samples nicht abspielen" -#: aplay/aplay.c:1187 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "Warnung: benutztes Format ist MU_LAW\n" -#: aplay/aplay.c:1199 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "Warnung: benutztes Format ist S16_BE\n" -#: aplay/aplay.c:1212 aplay/aplay.c:2294 aplay/aplay.c:2301 aplay/aplay.c:2831 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "Warnung: benutztes Format ist MU_LAW\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "Lesefehler" -#: aplay/aplay.c:1242 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "" -#: aplay/aplay.c:1251 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "" -#: aplay/aplay.c:1284 +#: aplay/aplay.c:1337 #, c-format -msgid "Channel %d doesn't match with hw_parmas" +msgid "Channel %d doesn't match with hw_params" msgstr "" -#: aplay/aplay.c:1310 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "" "ungültige Konfiguration für dieses Gerät: keine unterstützte Konfiguration" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "" -#: aplay/aplay.c:1334 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "Zugriffs-Modus nicht unterstützt" -#: aplay/aplay.c:1339 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "Sample-Format nicht unterstützt" -#: aplay/aplay.c:1345 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "Sample-Format nicht unterstützt" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "Kanalanzahl nicht unterstützt" -#: aplay/aplay.c:1360 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "" "Warnung: Rate ist nicht exakt (angefordert: %i Hz, unterstützt: %i Hz)\n" -#: aplay/aplay.c:1366 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " probieren Sie bitte das plug-Plugin: %s\n" -#: aplay/aplay.c:1403 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "Fehler beim Setzen der Hardware-Parameter:" -#: aplay/aplay.c:1410 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "Periode gleich der Puffer-Größe wird nicht unterstützt (%lu == %lu)" -#: aplay/aplay.c:1441 +#: aplay/aplay.c:1482 +#, fuzzy +#| msgid "unable to install sw params:" +msgid "Unable to get current sw params." +msgstr "Fehler beim Setzen der Software-Parameter:" + +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "Fehler beim Setzen der Software-Parameter:" -#: aplay/aplay.c:1476 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "Fehler bei snd_pcm_mmap_begin: %s" -#: aplay/aplay.c:1505 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "Fehler beim Setzen von O_NONBLOCK in stdin\n" -#: aplay/aplay.c:1529 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "\rPause-Kommando ignoriert (keine HW-Unterstützung)\n" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "Fehler beim Pausieren: %s" -#: aplay/aplay.c:1548 -#, c-format -msgid "pause release error: %s" -msgstr "Fehler beim Beenden der Pause: %s" - -#: aplay/aplay.c:1564 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " msgstr "" "\r=== PAUSE === " -#: aplay/aplay.c:1606 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "Fehler beim Beenden der Pause: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "Status-Fehler: %s" -#: aplay/aplay.c:1611 -#, fuzzy, c-format -msgid "fatal %s: %s" -msgstr "%s: %s\n" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1626 aplay/aplay.c:1634 -msgid "underrun" -msgstr "Unterlauf" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1634 -msgid "overrun" -msgstr "Überlauf" - -#: aplay/aplay.c:1622 aplay/aplay.c:1633 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (mindestens %.3f ms)\n" -#: aplay/aplay.c:1638 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "Unterlauf" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "Überlauf" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "Status:\n" -#: aplay/aplay.c:1642 +#: aplay/aplay.c:1730 +#, fuzzy, c-format +msgid "fatal %s: %s" +msgstr "%s: %s\n" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "Unter-/Überlauf: Fehler beim Re-Initialisieren des Gerätes: %s" -#: aplay/aplay.c:1648 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "Status (DRAINING):\n" -#: aplay/aplay.c:1652 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "Format-Wechsel der Aufnahme-Daten? Versuche Wiederherstellung ...\n" -#: aplay/aplay.c:1654 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "XRUN (DRAINING): Fehler beim Re-Initialisieren des Gerätes: %s" -#: aplay/aplay.c:1661 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "Status (R/W):\n" -#: aplay/aplay.c:1664 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "Lese-/Schreibfehler, Status = %s" -#: aplay/aplay.c:1674 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "Ruhezustand. Versuche, aufzuwecken. " -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "Fehlgeschlagen. Re-Initialisierung. " -#: aplay/aplay.c:1681 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "Ruhezustand: Fehler beim Re-Initialisieren: %s" -#: aplay/aplay.c:1686 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "Fertig.\n" -#: aplay/aplay.c:1708 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr " !clip " -#: aplay/aplay.c:1855 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "%d-Bit-Samples werden nicht unterstützt.\n" -#: aplay/aplay.c:1889 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "Höchstwert (%li Samples): 0x%08x " -#: aplay/aplay.c:1923 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " @@ -931,649 +973,724 @@ msgstr "" "verdächtige Puffer-Position (total %li): avail = %li, delay = %li, buffer = " "%li\n" +#: aplay/aplay.c:2043 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "" +"verdächtige Puffer-Position (total %li): avail = %li, delay = %li, buffer = " +"%li\n" + +#: aplay/aplay.c:2047 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "" +"verdächtige Puffer-Position (total %li): avail = %li, delay = %li, buffer = " +"%li\n" + #: aplay/aplay.c:2051 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "" +"verdächtige Puffer-Position (total %li): avail = %li, delay = %li, buffer = " +"%li\n" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "Schreibfehler: %s" -#: aplay/aplay.c:2099 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "Vektor-Schreib-Fehler: %s" -#: aplay/aplay.c:2143 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "Lesefehler: %s" -#: aplay/aplay.c:2187 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "Vektor-Lese-Fehler: %s" -#: aplay/aplay.c:2235 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "nicht genug Speicher für Stille-Block" -#: aplay/aplay.c:2244 aplay/aplay.c:2472 aplay/aplay.c:2477 aplay/aplay.c:2527 -#: aplay/aplay.c:2536 aplay/aplay.c:2543 aplay/aplay.c:2553 aplay/aplay.c:2559 -#: aplay/aplay.c:2631 aplay/aplay.c:2661 aplay/aplay.c:2675 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "Schreibfehler" -#: aplay/aplay.c:2257 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - Fehler in set_silence" -#: aplay/aplay.c:2260 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "Schreibfehler" -#: aplay/aplay.c:2285 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "nicht genug Speicher" -#: aplay/aplay.c:2289 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "Spiele Creative Labs Channel-Datei '%s'...\n" -#: aplay/aplay.c:2357 aplay/aplay.c:2452 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "kann komprimierte .voc-Dateien nicht abspielen" -#: aplay/aplay.c:2412 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "" "kann Schleife nicht abspielen; Dateiposition in %s ist nicht änderbar\n" -#: aplay/aplay.c:2461 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "Unbekannter Block-Typ %d. Abbruch." -#: aplay/aplay.c:2595 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Format %s wird in WAVE nicht unterstützt ..." -#: aplay/aplay.c:2655 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Format %s wird in Sparc-Audio nicht unterstützt ..." -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "Wiedergabe:" -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "Aufnahme:" -#: aplay/aplay.c:2740 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "Rate: %d Hz, " -#: aplay/aplay.c:2742 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "mono" -#: aplay/aplay.c:2744 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "stereo" -#: aplay/aplay.c:2746 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "%i Kanäle" -#: aplay/aplay.c:3344 aplay/aplay.c:3397 +#: aplay/aplay.c:3492 +#, fuzzy, c-format +#| msgid "You need to specify %d files" +msgid "You need to specify %u files" +msgstr "Es werden %d Dateien benötigt." + +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "Es werden %d Dateien benötigt." -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - ALSA Sequenzer Verbindungs-Manager\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "Copyright © 1999-2000 Takashi Iwai\n" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "Verwendung:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * Verbindung zwischen zwei Ports herstellen/trennen\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [Optionen] Sender Empfänger\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " Sender, Empfänger = Client:Port\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect Verbindung trennen\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive exklusive Verbindung\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # benutze Zeitstempel der Queue #\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # benutze Tick-Zeitstempel der Queue #\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * Ports und Verbindungen auflisten\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [Optionen]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr " -i,--input Eingabe-Ports (lesbar) auflisten\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output Ausgabe-Ports (schreibbar) auflisten\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr " -i,--input Eingabe-Ports (lesbar) auflisten\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr " -l,--list Verbindungen der Ports auflisten\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * alle Verbindungen trennen\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x,--removeall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "verbunden zu" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "verbunden von" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, fuzzy, c-format msgid "client %d: '%s' [type=%s" msgstr "Client %d: '%s' [Typ=%s]\n" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "User" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "Kernel" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "Fehler beim Öffnen des Sequenzers\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "Fehler beim Lesen der Client-ID\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "Fehler beim Setzen des Client-Namens\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "ungültige Sender-Adresse %s\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "ungültige Ziel-Adresse %s\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "keine Verbindung gefunden\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "Verbindungs-Trennung fehlgeschlagen (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "Verbindung ist bereits vorhanden\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "Verbindung fehlgeschlagen (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - Netzwerk-Client/Server für ALSA Sequenzer\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr " Copyright © 1999 Takashi Iwai\n" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "Verwendung:\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " Server-Modus: aseqnet [Optionen]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " Client-Modus: aseqnet [Optionen] ServerHost\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "Optionen:\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, fuzzy, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : TCP-Port (Zahl oder Service-Name)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr " -s,--source # : lese von Sequenzer-Port (Client:Port)\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest # : schreibe auf Sequenzer-Port (Client:Port)\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v,--verbose : ausführliche Meldungen\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i,--info : Ausgabe bestimmter empfangener Ereignisse\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "nicht genug Speicher\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "schließe Dateien ...\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "Sequenzer geöffnet: %d:%d\n" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "ungültige Quell-Adresse %s\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "Service '%s' in /etc/services nicht gefunden\n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "kann Adresse für %s nicht bestimmen\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "verbunden zu" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "zu viele Verbindungen\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "angenommen[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "kann Adresse für %s nicht bestimmen\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "OK ... verbunden\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "Channel %2d: Control event : %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "Channel %2d: Pitchbender : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "Channel %2d: Note On evenet : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "Channel %2d: Note Off event: %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "Verbindung getrennt\n" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "Vorne links" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "Vorne rechts" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "Hinten links" -#: speaker-test/speaker-test.c:124 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "Hinten rechts" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "Bass" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "Seitlich links" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "Seitlich rechts" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "Kanal 9" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "Kanal 10" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "Kanal 11" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "Kanal 12" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "Kanal 13" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "Kanal 14" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "Kanal 15" -#: speaker-test/speaker-test.c:136 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "Kanal 16" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "Ungültige Konfiguration: keine unterstützte Konfiguration: %s\n" -#: speaker-test/speaker-test.c:526 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "Zugriffsmodus nicht unterstützt: %s\n" -#: speaker-test/speaker-test.c:533 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "Sample-Format nicht unterstützt: %s\n" -#: speaker-test/speaker-test.c:540 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "Kanal-Anzahl %i nicht unterstützt: %s\n" -#: speaker-test/speaker-test.c:548 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "Rate %i Hz nicht unterstützt: %s\n" -#: speaker-test/speaker-test.c:553 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "" "Rate ist nicht exakt (angefordert: %i Hz, unterstützt: %i Hz, Fehlercode " "%d)\n" -#: speaker-test/speaker-test.c:557 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "Rate ist %i Hz (angefordert: %i Hz)\n" -#: speaker-test/speaker-test.c:563 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "Puffergröße von %lu bis %lu\n" -#: speaker-test/speaker-test.c:564 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "Periodengröße von %lu bis %lu\n" -#: speaker-test/speaker-test.c:566 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "Angeforderte Periodenzeit %u µs\n" -#: speaker-test/speaker-test.c:569 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "Fehler beim Setzen der Periodenzeit %u µs: %s\n" -#: speaker-test/speaker-test.c:575 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "Angeforderte Pufferlänge %u µs\n" -#: speaker-test/speaker-test.c:578 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "Fehler beim Setzen der Pufferlänge %u µs: %s\n" -#: speaker-test/speaker-test.c:587 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "Verwende maximale Puffergröße %lu\n" -#: speaker-test/speaker-test.c:590 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "Fehler beim Setzen der Puffergröße %lu: %s\n" -#: speaker-test/speaker-test.c:596 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "Perioden = %u\n" -#: speaker-test/speaker-test.c:599 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "Fehler beim Setzen der Periodenanzahl %u: %s\n" -#: speaker-test/speaker-test.c:608 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "Fehler beim Setzen der Hardware-Parameter: %s\n" -#: speaker-test/speaker-test.c:614 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "gesetzt: period_size = %lu\n" -#: speaker-test/speaker-test.c:615 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "gesetzt: buffer_size = %lu\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "Puffer zu klein, kann nicht benutzt werden\n" -#: speaker-test/speaker-test.c:630 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "Fehler beim Lesen der Software-Parameter: %s\n" -#: speaker-test/speaker-test.c:637 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "Fehler beim Setzen des Start-Schwellenwertes: %s\n" -#: speaker-test/speaker-test.c:644 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "Fehler beim Setzen des Mindest-verfügbar-Wertes: %s\n" -#: speaker-test/speaker-test.c:651 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "Fehler beim Setzen der Software-Parameter: %s\n" -#: speaker-test/speaker-test.c:671 +#: speaker-test/speaker-test.c:621 #, fuzzy, c-format msgid "Unable to set channel map: %s\n" msgstr "Fehler beim Setzen des Mindest-verfügbar-Wertes: %s\n" -#: speaker-test/speaker-test.c:696 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "" "Fehler bei Unterlauf-Behandlung, Re-Initialisierung fehlgeschlagen: %s\n" -#: speaker-test/speaker-test.c:707 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "" "Fehler beim Aufwachen aus dem Ruhezustand, Re-Initialisierung " "fehlgeschlagen: %s\n" -#: speaker-test/speaker-test.c:771 speaker-test/speaker-test.c:1272 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "Nicht genug Speicher\n" -#: speaker-test/speaker-test.c:776 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "Kann WAV-Datei %s nicht öffnen\n" -#: speaker-test/speaker-test.c:780 speaker-test/speaker-test.c:809 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "Ungültige WAV-Datei %s\n" -#: speaker-test/speaker-test.c:785 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "Keine WAV-Datei: %s\n" -#: speaker-test/speaker-test.c:789 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "Nicht unterstütztes WAV-Format %d in %s\n" -#: speaker-test/speaker-test.c:794 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s ist keine Mono-Datei (%d Kanäle)\n" -#: speaker-test/speaker-test.c:799 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "Sample-Rate (%d) stimmt nicht überein in %s\n" -#: speaker-test/speaker-test.c:804 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "Nicht unterstütztes Sample-Format mit %d Bits in %s\n" -#: speaker-test/speaker-test.c:865 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "Kanal %d nicht definiert\n" -#: speaker-test/speaker-test.c:916 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "Schreibfehler: %d, %s\n" -#: speaker-test/speaker-test.c:918 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery fehlgeschlagen: %d, %s\n" -#: speaker-test/speaker-test.c:1004 +#: speaker-test/speaker-test.c:938 +#, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 #, fuzzy, c-format msgid "" "Usage: speaker-test [OPTION]... \n" @@ -1586,7 +1703,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1615,76 +1733,86 @@ msgstr "" "Bereich\n" "\n" -#: speaker-test/speaker-test.c:1136 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "Ungültige Periodenanzahl %d\n" -#: speaker-test/speaker-test.c:1152 speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "Ungültiger Test-Typ %s\n" -#: speaker-test/speaker-test.c:1189 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "Unbekannte Options '%c'\n" -#: speaker-test/speaker-test.c:1203 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "Ungültiger Wert für Option -s\n" -#: speaker-test/speaker-test.c:1218 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "Wiedergabe-Gerät ist %s\n" -#: speaker-test/speaker-test.c:1219 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "Stream-Parameter sind %i Hz, %s, %i Kanäle\n" -#: speaker-test/speaker-test.c:1222 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "Verwende 16 Oktaven rosa Rauschen\n" -#: speaker-test/speaker-test.c:1225 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "Sinuswelle mit Frequenz %.4f Hz\n" -#: speaker-test/speaker-test.c:1228 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "WAV-Datei(en)\n" -#: speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "Fehler beim Öffnen des Gerätes: %d, %s\n" -#: speaker-test/speaker-test.c:1244 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "Fehler beim Setzen der Hardware-Parameter: %s\n" -#: speaker-test/speaker-test.c:1248 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "Fehler beim Setzen der Software-Parameter: %s\n" -#: speaker-test/speaker-test.c:1295 speaker-test/speaker-test.c:1317 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "Schreibfehler: %s\n" -#: speaker-test/speaker-test.c:1303 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "Zeit pro Periode = %lf\n" +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "Service '%s' in /etc/services nicht gefunden\n" + #~ msgid "Warning: format is changed to S16_LE\n" #~ msgstr "Warnung: benutztes Format ist S16_LE\n" diff --git a/po/eu.po b/po/eu.po index 0d1dea8..ab0746a 100644 --- a/po/eu.po +++ b/po/eu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.23\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-10 09:07+0100\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2020-07-26 12:01+0200\n" "Last-Translator: Porrumentzio \n" "Language-Team: Librezale \n" @@ -17,34 +17,46 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3.1\n" -#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +#: alsamixer/card_select.c:77 alsamixer/device_name.c:127 msgid "Sound Card" msgstr "Soinu-txartela" -#: alsamixer/card_select.c:181 +#: alsamixer/card_select.c:115 msgid "(default)" msgstr "(lehenetsia)" -#: alsamixer/card_select.c:191 +#: alsamixer/card_select.c:125 msgid "cannot enumerate sound cards" msgstr "ezin dira zerrendatu soinu-txartelak" -#: alsamixer/card_select.c:215 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "sartu gailuaren izena..." -#: alsamixer/cli.c:40 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "Erabilera: alsamixer [aukerak]" # capture --> atzemate, hartze, kaptura(tze)...? -#: alsamixer/cli.c:41 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" " -c, --card=NUMBER sound card number or id\n" " -D, --device=NAME mixer device name\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -m, --mouse enable mouse\n" +" -M, --no-mouse disable mouse\n" +" -f, --config=FILE configuration file\n" +" -F, --no-config do not load configuration file\n" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "Aukera erabilgarriak:\n" " -h, --help lagunta-koadro hau\n" @@ -53,7 +65,7 @@ msgstr "" " -V, --view=MODUA hasteko ikuspegia: erreprodukzioa/kapturatzea/" "guztiak" -#: alsamixer/cli.c:46 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -64,22 +76,22 @@ msgstr "" " -a, --abstraction=IZENA nahasgailuaren abstrakzio maila: bat ere ez / " "oinarrizkoa" -#: alsamixer/cli.c:77 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "txartel-indize baliogabea: %s\n" -#: alsamixer/cli.c:103 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "abstrakzio-maila ezezaguna: %s\n" -#: alsamixer/cli.c:108 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "aukera ezezaguna: %c\n" -#: alsamixer/cli.c:110 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "probatu `alsamixer --help' xehetasunetarako\n" @@ -92,139 +104,139 @@ msgstr "Gailu-izena:" msgid "%s: %s\n" msgstr "%s: %s\n" -#: alsamixer/mixer_display.c:98 +#: alsamixer/mixer_display.c:99 msgid "Card:" msgstr "Txartela:" -#: alsamixer/mixer_display.c:99 +#: alsamixer/mixer_display.c:100 msgid "Chip:" msgstr "Txipa:" -#: alsamixer/mixer_display.c:100 +#: alsamixer/mixer_display.c:101 msgid "View:" msgstr "Ikuspegia:" -#: alsamixer/mixer_display.c:101 +#: alsamixer/mixer_display.c:102 msgid "Item:" msgstr "Elementua:" -#: alsamixer/mixer_display.c:104 +#: alsamixer/mixer_display.c:105 msgid "F1: Help" msgstr "F1: Laguntza" -#: alsamixer/mixer_display.c:105 +#: alsamixer/mixer_display.c:106 msgid "F2: System information" msgstr "F2: Sistemaren informazioa" -#: alsamixer/mixer_display.c:106 +#: alsamixer/mixer_display.c:107 msgid "F6: Select sound card" msgstr "F6: Hautatu soinu-txartela" # Esc --> Ihes / Esc -#: alsamixer/mixer_display.c:107 +#: alsamixer/mixer_display.c:108 msgid "Esc: Exit" msgstr "Esc: Irten" -#: alsamixer/mixer_display.c:174 +#: alsamixer/mixer_display.c:179 msgid "(unplugged)" msgstr "(deskonektatuta)" -#: alsamixer/mixer_display.c:192 +#: alsamixer/mixer_display.c:197 msgid "Playback" msgstr "Erreprodukzioa" -#: alsamixer/mixer_display.c:193 +#: alsamixer/mixer_display.c:198 msgid "Capture" msgstr "Kapturtzea" -#: alsamixer/mixer_display.c:194 +#: alsamixer/mixer_display.c:199 msgid "All" msgstr "Guztiak" -#: alsamixer/mixer_display.c:234 +#: alsamixer/mixer_display.c:240 msgid "mute" msgstr "mututu" -#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:281 alsamixer/mixer_display.c:291 msgid "dB gain:" msgstr "dB irabazia:" -#: alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:291 #, c-format msgid " [%s %s, %s]" msgstr " [%s %s, %s]" -#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 -#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:306 +#: alsamixer/mixer_display.c:312 alsamixer/mixer_display.c:318 msgid "Off" msgstr "Itzalita" -#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:318 msgid "On" msgstr "Piztuta" -#: alsamixer/mixer_display.c:363 +#: alsamixer/mixer_display.c:370 msgid "The sound device was unplugged." msgstr "Soinu-txartela deskonektatu egin da." -#: alsamixer/mixer_display.c:364 +#: alsamixer/mixer_display.c:371 msgid "Press F6 to select another sound card." msgstr "Sakatu F6 beste soinu-txartel bat hautatzeko." -#: alsamixer/mixer_display.c:379 +#: alsamixer/mixer_display.c:386 msgid "This sound device does not have any playback controls." msgstr "Soinu-txartel honek ez du erreprodukzio kontrolik." -#: alsamixer/mixer_display.c:381 +#: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." msgstr "Soinu-txartel honek ez du kapturatze kontrolik." -#: alsamixer/mixer_display.c:383 +#: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." msgstr "Soinu-txartel honek ez du kontrolik." #. TRANSLATORS: playback on; one character -#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +#: alsamixer/mixer_display.c:523 alsamixer/mixer_display.c:528 msgid "O" msgstr "O" #. TRANSLATORS: playback muted; one character -#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +#: alsamixer/mixer_display.c:525 alsamixer/mixer_display.c:529 msgid "M" msgstr "M" #. TRANSLATORS: "left"; no more than two characters -#: alsamixer/mixer_display.c:536 +#: alsamixer/mixer_display.c:545 msgid "L" msgstr "L" #. TRANSLATORS: "right"; no more than two characters -#: alsamixer/mixer_display.c:540 +#: alsamixer/mixer_display.c:551 msgid "R" msgstr "R" #. TRANSLATORS: no more than eight characters -#: alsamixer/mixer_display.c:542 +#: alsamixer/mixer_display.c:555 msgid "CAPTURE" msgstr "KAPTURATZEA" -#: alsamixer/mixer_display.c:592 +#: alsamixer/mixer_display.c:611 msgid "Front" msgstr "Aurrealdekoa" -#: alsamixer/mixer_display.c:595 +#: alsamixer/mixer_display.c:614 msgid "Rear" msgstr "Atzealdekoa" -#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:125 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "Erdialdekoa" -#: alsamixer/mixer_display.c:601 +#: alsamixer/mixer_display.c:620 msgid "Woofer" msgstr "Wooferra" -#: alsamixer/mixer_display.c:604 +#: alsamixer/mixer_display.c:623 msgid "Side" msgstr "Aldekoa" @@ -356,11 +368,11 @@ msgstr " Clemens Ladisch " msgid "Help" msgstr "Laguntza" -#: alsamixer/proc_files.c:103 +#: alsamixer/proc_files.c:56 msgid "Select File" msgstr "Hautatu fitxategia" -#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +#: alsamixer/textbox.c:51 alsamixer/textbox.c:65 msgid "Error" msgstr "Errorea" @@ -369,24 +381,73 @@ msgstr "Errorea" msgid "Cannot open file \"%s\"." msgstr "Ezin da ireki \"%s\" fitxategia." -#: aplay/aplay.c:178 +#: aplay/aplay.c:184 msgid "raw data" msgstr "datu gordinak" -#: aplay/aplay.c:179 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:181 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:182 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "Sparc Audio" -#: aplay/aplay.c:203 -#, c-format +#: aplay/aplay.c:209 +#, fuzzy, c-format +#| msgid "" +#| "Usage: %s [OPTION]... [FILE]...\n" +#| "\n" +#| "-h, --help help\n" +#| " --version print current version\n" +#| "-l, --list-devices list all soundcards and digital audio devices\n" +#| "-L, --list-pcms list device names\n" +#| "-D, --device=NAME select PCM by name\n" +#| "-q, --quiet quiet mode\n" +#| "-t, --file-type TYPE file type (voc, wav, raw or au)\n" +#| "-c, --channels=# channels\n" +#| "-f, --format=FORMAT sample format (case insensitive)\n" +#| "-r, --rate=# sample rate\n" +#| "-d, --duration=# interrupt after # seconds\n" +#| "-s, --samples=# interrupt after # samples per channel\n" +#| "-M, --mmap mmap stream\n" +#| "-N, --nonblock nonblocking mode\n" +#| "-F, --period-time=# distance between interrupts is # microseconds\n" +#| "-B, --buffer-time=# buffer duration is # microseconds\n" +#| " --period-size=# distance between interrupts is # frames\n" +#| " --buffer-size=# buffer duration is # frames\n" +#| "-A, --avail-min=# min available space for wakeup is # microseconds\n" +#| "-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +#| " (relative to buffer size if <= 0)\n" +#| "-T, --stop-delay=# delay for automatic PCM stop is # microseconds " +#| "from xrun\n" +#| "-v, --verbose show PCM structure and setup (accumulative)\n" +#| "-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +#| "-I, --separate-channels one file for each channel\n" +#| "-i, --interactive allow interactive operation from stdin\n" +#| "-m, --chmap=ch1,ch2,.. Give the channel map to override or follow\n" +#| " --disable-resample disable automatic rate resample\n" +#| " --disable-channels disable automatic channel conversions\n" +#| " --disable-format disable automatic format conversions\n" +#| " --disable-softvol disable software volume control (softvol)\n" +#| " --test-position test ring buffer position\n" +#| " --test-coef=# test coefficient for ring buffer position " +#| "(default 8)\n" +#| " expression for validation is: coef * " +#| "(buffer_size / 2)\n" +#| " --test-nowait do not wait for ring buffer - eats whole CPU\n" +#| " --max-file-time=# start another output file when the old file has " +#| "recorded\n" +#| " for this many seconds\n" +#| " --process-id-file write the process ID here\n" +#| " --use-strftime apply the strftime facility to the output file " +#| "name\n" +#| " --dump-hw-params dump hw_params of the device\n" +#| " --fatal-errors treat all errors as fatal\n" msgid "" "Usage: %s [OPTION]... [FILE]...\n" "\n" @@ -399,6 +460,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -490,12 +552,12 @@ msgstr "" " --dump-hw-params ezkutatu gailuaren hw parametroak\n" " --fatal-errors jo errore guztiak larritzat\n" -#: aplay/aplay.c:248 speaker-test/speaker-test.c:1023 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "Hauek dira onartutako lagin-formatuak:" -#: aplay/aplay.c:254 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -504,198 +566,204 @@ msgstr "" "\n" "Baliteke horietako batzuk erabilgarri ez egotea hautatutako hardwarean\n" -#: aplay/aplay.c:255 +#: aplay/aplay.c:262 #, c-format msgid "The available format shortcuts are:\n" msgstr "Hauek dira formatu laster-tekla erabilgarriak:\n" -#: aplay/aplay.c:256 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 bit bukaera txikia, 44100, estereo)\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 bit bukaera handia, 44100, estereo)\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 bit bukaera txikia, 48000, estereo)\n" -#: aplay/aplay.c:272 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "ez da soinu-txartelik aurkitu..." -#: aplay/aplay.c:275 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** %s hardware gailuen zerrenda ****\n" -#: aplay/aplay.c:304 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "%i txartela: %s [%s], %i gailua: %s [%s]\n" -#: aplay/aplay.c:310 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " Azpigailuak: %i/%i\n" -#: aplay/aplay.c:317 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " #%i azpigailua: %s\n" -#: aplay/aplay.c:398 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "%s seinaleak abortatuta...\n" -#: aplay/aplay.c:553 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "komandoa arecord edo aplay gisa izendatu behar da" -#: aplay/aplay.c:597 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "%s fitxategi-formatu ezezaguna" -#: aplay/aplay.c:604 +#: aplay/aplay.c:614 #, c-format msgid "invalid channels argument '%s'" msgstr "kanalen '%s' argumentu baliogabea" -#: aplay/aplay.c:608 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "kanalentzako %i balio baliogabea" -#: aplay/aplay.c:627 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "'%s' formatu hedatua ez da zuzena" -#: aplay/aplay.c:635 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "'%s' formatu hedatua ez da zuzena" + +#: aplay/aplay.c:657 #, c-format msgid "invalid rate argument '%s'" msgstr "'%s' tasa argumentu baliogabea" -#: aplay/aplay.c:642 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "%i abiadura balio okerra" -#: aplay/aplay.c:648 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "iraupen eta lagin argumentuak ezin dira elkarrekin erabili" -#: aplay/aplay.c:653 +#: aplay/aplay.c:675 #, c-format msgid "invalid duration argument '%s'" msgstr "'%s' iraupen argumentu baliogabea" -#: aplay/aplay.c:660 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "lagin eta iraupen argumentuak ezin dira elkarrekin erabili" -#: aplay/aplay.c:665 +#: aplay/aplay.c:687 #, c-format msgid "invalid samples argument '%s'" msgstr "'%s' lagin argumentu baliogabea" -#: aplay/aplay.c:677 +#: aplay/aplay.c:699 #, c-format msgid "invalid period time argument '%s'" msgstr "'%s' periodo-denbora argumentu baliogabea" -#: aplay/aplay.c:684 +#: aplay/aplay.c:706 #, c-format msgid "invalid buffer time argument '%s'" msgstr "'%s' buffer-denbora argumentu baliogabea" -#: aplay/aplay.c:691 +#: aplay/aplay.c:713 #, c-format msgid "invalid period size argument '%s'" msgstr "'%s' periodo-tamaina argumentu baliogabea" -#: aplay/aplay.c:698 +#: aplay/aplay.c:720 #, c-format msgid "invalid buffer size argument '%s'" msgstr "'%s' buffer-tamaina argumentu baliogabea" -#: aplay/aplay.c:705 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "'%s' gutxieneko espazio erabilgarri argumentu baliogabea" -#: aplay/aplay.c:712 +#: aplay/aplay.c:734 #, c-format msgid "invalid start delay argument '%s'" msgstr "'%s' haste-atzerapen argumentu baliogabea" -#: aplay/aplay.c:719 +#: aplay/aplay.c:741 #, c-format msgid "invalid stop delay argument '%s'" msgstr "'%s' gelditze-atzerapen argumentu baliogabea" -#: aplay/aplay.c:774 +#: aplay/aplay.c:796 #, c-format msgid "invalid test coef argument '%s'" msgstr "'%s' koef. proba argumentu baliogabea" -#: aplay/aplay.c:786 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "'%s' gehienezko fitxategi-denbora argumentu baliogabea" -#: aplay/aplay.c:806 speaker-test/speaker-test.c:666 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, c-format msgid "Unable to parse channel map string: %s\n" msgstr "Ezin da kanal-maparen katea analizatu: %s\n" -#: aplay/aplay.c:812 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Probatu `%s --help' xehetasun gehiagorako.\n" -#: aplay/aplay.c:828 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "audio irekitze errorea: %s" -#: aplay/aplay.c:833 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "informazio errorea: %s" -#: aplay/aplay.c:840 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "nonblock-en konfigurazio-ezarpen errorea: %s" -#: aplay/aplay.c:850 aplay/aplay.c:974 aplay/aplay.c:1264 aplay/aplay.c:1458 -#: aplay/aplay.c:1979 aplay/aplay.c:2009 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "ez dago behar adina memoria" -#: aplay/aplay.c:874 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "Ezin da sortu %s prozesuaren ID fitxategia: %s" -#: aplay/aplay.c:964 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "irakurtzean errorea (%i lerrotik deitua)" -#: aplay/aplay.c:1031 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "'fmt' chunk luzera ezezaguna (%u irakurri, %u izan behar du gutxienez)" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" @@ -703,33 +771,38 @@ msgstr "" "'fmt' chunk hedagarri luzera ezezaguna (%u irakurri, %u izan behar du " "gutxienez)" -#: aplay/aplay.c:1047 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "formatua ez da zuzena 'fmt' chunk hedagarrian" -#: aplay/aplay.c:1054 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "" "ezin da erreproduzitu PCM edo FLOAT kodetua ez den 0x%04x WAVE-fitxategiaren " "formatua" -#: aplay/aplay.c:1059 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "ezin dira erreproduzitu %d pista dituzten WAVE-fitxategiak" -#: aplay/aplay.c:1067 aplay/aplay.c:1193 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "Abisua: formatua U8-ra aldatu da\n" -#: aplay/aplay.c:1077 aplay/aplay.c:1090 aplay/aplay.c:1101 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, c-format msgid "Warning: format is changed to %s\n" msgstr "Abisua: formatua %s-(e)ra aldatu da\n" -#: aplay/aplay.c:1106 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" @@ -737,212 +810,231 @@ msgstr "" " ezin dira erreproduzitu %d byteko zabaleran %d lagin-bita duten WAVE-" "fitxategiak (%d kanal)" -#: aplay/aplay.c:1129 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr "" " ezin dira erreproduzitu %d lagin-biteko zabalera duten WAVE-fitxategiak" -#: aplay/aplay.c:1187 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "Abisua: formatua MU_LAW-era aldatu da\n" -#: aplay/aplay.c:1199 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "Abisua: formatua S16_BE-ra aldatu da\n" -#: aplay/aplay.c:1212 aplay/aplay.c:2294 aplay/aplay.c:2301 aplay/aplay.c:2831 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "Abisua: formatua MU_LAW-era aldatu da\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "irakurtze errorea" -#: aplay/aplay.c:1242 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "Kanal-zenbakiak ez datoz bat hw parametro eta kanal-maparen artean" -#: aplay/aplay.c:1251 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "Abisua: ezin dat kanal-mapa eskuratu\n" -#: aplay/aplay.c:1284 -#, c-format -msgid "Channel %d doesn't match with hw_parmas" +#: aplay/aplay.c:1337 +#, fuzzy, c-format +#| msgid "Channel %d doesn't match with hw_parmas" +msgid "Channel %d doesn't match with hw_params" msgstr "%d kanala ez dator bat hw parametroekin" -#: aplay/aplay.c:1310 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "" "PCM honetarako konfigurazio hautsia: ez dago konfigurazio erabilgarririk" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "\"%s\" gailuaren HW parametroak:\n" -#: aplay/aplay.c:1334 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "Sarbide-mota ez dago erabilgarri" -#: aplay/aplay.c:1339 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "Lagin formatua ez dago erabilgarri" -#: aplay/aplay.c:1345 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "Lagin formatua ez dago erabilgarri" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "Kanal zenbaketa ez dago erabilgarri" -#: aplay/aplay.c:1360 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "" "Abisua: lagin-tasa ez da zehatza (eskatutakoa = %iHz, eskuratutakoa = %iHz)\n" -#: aplay/aplay.c:1366 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " probatu %s konektatze-plugina\n" -#: aplay/aplay.c:1403 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "Ezin dira hw parametroak instalatu:" -#: aplay/aplay.c:1410 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "Ezin da bufferraren tamaina bereko periodoa erabili (%lu == %lu)" -#: aplay/aplay.c:1441 +#: aplay/aplay.c:1482 +#, fuzzy +#| msgid "unable to install sw params:" +msgid "Unable to get current sw params." +msgstr "ezin dira sw parametroak instalatu:" + +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "ezin dira sw parametroak instalatu:" -#: aplay/aplay.c:1476 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "snd_pcm_mmap_begin arazoa: %s" -#: aplay/aplay.c:1505 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "stdin O_NONBLOCK marka ezartzeak huts egin du\n" -#: aplay/aplay.c:1529 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "\rPAUSE komandoa ezikusi da (ez du hw sostengurik)\n" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "pause push errorea: %s" -#: aplay/aplay.c:1548 -#, c-format -msgid "pause release error: %s" -msgstr "pause release errorea: %s" - -#: aplay/aplay.c:1564 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " msgstr "" "\r=== PAUSE === " -#: aplay/aplay.c:1606 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "pause release errorea: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "egoera errorea: %s" -#: aplay/aplay.c:1611 -#, c-format -msgid "fatal %s: %s" -msgstr "%s larria: %s" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1626 aplay/aplay.c:1634 -msgid "underrun" -msgstr "underrun (azpiratzea)" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1634 -msgid "overrun" -msgstr "overrun (gainditzea)" - -#: aplay/aplay.c:1622 aplay/aplay.c:1633 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (behintzat %.3f ms luze)\n" -#: aplay/aplay.c:1638 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "underrun (azpiratzea)" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "overrun (gainditzea)" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "Egoera:\n" -#: aplay/aplay.c:1642 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "%s larria: %s" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "xrun: prestakuntza errorea: %s" -#: aplay/aplay.c:1648 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "Egoera(HUSTEN):\n" -#: aplay/aplay.c:1652 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "kaptura-fluxu formatua aldatu? berreskuratzea saiatzen...\n" -#: aplay/aplay.c:1654 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "xrun(HUSTEN): prestakuntza errorea: %s" -#: aplay/aplay.c:1661 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "Egoera(Irak/Idat):\n" -#: aplay/aplay.c:1664 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "irakurtze/idazte errorea, egoera = %s" -#: aplay/aplay.c:1674 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "Etenda. Berrekiten saiatzen. " -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "Huts egin du. Fluxua berrabiarazten. " -#: aplay/aplay.c:1681 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "eten: prestakuntza errorea: %s" -#: aplay/aplay.c:1686 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "Egina.\n" -#: aplay/aplay.c:1708 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr " !clip " -#: aplay/aplay.c:1855 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "Euskarririk gabeko %d bit-tamaina.\n" -#: aplay/aplay.c:1889 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "Gehiengo gailurra (%li lagin): 0x%08x " -#: aplay/aplay.c:1923 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " @@ -951,655 +1043,752 @@ msgstr "" "Buffer-kokaleku susmagarria (%li guztira) eskurag = %li, atzerapena = %li, " "bufferra = %li\n" +#: aplay/aplay.c:2043 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "" +"Buffer-kokaleku susmagarria (%li guztira) eskurag = %li, atzerapena = %li, " +"bufferra = %li\n" + +#: aplay/aplay.c:2047 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "" +"Buffer-kokaleku susmagarria (%li guztira) eskurag = %li, atzerapena = %li, " +"bufferra = %li\n" + #: aplay/aplay.c:2051 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "" +"Buffer-kokaleku susmagarria (%li guztira) eskurag = %li, atzerapena = %li, " +"bufferra = %li\n" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "idazte errorea: %s" -#: aplay/aplay.c:2099 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "writev errorea: %s" -#: aplay/aplay.c:2143 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "irakurtze errorea: %s" -#: aplay/aplay.c:2187 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "readv errorea: %s" -#: aplay/aplay.c:2235 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "ezin da esleitu bufferra isiltasunerako" -#: aplay/aplay.c:2244 aplay/aplay.c:2472 aplay/aplay.c:2477 aplay/aplay.c:2527 -#: aplay/aplay.c:2536 aplay/aplay.c:2543 aplay/aplay.c:2553 aplay/aplay.c:2559 -#: aplay/aplay.c:2631 aplay/aplay.c:2661 aplay/aplay.c:2675 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "idazte errorea" -#: aplay/aplay.c:2257 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - isiltasun errorea" -#: aplay/aplay.c:2260 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "voc_pcm_flush errorea" -#: aplay/aplay.c:2285 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "malloc errorea" -#: aplay/aplay.c:2289 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "'%s' Creative Labs Channel fitxategia erreproduzitzen...\n" -#: aplay/aplay.c:2357 aplay/aplay.c:2452 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "ezin dira erreproduzitu paketatutako .voc fitxategiak" -#: aplay/aplay.c:2412 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "ezin dira begiztak erreproduzitu; %s ez da bilagarria\n" -#: aplay/aplay.c:2461 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "%d bloke-mota ezezaguna. Amaitu." -#: aplay/aplay.c:2595 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Wave-ek ez du %s formatua onartzen..." -#: aplay/aplay.c:2655 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Sparc Audio-k ez du %s formatua onartzen..." -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "Erreproduzitzen" -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "Grabatzen" -#: aplay/aplay.c:2740 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "Tasa %d Hz, " -#: aplay/aplay.c:2742 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "Mono" -#: aplay/aplay.c:2744 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "Estereo" -#: aplay/aplay.c:2746 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "Kanalak %i" -#: aplay/aplay.c:3344 aplay/aplay.c:3397 +#: aplay/aplay.c:3492 +#, fuzzy, c-format +#| msgid "You need to specify %d files" +msgid "You need to specify %u files" +msgstr "%d fitxategiak zehaztu behar dituzu" + +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "%d fitxategiak zehaztu behar dituzu" -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - ALSA konexio sekuentziadorearen kudeatzailea\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "Copyright (C) 1999-2000 Takashi Iwai\n" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "Erabilera:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * Bi ataken arteko konexio/deskonexioak\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-aukerak] bidaltzailea hartzailea\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " bidaltzailea, hartzailea = bezeroa:ataka parea\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect deskonektatu\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive konexio esklusiboa\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # sartu denbora-errealeko-zigilua ilaran\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # sartu denbora-marka-zigilua ilaran\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * Zerrendatu konektatutako atakak (harpidetza-ekintzarik ez)\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [-aukerak]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr "" " -i,--input zerrendatu sarrera-atakak (irakurgarriak)\n" "\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output zerrendatu irteera-atakak (idazgarriak)\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr "" +" -i,--input zerrendatu sarrera-atakak (irakurgarriak)\n" +"\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr "" " -l,--list zerrendatu ataka bakoitzak orain dituen loturak\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr "" " * Ezabatu esportatutako konexio guztiak\n" "\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x, --removeall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "Hona konektatzen" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "Hemendik konektatuta" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, c-format msgid "client %d: '%s' [type=%s" msgstr "%d bezeroa: '%s' [mota=%s" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "erabiltzailea" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "kernela" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "ezin da ireki sekuentziadorea\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "ezin da lortu bezeroaren IDa\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "ezin da zehaztu bezeroaren informazioa\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "%s bidaltzaile-helbide baliogabea\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "%s hartzaile-helbide baliogabea\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "Ez da harpidetzarik aurkitu\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "Deskonektatzeak huts egin du (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "Konexioa jada harpidetua dago\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "Konexioak huts egin du (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - ALSA sekuentziadorearen sarerako bezeroa/zerbitzaria\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr " Copyright (C) 1999 Takashi Iwai\n" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "erabilera:\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " zerbitzari modua: aseqnet [-aukerak]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " bezero modua: aseqnet [-aukerak] zerbitzari_ostalaria\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "aukerak:\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : zehaztu TCP ataka (zerbitzuaren digitua edo izena)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr "" " -s,--source helbidea : irakurri emandako helbidetik (bezeroa:ataka)\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest helbidea : idatzi emandako helbidean (bezeroa:ataka)\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v, --verbose : erakutsi mezu xehatuak\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i, --info : erakutsi jasotako zenbait gertaera\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "ezin da malloc exekutatu\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "fitxategiak ixten...\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "sekuentziadorea ireki da: %d:%d\n" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "%s iturburu-helbide baliogabea\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "ez da aurkitu '%s' zerbitzua /etc/services direktorioan\n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "ezin da %s helbidea lortu\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "Hona konektatzen" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "konexio gehiegi!\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "onartua[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "ezin da %s helbidea lortu\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "ados... konektatuta\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "%2d kanala: kontrol-gertaera : %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "%2d kanala: Tonu aldatzailea : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "%2d kanala: 'Oharra gaituta' gertaera : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "%2d kanala: 'Oharra desgaituta' gertaera : %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "deskonektatuta\n" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "Aurrealde ezkerra" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "Aurrealde eskuina" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "Atzealde ezkerra" -#: speaker-test/speaker-test.c:124 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "Atzealde eskuina" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "LFE" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "Ezker aldea" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "Eskuin aldea" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "9 kanala" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "10 kanala" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "11 kanala" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "12 kanala" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "13 kanala" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "14 kanala" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "15 kanala" -#: speaker-test/speaker-test.c:136 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "16 kanala" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "" "Erreprodukziorako konfigurazio hautsia: ez dago konfigurazio erabilgarririk: " "%s\n" -#: speaker-test/speaker-test.c:526 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "Sarbide mota ez erabilgarri erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:533 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "Lagin formatua ez erabilgarri erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:540 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "Kanal zenbaketa (%i) ez erabilgarri erreprodukzioetarako: %s \n" -#: speaker-test/speaker-test.c:548 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "%iHz lagin-tasa ez erabilgarri erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:553 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "" "Lagin-tasa ez dator bat (eskatutakoa %iHz, eskuratutakoa %iHz, errorea %d)\n" -#: speaker-test/speaker-test.c:557 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "Lagin-tasa %iHz-tan ezarria (eskatutakoa %iHz)\n" -#: speaker-test/speaker-test.c:563 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "Buffer tamainaren barrutia %lu(e)tik %lu(e)ra\n" -#: speaker-test/speaker-test.c:564 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "Periodo tamainaren barrutia %lu(e)tik %lu(e)ra\n" -#: speaker-test/speaker-test.c:566 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "Eskatutako periodo denbora %u µs\n" -#: speaker-test/speaker-test.c:569 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "Ezin da ezarri periodo denbora %u µs gisa erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:575 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "Eskatutako buffer denbora %u µs\n" -#: speaker-test/speaker-test.c:578 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "Ezin da ezarri buffer denbora %u µs gisa erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:587 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "Buffer tamaina handiena erabiltzen: %lu\n" -#: speaker-test/speaker-test.c:590 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "Ezin da ezarri buffer tamaina %lu gisa erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:596 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "Periodoak = %u\n" -#: speaker-test/speaker-test.c:599 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "Ezin dira ezarri nperiods-ak %u gisa erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:608 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "Ezin dira ezarri hw parametroak erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:614 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "period_size ezarri da = %lu\n" -#: speaker-test/speaker-test.c:615 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "buffer_size ezarri da = %lu\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "buffer txikiegia, ezin izan da erabili\n" -#: speaker-test/speaker-test.c:630 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "Ezin dira zehaztu oraingo sw parametroak erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:637 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "Ezin da ezarri 'hasi atalasea' modua erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:644 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "Ezin da ezarri 'avail min' erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:651 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "Ezin dira ezarri sw parametroak erreprodukziorako: %s\n" -#: speaker-test/speaker-test.c:671 +#: speaker-test/speaker-test.c:621 #, c-format msgid "Unable to set channel map: %s\n" msgstr "Ezin da ezarri kanal-mapa: %s\n" -#: speaker-test/speaker-test.c:696 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "" "Ezin da berreskuratu azpiratzetik (underrun), prestakuntzak huts egin du: " "%s\n" -#: speaker-test/speaker-test.c:707 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "Ezin da berreskuratu esekitzetik, prestakuntzak huts egin du: %s\n" -#: speaker-test/speaker-test.c:771 speaker-test/speaker-test.c:1272 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "Ez dago behar adina memoria\n" -#: speaker-test/speaker-test.c:776 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "Ezin da ireki %s WAV fitxategia\n" -#: speaker-test/speaker-test.c:780 speaker-test/speaker-test.c:809 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "%s WAV fitxategi baliogabea\n" -#: speaker-test/speaker-test.c:785 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "Ez da WAV fitxategia: %s\n" -#: speaker-test/speaker-test.c:789 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "Euskarririk gabeko %d WAV formatua %s(r)entzat\n" -#: speaker-test/speaker-test.c:794 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s ez da mono bidalketa (%d kanal)\n" -#: speaker-test/speaker-test.c:799 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "Lagin-tasa ez dator bat (%d) %s(r)ekin\n" -#: speaker-test/speaker-test.c:804 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "Euskarririk gabeko %d lagin formatu bitak %s(r)entzat\n" -#: speaker-test/speaker-test.c:865 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "%d kanal zehaztugabea\n" -#: speaker-test/speaker-test.c:916 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "Idazte errorea: %d,%s\n" -#: speaker-test/speaker-test.c:918 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery ekintzak huts egin du: %d,%s\n" -#: speaker-test/speaker-test.c:1004 +#: speaker-test/speaker-test.c:938 #, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, fuzzy, c-format +#| msgid "" +#| "Usage: speaker-test [OPTION]... \n" +#| "-h,--help\thelp\n" +#| "-D,--device\tplayback device\n" +#| "-r,--rate\tstream rate in Hz\n" +#| "-c,--channels\tcount of channels in stream\n" +#| "-f,--frequency\tsine wave frequency in Hz\n" +#| "-F,--format\tsample format\n" +#| "-b,--buffer\tring buffer size in us\n" +#| "-p,--period\tperiod size in us\n" +#| "-P,--nperiods\tnumber of periods\n" +#| "-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +#| "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +#| "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +#| "-w,--wavfile\tUse the given WAV file as a test sound\n" +#| "-W,--wavdir\tSpecify the directory containing WAV files\n" +#| "-m,--chmap\tSpecify the channel map to override\n" +#| "-X,--force-frequency\tforce frequencies outside the 30-8000hz range\n" +#| "-S,--scale\tScale of generated test tones in percent (default=80)\n" +#| "\n" msgid "" "Usage: speaker-test [OPTION]... \n" "-h,--help\thelp\n" @@ -1611,7 +1800,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1643,74 +1833,84 @@ msgstr "" "-S,--scale\tSortutako proba-tonuen eskala portzentaian (lehenetsia=80)\n" "\n" -#: speaker-test/speaker-test.c:1136 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "%d periodo kopuru baliogabea\n" -#: speaker-test/speaker-test.c:1152 speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "%s proba mota baliogabea\n" -#: speaker-test/speaker-test.c:1189 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "'%c' aukera ezezaguna\n" -#: speaker-test/speaker-test.c:1203 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "-s aukerarako parametro baliogabea.\n" -#: speaker-test/speaker-test.c:1218 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "Erreprodukzio gailua %s da\n" -#: speaker-test/speaker-test.c:1219 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "Erreprodukzio parametroak %iHz, %s, %i kanal dira\n" -#: speaker-test/speaker-test.c:1222 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "Soinu arroseko 16 zortzidun erabiltzen\n" -#: speaker-test/speaker-test.c:1225 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "Uhin sinusoidalaren tasa %.4fHz da\n" -#: speaker-test/speaker-test.c:1228 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "" "WAV fitxategia(k)\n" "\n" -#: speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "Erreprodukzio irekitze errorea: %d,%s\n" -#: speaker-test/speaker-test.c:1244 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "hwparams-eko hobespenek huts egin dute: %s\n" -#: speaker-test/speaker-test.c:1248 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "swparams-eko hobespenek huts egin dute: %s\n" -#: speaker-test/speaker-test.c:1295 speaker-test/speaker-test.c:1317 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "Bidalketak huts egin du: %s\n" -#: speaker-test/speaker-test.c:1303 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "Denbora periodoko = %lf\n" + +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "ez da aurkitu '%s' zerbitzua /etc/services direktorioan\n" diff --git a/po/fr.po b/po/fr.po index cb4fc3f..e824fb6 100644 --- a/po/fr.po +++ b/po/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.23\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-10 09:07+0100\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2020-07-08 16:05+0100\n" "Last-Translator: Olivier Humbert \n" "Language-Team: French \n" @@ -17,41 +17,54 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +#: alsamixer/card_select.c:77 alsamixer/device_name.c:127 msgid "Sound Card" msgstr "Carte Son" -#: alsamixer/card_select.c:181 +#: alsamixer/card_select.c:115 msgid "(default)" msgstr "(par défaut)" -#: alsamixer/card_select.c:191 +#: alsamixer/card_select.c:125 msgid "cannot enumerate sound cards" msgstr "les cartes son n'ont pas pu être énumérées" -#: alsamixer/card_select.c:215 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "entrez le nom du périphérique..." -#: alsamixer/cli.c:40 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "Utilisation : alsamixer [options]" -#: alsamixer/cli.c:41 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" " -c, --card=NUMBER sound card number or id\n" " -D, --device=NAME mixer device name\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -m, --mouse enable mouse\n" +" -M, --no-mouse disable mouse\n" +" -f, --config=FILE configuration file\n" +" -F, --no-config do not load configuration file\n" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "Options utiles:\n" " -h, --help cette aide\n" " -c, --card=NUMÉRO numéro ou identifiant de la carte son\n" " -D, --device=NOM nom du périphérique de mixage\n" -" -V, --view=MODE mode de visualisation par défaut : lecture/capture/tous" +" -V, --view=MODE mode de visualisation par défaut : lecture/capture/" +"tous" -#: alsamixer/cli.c:46 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -61,22 +74,22 @@ msgstr "" " -g, --no-color basculer l'utilisation de la couleur\n" " -a, --abstraction=NOM niveau d'abstraction du mixeur : aucun/basique" -#: alsamixer/cli.c:77 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "index de carte invalide : %s\n" -#: alsamixer/cli.c:103 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "niveau d'abstraction inconnu : %s\n" -#: alsamixer/cli.c:108 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "option inconnue : %c\n" -#: alsamixer/cli.c:110 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "essayez `alsamixer --help' pour plus d'informations\n" @@ -89,138 +102,138 @@ msgstr "Nom du périphérique :" msgid "%s: %s\n" msgstr "%s: %s\n" -#: alsamixer/mixer_display.c:98 +#: alsamixer/mixer_display.c:99 msgid "Card:" msgstr "Carte :" -#: alsamixer/mixer_display.c:99 +#: alsamixer/mixer_display.c:100 msgid "Chip:" msgstr "Puce :" -#: alsamixer/mixer_display.c:100 +#: alsamixer/mixer_display.c:101 msgid "View:" msgstr "Vue :" -#: alsamixer/mixer_display.c:101 +#: alsamixer/mixer_display.c:102 msgid "Item:" msgstr "Élement :" -#: alsamixer/mixer_display.c:104 +#: alsamixer/mixer_display.c:105 msgid "F1: Help" msgstr "F1 : Aide" -#: alsamixer/mixer_display.c:105 +#: alsamixer/mixer_display.c:106 msgid "F2: System information" msgstr "F2 : Informations système" -#: alsamixer/mixer_display.c:106 +#: alsamixer/mixer_display.c:107 msgid "F6: Select sound card" msgstr "F6 : Choisir la carte son" -#: alsamixer/mixer_display.c:107 +#: alsamixer/mixer_display.c:108 msgid "Esc: Exit" msgstr "Esc : quitter" -#: alsamixer/mixer_display.c:174 +#: alsamixer/mixer_display.c:179 msgid "(unplugged)" msgstr "(non branché)" -#: alsamixer/mixer_display.c:192 +#: alsamixer/mixer_display.c:197 msgid "Playback" msgstr "Lecture" -#: alsamixer/mixer_display.c:193 +#: alsamixer/mixer_display.c:198 msgid "Capture" msgstr "Capture" -#: alsamixer/mixer_display.c:194 +#: alsamixer/mixer_display.c:199 msgid "All" msgstr "Tout" -#: alsamixer/mixer_display.c:234 +#: alsamixer/mixer_display.c:240 msgid "mute" msgstr "muet" -#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:281 alsamixer/mixer_display.c:291 msgid "dB gain:" msgstr "gain dB :" -#: alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:291 #, c-format msgid " [%s %s, %s]" msgstr " [%s %s, %s]" -#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 -#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:306 +#: alsamixer/mixer_display.c:312 alsamixer/mixer_display.c:318 msgid "Off" msgstr "Fermé" -#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:318 msgid "On" msgstr "Ouvert" -#: alsamixer/mixer_display.c:363 +#: alsamixer/mixer_display.c:370 msgid "The sound device was unplugged." msgstr "Le périphérique son a été débranché" -#: alsamixer/mixer_display.c:364 +#: alsamixer/mixer_display.c:371 msgid "Press F6 to select another sound card." msgstr "Appuyez sur F6 pour sélectionner une autre carte son." -#: alsamixer/mixer_display.c:379 +#: alsamixer/mixer_display.c:386 msgid "This sound device does not have any playback controls." msgstr "Ce périphérique son n'a pas de commandes de lecture." -#: alsamixer/mixer_display.c:381 +#: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." msgstr "Ce périphérique son n'a pas de commandes de capture." -#: alsamixer/mixer_display.c:383 +#: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." msgstr "Ce périphérique son n'a pas de commandes." #. TRANSLATORS: playback on; one character -#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +#: alsamixer/mixer_display.c:523 alsamixer/mixer_display.c:528 msgid "O" msgstr "O" #. TRANSLATORS: playback muted; one character -#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +#: alsamixer/mixer_display.c:525 alsamixer/mixer_display.c:529 msgid "M" msgstr "M" #. TRANSLATORS: "left"; no more than two characters -#: alsamixer/mixer_display.c:536 +#: alsamixer/mixer_display.c:545 msgid "L" msgstr "G" #. TRANSLATORS: "right"; no more than two characters -#: alsamixer/mixer_display.c:540 +#: alsamixer/mixer_display.c:551 msgid "R" msgstr "D" #. TRANSLATORS: no more than eight characters -#: alsamixer/mixer_display.c:542 +#: alsamixer/mixer_display.c:555 msgid "CAPTURE" msgstr "CAPTURE" -#: alsamixer/mixer_display.c:592 +#: alsamixer/mixer_display.c:611 msgid "Front" msgstr "Avant" -#: alsamixer/mixer_display.c:595 +#: alsamixer/mixer_display.c:614 msgid "Rear" msgstr "Arrière" -#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:125 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "Centre" -#: alsamixer/mixer_display.c:601 +#: alsamixer/mixer_display.c:620 msgid "Woofer" msgstr "Basses" -#: alsamixer/mixer_display.c:604 +#: alsamixer/mixer_display.c:623 msgid "Side" msgstr "Côté" @@ -352,11 +365,11 @@ msgstr "" msgid "Help" msgstr "Aide" -#: alsamixer/proc_files.c:103 +#: alsamixer/proc_files.c:56 msgid "Select File" msgstr "Choisir un fichier" -#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +#: alsamixer/textbox.c:51 alsamixer/textbox.c:65 msgid "Error" msgstr "Erreur" @@ -365,24 +378,73 @@ msgstr "Erreur" msgid "Cannot open file \"%s\"." msgstr "Le fichier \"%s\" n'a pas pu être ouvert." -#: aplay/aplay.c:178 +#: aplay/aplay.c:184 msgid "raw data" msgstr "données brutes" -#: aplay/aplay.c:179 +#: aplay/aplay.c:185 msgid "VOC" msgstr "" -#: aplay/aplay.c:181 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "" -#: aplay/aplay.c:182 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "" -#: aplay/aplay.c:203 -#, c-format +#: aplay/aplay.c:209 +#, fuzzy, c-format +#| msgid "" +#| "Usage: %s [OPTION]... [FILE]...\n" +#| "\n" +#| "-h, --help help\n" +#| " --version print current version\n" +#| "-l, --list-devices list all soundcards and digital audio devices\n" +#| "-L, --list-pcms list device names\n" +#| "-D, --device=NAME select PCM by name\n" +#| "-q, --quiet quiet mode\n" +#| "-t, --file-type TYPE file type (voc, wav, raw or au)\n" +#| "-c, --channels=# channels\n" +#| "-f, --format=FORMAT sample format (case insensitive)\n" +#| "-r, --rate=# sample rate\n" +#| "-d, --duration=# interrupt after # seconds\n" +#| "-s, --samples=# interrupt after # samples per channel\n" +#| "-M, --mmap mmap stream\n" +#| "-N, --nonblock nonblocking mode\n" +#| "-F, --period-time=# distance between interrupts is # microseconds\n" +#| "-B, --buffer-time=# buffer duration is # microseconds\n" +#| " --period-size=# distance between interrupts is # frames\n" +#| " --buffer-size=# buffer duration is # frames\n" +#| "-A, --avail-min=# min available space for wakeup is # microseconds\n" +#| "-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +#| " (relative to buffer size if <= 0)\n" +#| "-T, --stop-delay=# delay for automatic PCM stop is # microseconds " +#| "from xrun\n" +#| "-v, --verbose show PCM structure and setup (accumulative)\n" +#| "-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +#| "-I, --separate-channels one file for each channel\n" +#| "-i, --interactive allow interactive operation from stdin\n" +#| "-m, --chmap=ch1,ch2,.. Give the channel map to override or follow\n" +#| " --disable-resample disable automatic rate resample\n" +#| " --disable-channels disable automatic channel conversions\n" +#| " --disable-format disable automatic format conversions\n" +#| " --disable-softvol disable software volume control (softvol)\n" +#| " --test-position test ring buffer position\n" +#| " --test-coef=# test coefficient for ring buffer position " +#| "(default 8)\n" +#| " expression for validation is: coef * " +#| "(buffer_size / 2)\n" +#| " --test-nowait do not wait for ring buffer - eats whole CPU\n" +#| " --max-file-time=# start another output file when the old file has " +#| "recorded\n" +#| " for this many seconds\n" +#| " --process-id-file write the process ID here\n" +#| " --use-strftime apply the strftime facility to the output file " +#| "name\n" +#| " --dump-hw-params dump hw_params of the device\n" +#| " --fatal-errors treat all errors as fatal\n" msgid "" "Usage: %s [OPTION]... [FILE]...\n" "\n" @@ -395,6 +457,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -436,7 +499,8 @@ msgstr "" "\n" "-h, --help aide\n" " --version afficher la version du programme\n" -"-l, --list-devices lister tous périphériques audio-numériques et cartes son\n" +"-l, --list-devices lister tous périphériques audio-numériques et cartes " +"son\n" "-L, --list-pcms lister les noms de périphériques\n" "-D, --device=NOM choisir le périphérique PCM par son nom\n" "-Q, --quiet mode silencieux\n" @@ -477,219 +541,231 @@ msgstr "" "validation est : coef * (taille_tampon / 2)\n" " --test-nowait ne pas attendre le tampon circulaire - prend toutes\n" "les resources du processeur\n" -" --max-file-time=# commencer un autre fichier de capture quand l'ancien\n" +" --max-file-time=# commencer un autre fichier de capture quand " +"l'ancien\n" "fichier a enregistré pendant X secondes\n" " --process-id-file écrire l'identifiant du processus ici\n" " --use-strftime utiliser strftime pour le nom du fichier de sortie\n" " --dump-hw-params récupérer le hw_params du périphérique\n" " --fatal-errors traiter toutes les erreurs comme fatales\n" -#: aplay/aplay.c:248 speaker-test/speaker-test.c:1023 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "Les formats d'échantillonage connus sont :" -#: aplay/aplay.c:254 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" "Some of these may not be available on selected hardware\n" msgstr "" "\n" -"Certains de ceux-ci ne sont peut être pas disponibles avec le matériel sélectionné\n" +"Certains de ceux-ci ne sont peut être pas disponibles avec le matériel " +"sélectionné\n" -#: aplay/aplay.c:255 +#: aplay/aplay.c:262 #, c-format msgid "The available format shortcuts are:\n" msgstr "Les raccourcis format disponibles sont :\n" -#: aplay/aplay.c:256 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 bit petit boutiste, 44100, stéréo)\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 bit gros boutiste, 44100, stéréo)\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 bit petit boutiste, 48000, stéréo)\n" -#: aplay/aplay.c:272 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "aucune carte son n'a été trouvée..." -#: aplay/aplay.c:275 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** Liste des périphériques matériels %s ****\n" -#: aplay/aplay.c:304 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "carte %i : %s [%s], périphérique %i : %s [%s]\n" -#: aplay/aplay.c:310 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " Sous-périphériques : %i/%i\n" -#: aplay/aplay.c:317 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " Sous-périphérique #%i : %s\n" -#: aplay/aplay.c:398 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "Interrompu par le signal %s...\n" -#: aplay/aplay.c:553 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "la commande doit être nommée arecord ou aplay" -#: aplay/aplay.c:597 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "format de fichier inconnu %s" -#: aplay/aplay.c:604 +#: aplay/aplay.c:614 #, c-format msgid "invalid channels argument '%s'" msgstr "argument des canaux invalides '%s'" -#: aplay/aplay.c:608 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "la valeur %i pour les canaux est incorrecte" -#: aplay/aplay.c:627 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "format étendu '%s' erronné" -#: aplay/aplay.c:635 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "format étendu '%s' erronné" + +#: aplay/aplay.c:657 #, c-format msgid "invalid rate argument '%s'" msgstr "argument de taux invalide '%s'" -#: aplay/aplay.c:642 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "mauvaise valeur de vitesse %i" -#: aplay/aplay.c:648 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" -msgstr "la durée et les arguments d'échantillons ne peuvent pas être utilisés ensemble" +msgstr "" +"la durée et les arguments d'échantillons ne peuvent pas être utilisés " +"ensemble" -#: aplay/aplay.c:653 +#: aplay/aplay.c:675 #, c-format msgid "invalid duration argument '%s'" msgstr "argument de durée invalide '%s'" -#: aplay/aplay.c:660 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" -msgstr "les échantillons et les arguments de durée ne peuvent pas être utilisés ensemble" +msgstr "" +"les échantillons et les arguments de durée ne peuvent pas être utilisés " +"ensemble" -#: aplay/aplay.c:665 +#: aplay/aplay.c:687 #, c-format msgid "invalid samples argument '%s'" msgstr "argument d'échantillon invalide '%s'" -#: aplay/aplay.c:677 +#: aplay/aplay.c:699 #, c-format msgid "invalid period time argument '%s'" msgstr "argument de temps de période invalide '%s'" -#: aplay/aplay.c:684 +#: aplay/aplay.c:706 #, c-format msgid "invalid buffer time argument '%s'" msgstr "argument de temps de tampon invalide '%s'" -#: aplay/aplay.c:691 +#: aplay/aplay.c:713 #, c-format msgid "invalid period size argument '%s'" msgstr "argument de taille de période invalide '%s'" -#: aplay/aplay.c:698 +#: aplay/aplay.c:720 #, c-format msgid "invalid buffer size argument '%s'" msgstr "argument de taille de tampon invalide '%s'" -#: aplay/aplay.c:705 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "argument d'espace disponible minimum invalide '%s'" -#: aplay/aplay.c:712 +#: aplay/aplay.c:734 #, c-format msgid "invalid start delay argument '%s'" msgstr "argument de délai de départ invalide '%s'" -#: aplay/aplay.c:719 +#: aplay/aplay.c:741 #, c-format msgid "invalid stop delay argument '%s'" msgstr "argument de délai d'arrêt invalide '%s'" -#: aplay/aplay.c:774 +#: aplay/aplay.c:796 #, c-format msgid "invalid test coef argument '%s'" msgstr "argument de coef de test invalide '%s'" -#: aplay/aplay.c:786 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "argument de temps de fichier maximum invalide '%s'" -#: aplay/aplay.c:806 speaker-test/speaker-test.c:666 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, c-format msgid "Unable to parse channel map string: %s\n" msgstr "Impossible d'analyser la chaîne de map du canal : %s\n" -#: aplay/aplay.c:812 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Essayez `%s --help' pour plus d'informations.\n" -#: aplay/aplay.c:828 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "erreur à l'ouverture audio : %s" -#: aplay/aplay.c:833 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "erreur info : %s" -#: aplay/aplay.c:840 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "paramètre de non-blocage erronné : %s" -#: aplay/aplay.c:850 aplay/aplay.c:974 aplay/aplay.c:1264 aplay/aplay.c:1458 -#: aplay/aplay.c:1979 aplay/aplay.c:2009 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "pas assez de mémoire" -#: aplay/aplay.c:874 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "Le fichier d'identifiant de processus %s n'a pas pu être créé : %s" -#: aplay/aplay.c:964 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "erreur de lecture (appelé à la ligne %i)" -#: aplay/aplay.c:1031 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "longueur du morceau 'fmt ' inconnue (lu %u, devrait être au moins %u)" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" @@ -697,33 +773,38 @@ msgstr "" "longueur du morceau 'fmt ' extensible inconnue (lu %u, devrait être au moins " "%u)" -#: aplay/aplay.c:1047 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "libellé de format erronné dans le morceau extensible 'fmt '" -#: aplay/aplay.c:1054 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "" "Les formats de ficher WAVE 0x%04x qui ne sont pas encodés en PCM ou FLOAT ne " "sont pas supportés" -#: aplay/aplay.c:1059 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "Les fichiers WAVE avec %d pistes ne sont pas supportés" -#: aplay/aplay.c:1067 aplay/aplay.c:1193 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "Avertissement : le format est changé en U8\n" -#: aplay/aplay.c:1077 aplay/aplay.c:1090 aplay/aplay.c:1101 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, c-format msgid "Warning: format is changed to %s\n" msgstr "Avertissement : le format est changé en %s\n" -#: aplay/aplay.c:1106 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" @@ -731,866 +812,988 @@ msgstr "" " les fichiers WAVE échantillonés %d bits par %d octets en largeur (%d " "canaux) ne sont pas supportés" -#: aplay/aplay.c:1129 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr "" " les fichiers WAVES échantillonés %d bits en largeur ne sont pas supportés" -#: aplay/aplay.c:1187 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "Avertissement : le format est changé en MU_LAW\n" -#: aplay/aplay.c:1199 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "Avertissement : le format est changé en S16_BE\n" -#: aplay/aplay.c:1212 aplay/aplay.c:2294 aplay/aplay.c:2301 aplay/aplay.c:2831 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "Avertissement : le format est changé en MU_LAW\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "erreur de lecture" -#: aplay/aplay.c:1242 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" -msgstr "Les numéros de canal ne correspondent pas entre hw_params et la carte de canal" +msgstr "" +"Les numéros de canal ne correspondent pas entre hw_params et la carte de " +"canal" -#: aplay/aplay.c:1251 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "Avertissement : impossible d'obtenir la carte de canal\n" -#: aplay/aplay.c:1284 -#, c-format -msgid "Channel %d doesn't match with hw_parmas" +#: aplay/aplay.c:1337 +#, fuzzy, c-format +#| msgid "Channel %d doesn't match with hw_parmas" +msgid "Channel %d doesn't match with hw_params" msgstr "Le canal %d ne correspond pas avec hw_parmas" -#: aplay/aplay.c:1310 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "Configuration erronée pour ce PCM : pas de configuration disponible" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "Params HW pour le périphérique \"%s\" :\n" -#: aplay/aplay.c:1334 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "Ce type d'accès n'est pas disponible" -#: aplay/aplay.c:1339 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "Ce format d'échantillonage n'est pas disponible" -#: aplay/aplay.c:1345 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "Ce format d'échantillonage n'est pas disponible" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "Nombre de canaux non disponible" -#: aplay/aplay.c:1360 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "" "Avertissement : la fréquence n'est pas précise (demandé = %iHz,\n" "obtenu = %iHz)\n" -#: aplay/aplay.c:1366 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " veuillez essayez le greffon de branchement %s\n" -#: aplay/aplay.c:1403 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "Les paramètres matériel n'ont pas pu être installés :" -#: aplay/aplay.c:1410 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "" "Une période égale à la taille du tampon (%lu == %lu) ne peut être utilisée" -#: aplay/aplay.c:1441 +#: aplay/aplay.c:1482 +#, fuzzy +#| msgid "unable to install sw params:" +msgid "Unable to get current sw params." +msgstr "Les paramètres logiciel n'ont pas pu être installés :" + +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "Les paramètres logiciel n'ont pas pu être installés :" -#: aplay/aplay.c:1476 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "problème snd_pcm_mmap_begin : %s" -#: aplay/aplay.c:1505 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "paramétrage du fanion stdin O_NONBLOCK échoué\n" -#: aplay/aplay.c:1529 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "commande \rPAUSE ignorée (pas de support hw)\n" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "erreur de poussée de pause : %s" -#: aplay/aplay.c:1548 -#, c-format -msgid "pause release error: %s" -msgstr "erreur de la relâche de la pause : %s" - -#: aplay/aplay.c:1564 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " msgstr "" -#: aplay/aplay.c:1606 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "erreur de la relâche de la pause : %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "erreur d'état : %s" -#: aplay/aplay.c:1611 -#, c-format -msgid "fatal %s: %s" -msgstr "fatal %s : %s" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1626 aplay/aplay.c:1634 -msgid "underrun" -msgstr "perte" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1634 -msgid "overrun" -msgstr "dépassement" - -#: aplay/aplay.c:1622 aplay/aplay.c:1633 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (au moins longue de %.3f ms)\n" -#: aplay/aplay.c:1638 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "perte" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "dépassement" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "État :\n" -#: aplay/aplay.c:1642 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "fatal %s : %s" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "xrun : erreur de préparation : %s" -#: aplay/aplay.c:1648 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "Statut (DRAINAGE) :\n" -#: aplay/aplay.c:1652 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "" "changement de format de flux de capture ? tentative de récupération...\n" -#: aplay/aplay.c:1654 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "xrun(DRAINAGE) : erreur de préparation : %s" -#: aplay/aplay.c:1661 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "Status(R/W) :\n" -#: aplay/aplay.c:1664 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "erreur de lecture/écriture, état = %s" -#: aplay/aplay.c:1674 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "Suspendu. Tentative de reprise. " -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "Échec. Redémarrage du flux." -#: aplay/aplay.c:1681 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "suspension : prepare error : %s" -#: aplay/aplay.c:1686 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "Terminé.\n" -#: aplay/aplay.c:1708 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr "" -#: aplay/aplay.c:1855 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "%d bit(s) non supporté(s).\n" -#: aplay/aplay.c:1889 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "Pic max. (%li échantillons) : 0x%08x " -#: aplay/aplay.c:1923 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " "%li\n" msgstr "" -"Position de tampon suspicieuse (total %li) : dispo = %li, délai = %li, tampon " -"= %li\n" +"Position de tampon suspicieuse (total %li) : dispo = %li, délai = %li, " +"tampon = %li\n" + +#: aplay/aplay.c:2043 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "" +"Position de tampon suspicieuse (total %li) : dispo = %li, délai = %li, " +"tampon = %li\n" + +#: aplay/aplay.c:2047 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "" +"Position de tampon suspicieuse (total %li) : dispo = %li, délai = %li, " +"tampon = %li\n" #: aplay/aplay.c:2051 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "" +"Position de tampon suspicieuse (total %li) : dispo = %li, délai = %li, " +"tampon = %li\n" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "erreur en écriture : %s" -#: aplay/aplay.c:2099 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "erreur de writev : %s" -#: aplay/aplay.c:2143 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "erreur en lecture : %s" -#: aplay/aplay.c:2187 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "erreur de readv : %s" -#: aplay/aplay.c:2235 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "Un tampon pour silence n'a pas pu être alloué" -#: aplay/aplay.c:2244 aplay/aplay.c:2472 aplay/aplay.c:2477 aplay/aplay.c:2527 -#: aplay/aplay.c:2536 aplay/aplay.c:2543 aplay/aplay.c:2553 aplay/aplay.c:2559 -#: aplay/aplay.c:2631 aplay/aplay.c:2661 aplay/aplay.c:2675 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "erreur en écriture" -#: aplay/aplay.c:2257 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - erreur de silence" -#: aplay/aplay.c:2260 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "erreur voc_pcm_flush" -#: aplay/aplay.c:2285 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "erreur malloc" -#: aplay/aplay.c:2289 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "Lecture du ficher de canaux Creative Labs '%s'...\n" -#: aplay/aplay.c:2357 aplay/aplay.c:2452 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "les fichiers .voc de type 'packed' ne sont pas supportés" -#: aplay/aplay.c:2412 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "%s n'est pas navigable; les motifs n'ont pas pu être lus\n" -#: aplay/aplay.c:2461 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "type de bloc %d inconnu. fin." -#: aplay/aplay.c:2595 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Le format wave %s n'est pas supporté..." -#: aplay/aplay.c:2655 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Le format %s Sparc Audio n'est pas supporté..." -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "Lecture" -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "Capture" -#: aplay/aplay.c:2740 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "Fréquence %d Hz, " -#: aplay/aplay.c:2742 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "" -#: aplay/aplay.c:2744 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "Stéréo" -#: aplay/aplay.c:2746 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "%i Canaux" -#: aplay/aplay.c:3344 aplay/aplay.c:3397 +#: aplay/aplay.c:3492 +#, fuzzy, c-format +#| msgid "You need to specify %d files" +msgid "You need to specify %u files" +msgstr "Vous devez spécifier %d fichiers" + +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "Vous devez spécifier %d fichiers" -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - gestionnaire de connection séquenceur ALSA\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "Utilisation :\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * Connexion/déconnexion entre deux ports\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-options] envoyeur destinataire\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " envoyeur, destinataire = couple client:port\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect déconnecter\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive connexion exclusive\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # convertit real-time-stamp à la queue\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # convertit tick-time-stamp à la queue\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * Lister les ports connectés (pas de souscription)\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr "" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr " -i,--input lister les ports (lisibles) d'entrée\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output lister les ports (écrivables) de sortie\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr " -i,--input lister les ports (lisibles) d'entrée\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr "" " -l,--list lister les connexions en cours\n" " de chaque port\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * Retirer toutes les connexions exportées\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr "" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "Connexion à" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "Connecté depuis" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, c-format msgid "client %d: '%s' [type=%s" msgstr "client %d : '%s' [type=%s" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "utilisateur" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "noyau" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "le séquenceur n'a pas pu être ouvert\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "l'identifiant du client n'as pas pu être obtenu\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "les infos du client n'ont pas pu être définies\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "l'adresse envoyeur %s est incorrecte\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "l'adresse destinataire %s est incorrecte\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "Aucune souscription trouvée\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "La déconnexion a échoué (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "La connexion a déjà été souscrite\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "Échec de connexion (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - client/serveur réseau sur le séquenceur ALSA\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr "" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "utilisation :\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " mode serveur : aseqnet [-options]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " mode client : aseqnet [-options] hôte_serveur\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "options :\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : spécifie le port TCP (numéro ou nom de service)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr " -s,--source addr : lire à partir de l'adr. donnée (client:port)\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest addr : écrire à l'adr. donnée (client:port)\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v, --verbose : affichage locace de messages\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i, --info : afficher certains évènements reçus\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "échec allocation mémoire (malloc)\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "fermeture des fichiers...\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "séquenceur ouvert : %d:%d\n" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "adresse source %s incorrecte\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "le service '%s' n'as pas été trouvé dans /etc/services\n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "l'adresse %s na pas pu être obtenue\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "Connexion à" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "trop de connexions !\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "accepté[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "l'adresse %s na pas pu être obtenue\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "ok.. connecté\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "Canal %2d : évènement de contrôle : %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "Canal %2d : Pitchbender : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "Canal %2d : évènement Note On : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "Canal %2d : évènement Note Off : %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "déconnecté\n" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "Avant gauche" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "Avant droit" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "Arrière gauche" -#: speaker-test/speaker-test.c:124 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "Arrière droit" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "Côté gauche" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "Côté droit" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "Canal 9" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "Canal 10" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "Canal 11" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "Canal 12" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "Canal 13" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "Canal 14" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "Canal 15" -#: speaker-test/speaker-test.c:136 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "Canal 16" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" -msgstr "Configuration erronée pour la lecture : pas de configuration disponible : %s\n" +msgstr "" +"Configuration erronée pour la lecture : pas de configuration disponible : " +"%s\n" -#: speaker-test/speaker-test.c:526 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "Le type d'accès est indisponible à la lecture : %s\n" -#: speaker-test/speaker-test.c:533 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "Le format d'échantillonage est indisponible à la lecture : %s\n" -#: speaker-test/speaker-test.c:540 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "Le nombre (%i) de canaux est indisponible à la lecture : %s\n" -#: speaker-test/speaker-test.c:548 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "La fréquence %iHz est indisponible à la lecture : %s\n" -#: speaker-test/speaker-test.c:553 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "" "La fréquence ne correspond pas (demandée : %iHz, obtenue %iHz, err %d)\n" -#: speaker-test/speaker-test.c:557 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "La fréquence est %iHz (demandée %iHz)\n" -#: speaker-test/speaker-test.c:563 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "L'intervalle de la taille du tampon est de %lu à %lu\n" -#: speaker-test/speaker-test.c:564 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "L'intervalle de la taille de la période est de %lu à %lu\n" -#: speaker-test/speaker-test.c:566 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "Temps de période demandé %u µs\n" -#: speaker-test/speaker-test.c:569 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" -msgstr "Le temps de période %u µs n'a pas pu être défini pour la lecture : %s\n" +msgstr "" +"Le temps de période %u µs n'a pas pu être défini pour la lecture : %s\n" -#: speaker-test/speaker-test.c:575 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "Temps tampon demandé %u µs\n" -#: speaker-test/speaker-test.c:578 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" -msgstr "Le temps tampon de %u µs n'a pas pu être définie pour la lecture : %s\n" +msgstr "" +"Le temps tampon de %u µs n'a pas pu être définie pour la lecture : %s\n" -#: speaker-test/speaker-test.c:587 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "Taille max. de tampon %lu utilisée\n" -#: speaker-test/speaker-test.c:590 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "La taile de tampon %lu n'a pas pu être définie pour la lecture : %s\n" -#: speaker-test/speaker-test.c:596 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "Périodes = %u\n" -#: speaker-test/speaker-test.c:599 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "nperiods %u n'a pas pu être défini pour la lecture : %s\n" -#: speaker-test/speaker-test.c:608 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "" "Les paramètres matériel n'ont pas pu être définis pour la lecture : %s\n" -#: speaker-test/speaker-test.c:614 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "était paramétré pour period_size = %lu\n" -#: speaker-test/speaker-test.c:615 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "était paramétré pour buffer_size = %lu\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "tampon trop petit, il n'a pas pu être utilisé\n" -#: speaker-test/speaker-test.c:630 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "" "Les paramètres logiciels actuels n'ont pas pu être déterminés pour la " "lecture : %s\n" -#: speaker-test/speaker-test.c:637 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" -msgstr "Impossible de paramétrer le mode de déclenchement de démarrage pour la lecture : %s\n" +msgstr "" +"Impossible de paramétrer le mode de déclenchement de démarrage pour la " +"lecture : %s\n" -#: speaker-test/speaker-test.c:644 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "Impossible de paramétrer le minimum disponible pour la lecture : %s\n" -#: speaker-test/speaker-test.c:651 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "" "Les paramètres logiciel n'ont pas pu être définis pour la lecture : %s\n" -#: speaker-test/speaker-test.c:671 +#: speaker-test/speaker-test.c:621 #, c-format msgid "Unable to set channel map: %s\n" msgstr "Impossible de paramètrer la carte de canal : %s\n" -#: speaker-test/speaker-test.c:696 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "Impossible de récupérer depuis une perte, préparation échouée : %s\n" -#: speaker-test/speaker-test.c:707 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "N'a pas pu récupérer depuis suspend, préparation échouée : %s\n" -#: speaker-test/speaker-test.c:771 speaker-test/speaker-test.c:1272 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "Pas assez de mémoire\n" -#: speaker-test/speaker-test.c:776 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "Le fichier WAV %s n'a pas pu être ouvert\n" -#: speaker-test/speaker-test.c:780 speaker-test/speaker-test.c:809 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "Fichier WAV incorrect %s\n" -#: speaker-test/speaker-test.c:785 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "Le fichier %s n'est pas au format WAV\n" -#: speaker-test/speaker-test.c:789 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "Format WAV %d non supporté pour %s\n" -#: speaker-test/speaker-test.c:794 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s n'est pas un flux en mono (%d canaux)\n" -#: speaker-test/speaker-test.c:799 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "La fréquence d'échantillonage (%d) ne correspond pas à %s\n" -#: speaker-test/speaker-test.c:804 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "Le format d'échantillonage %d bits n'est pas supporté pour %s\n" -#: speaker-test/speaker-test.c:865 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "Canal non-défini %d\n" -#: speaker-test/speaker-test.c:916 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "Erreur en écriture : %d,%s\n" -#: speaker-test/speaker-test.c:918 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery échoué : %d,%s\n" -#: speaker-test/speaker-test.c:1004 +#: speaker-test/speaker-test.c:938 #, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, fuzzy, c-format +#| msgid "" +#| "Usage: speaker-test [OPTION]... \n" +#| "-h,--help\thelp\n" +#| "-D,--device\tplayback device\n" +#| "-r,--rate\tstream rate in Hz\n" +#| "-c,--channels\tcount of channels in stream\n" +#| "-f,--frequency\tsine wave frequency in Hz\n" +#| "-F,--format\tsample format\n" +#| "-b,--buffer\tring buffer size in us\n" +#| "-p,--period\tperiod size in us\n" +#| "-P,--nperiods\tnumber of periods\n" +#| "-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +#| "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +#| "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +#| "-w,--wavfile\tUse the given WAV file as a test sound\n" +#| "-W,--wavdir\tSpecify the directory containing WAV files\n" +#| "-m,--chmap\tSpecify the channel map to override\n" +#| "-X,--force-frequency\tforce frequencies outside the 30-8000hz range\n" +#| "-S,--scale\tScale of generated test tones in percent (default=80)\n" +#| "\n" msgid "" "Usage: speaker-test [OPTION]... \n" "-h,--help\thelp\n" @@ -1602,7 +1805,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1633,76 +1837,86 @@ msgstr "" "-S,--scale\tÉchelle des tonalités de test générées en pourcent (défaut=80)\n" "\n" -#: speaker-test/speaker-test.c:1136 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "Nombre de périodes %d incorrect\n" -#: speaker-test/speaker-test.c:1152 speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "Type de test %s incorrect\n" -#: speaker-test/speaker-test.c:1189 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "Option '%c' inconnue\n" -#: speaker-test/speaker-test.c:1203 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "Paramètre incorrect pour l'option -s.\n" -#: speaker-test/speaker-test.c:1218 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "Le périphérique de lecture est %s\n" -#: speaker-test/speaker-test.c:1219 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "Les paramètres du flux sont %iHz, %s, %i canaux\n" -#: speaker-test/speaker-test.c:1222 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "Utilisation de 16 octaves de bruit rose\n" -#: speaker-test/speaker-test.c:1225 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "La fréquence de la courbe sinus est %.4fHz\n" -#: speaker-test/speaker-test.c:1228 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "fichier(s) WAV\n" -#: speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "Erreur d'ouverture à la lecture : %d,%s\n" -#: speaker-test/speaker-test.c:1244 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "Échec de la configuration des paramètres matériel : %s\n" -#: speaker-test/speaker-test.c:1248 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "Échec de la configuration des paramètres logiciel : %s\n" -#: speaker-test/speaker-test.c:1295 speaker-test/speaker-test.c:1317 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "Échec du transfer : %s\n" -#: speaker-test/speaker-test.c:1303 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "Temps par période = %lf\n" +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "le service '%s' n'as pas été trouvé dans /etc/services\n" + #~ msgid "Warning: format is changed to S16_LE\n" #~ msgstr "Avertissement : le format est changé en S16_LE\n" diff --git a/po/ja.po b/po/ja.po index 6e35088..43689b7 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.9a\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-10 09:07+0100\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2009-05-27 15:08+0200\n" "Last-Translator: Takashi Iwai \n" "Language-Team: Japanese\n" @@ -18,33 +18,45 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +#: alsamixer/card_select.c:77 alsamixer/device_name.c:127 msgid "Sound Card" msgstr "サウンドカード" -#: alsamixer/card_select.c:181 +#: alsamixer/card_select.c:115 msgid "(default)" msgstr "(デフォルト)" -#: alsamixer/card_select.c:191 +#: alsamixer/card_select.c:125 msgid "cannot enumerate sound cards" msgstr "サウンドカードを検出できません" -#: alsamixer/card_select.c:215 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "デバイス名入力..." -#: alsamixer/cli.c:40 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "使用法: alsamixer [オプション]" -#: alsamixer/cli.c:41 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" " -c, --card=NUMBER sound card number or id\n" " -D, --device=NAME mixer device name\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -m, --mouse enable mouse\n" +" -M, --no-mouse disable mouse\n" +" -f, --config=FILE configuration file\n" +" -F, --no-config do not load configuration file\n" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "主なオプション:\n" " -h, --help このヘルプ画面\n" @@ -52,7 +64,7 @@ msgstr "" " -D, --device=名前 ミキサーデバイス名\n" " -V, --view=表示モード 開始時の表示モード: playback/capture/all" -#: alsamixer/cli.c:46 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -62,22 +74,22 @@ msgstr "" " -g, --no-color カラー/モノクロ表示\n" " -a, --abstraction=名前 ミキサー抽象レベル: none/basic" -#: alsamixer/cli.c:77 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "不正なカード番号: %s\n" -#: alsamixer/cli.c:103 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "未知の抽象レベル: %s\n" -#: alsamixer/cli.c:108 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "未知のオプション '%c'\n" -#: alsamixer/cli.c:110 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "より詳しい情報は「alsamixer --help」を実行してください\n" @@ -90,138 +102,138 @@ msgstr "デバイス名:" msgid "%s: %s\n" msgstr "" -#: alsamixer/mixer_display.c:98 +#: alsamixer/mixer_display.c:99 msgid "Card:" msgstr "カード:" -#: alsamixer/mixer_display.c:99 +#: alsamixer/mixer_display.c:100 msgid "Chip:" msgstr "チップ:" -#: alsamixer/mixer_display.c:100 +#: alsamixer/mixer_display.c:101 msgid "View:" msgstr "表示:" -#: alsamixer/mixer_display.c:101 +#: alsamixer/mixer_display.c:102 msgid "Item:" msgstr "項目:" -#: alsamixer/mixer_display.c:104 +#: alsamixer/mixer_display.c:105 msgid "F1: Help" msgstr "F1: ヘルプ" -#: alsamixer/mixer_display.c:105 +#: alsamixer/mixer_display.c:106 msgid "F2: System information" msgstr "F2: システム情報" -#: alsamixer/mixer_display.c:106 +#: alsamixer/mixer_display.c:107 msgid "F6: Select sound card" msgstr "F6: サウンドカード選択" -#: alsamixer/mixer_display.c:107 +#: alsamixer/mixer_display.c:108 msgid "Esc: Exit" msgstr "Esc: 終了" -#: alsamixer/mixer_display.c:174 +#: alsamixer/mixer_display.c:179 msgid "(unplugged)" msgstr "" -#: alsamixer/mixer_display.c:192 +#: alsamixer/mixer_display.c:197 msgid "Playback" msgstr "再生" -#: alsamixer/mixer_display.c:193 +#: alsamixer/mixer_display.c:198 msgid "Capture" msgstr "録音" -#: alsamixer/mixer_display.c:194 +#: alsamixer/mixer_display.c:199 msgid "All" msgstr "全て" -#: alsamixer/mixer_display.c:234 +#: alsamixer/mixer_display.c:240 msgid "mute" msgstr "ミュート" -#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:281 alsamixer/mixer_display.c:291 msgid "dB gain:" msgstr "dBゲイン:" -#: alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:291 #, c-format msgid " [%s %s, %s]" msgstr "" -#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 -#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:306 +#: alsamixer/mixer_display.c:312 alsamixer/mixer_display.c:318 msgid "Off" msgstr "オフ" -#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:318 msgid "On" msgstr "オン" -#: alsamixer/mixer_display.c:363 +#: alsamixer/mixer_display.c:370 msgid "The sound device was unplugged." msgstr "デバイスが接続されていません" -#: alsamixer/mixer_display.c:364 +#: alsamixer/mixer_display.c:371 msgid "Press F6 to select another sound card." msgstr "他のカードを選択するにはF6を押して下さい" -#: alsamixer/mixer_display.c:379 +#: alsamixer/mixer_display.c:386 msgid "This sound device does not have any playback controls." msgstr "このカードには再生ミキサーがありません" -#: alsamixer/mixer_display.c:381 +#: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." msgstr "このカードには録音ミキサーがありません" -#: alsamixer/mixer_display.c:383 +#: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." msgstr "このカードには制御可能なミキサーがありません" #. TRANSLATORS: playback on; one character -#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +#: alsamixer/mixer_display.c:523 alsamixer/mixer_display.c:528 msgid "O" msgstr "" #. TRANSLATORS: playback muted; one character -#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +#: alsamixer/mixer_display.c:525 alsamixer/mixer_display.c:529 msgid "M" msgstr "" #. TRANSLATORS: "left"; no more than two characters -#: alsamixer/mixer_display.c:536 +#: alsamixer/mixer_display.c:545 msgid "L" msgstr "" #. TRANSLATORS: "right"; no more than two characters -#: alsamixer/mixer_display.c:540 +#: alsamixer/mixer_display.c:551 msgid "R" msgstr "" #. TRANSLATORS: no more than eight characters -#: alsamixer/mixer_display.c:542 +#: alsamixer/mixer_display.c:555 msgid "CAPTURE" msgstr "録音" -#: alsamixer/mixer_display.c:592 +#: alsamixer/mixer_display.c:611 msgid "Front" msgstr "フロント" -#: alsamixer/mixer_display.c:595 +#: alsamixer/mixer_display.c:614 msgid "Rear" msgstr "リア" -#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:125 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "センター" -#: alsamixer/mixer_display.c:601 +#: alsamixer/mixer_display.c:620 msgid "Woofer" msgstr "低音" -#: alsamixer/mixer_display.c:604 +#: alsamixer/mixer_display.c:623 msgid "Side" msgstr "サイド" @@ -354,11 +366,11 @@ msgstr "" msgid "Help" msgstr "ヘルプ" -#: alsamixer/proc_files.c:103 +#: alsamixer/proc_files.c:56 msgid "Select File" msgstr "ファイル選択" -#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +#: alsamixer/textbox.c:51 alsamixer/textbox.c:65 msgid "Error" msgstr "エラー" @@ -367,23 +379,23 @@ msgstr "エラー" msgid "Cannot open file \"%s\"." msgstr "\"%s\"をオープンできません" -#: aplay/aplay.c:178 +#: aplay/aplay.c:184 msgid "raw data" msgstr "raw データ" -#: aplay/aplay.c:179 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:181 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:182 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "Sparc オーディオ" -#: aplay/aplay.c:203 +#: aplay/aplay.c:209 #, fuzzy, c-format msgid "" "Usage: %s [OPTION]... [FILE]...\n" @@ -397,6 +409,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -469,12 +482,12 @@ msgstr "" " テスト範囲: coef * (buffer_size / 2)\n" " --test-nowait リングバッファのウエイトを禁止 - 注意:高CPU負荷\n" -#: aplay/aplay.c:248 speaker-test/speaker-test.c:1023 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "認識されるサンプルフォーマット:" -#: aplay/aplay.c:254 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -483,228 +496,239 @@ msgstr "" "\n" "これらのいくつかは指定のハードウェアで使用不可能な場合があります\n" -#: aplay/aplay.c:255 +#: aplay/aplay.c:262 #, fuzzy, c-format msgid "The available format shortcuts are:\n" msgstr "可能なフォーマットの省略形:\n" -#: aplay/aplay.c:256 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 ビット、リトルエンディアン、44100、ステレオ)\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 ビット、ビッグエンディアン、44100、ステレオ)\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 ビット、リトルエンディアン、48000、ステレオ)\n" -#: aplay/aplay.c:272 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "サウンドカードが見つかりません..." -#: aplay/aplay.c:275 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** ハードウェアデバイス %s のリスト ****\n" -#: aplay/aplay.c:304 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "カード %i: %s [%s], デバイス %i: %s [%s]\n" -#: aplay/aplay.c:310 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " サブデバイス: %i/%i\n" -#: aplay/aplay.c:317 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " サブデバイス #%i: %s\n" -#: aplay/aplay.c:398 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "シグナル %s で中断...\n" -#: aplay/aplay.c:553 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "arecord または aplay コマンドのみ可能" -#: aplay/aplay.c:597 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "不正なファイルフォーマット %s" -#: aplay/aplay.c:604 +#: aplay/aplay.c:614 #, fuzzy, c-format msgid "invalid channels argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:608 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "不正なチャネル数 %i" -#: aplay/aplay.c:627 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "不正な拡張フォーマット '%s'" -#: aplay/aplay.c:635 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "不正な拡張フォーマット '%s'" + +#: aplay/aplay.c:657 #, fuzzy, c-format msgid "invalid rate argument '%s'" msgstr "不正な送信アドレス %s\n" -#: aplay/aplay.c:642 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "不正なレート値 %i" -#: aplay/aplay.c:648 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "" -#: aplay/aplay.c:653 +#: aplay/aplay.c:675 #, fuzzy, c-format msgid "invalid duration argument '%s'" msgstr "受信アドレスが不正です: %s\n" -#: aplay/aplay.c:660 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "" -#: aplay/aplay.c:665 +#: aplay/aplay.c:687 #, fuzzy, c-format msgid "invalid samples argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:677 +#: aplay/aplay.c:699 #, fuzzy, c-format msgid "invalid period time argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:684 +#: aplay/aplay.c:706 #, fuzzy, c-format msgid "invalid buffer time argument '%s'" msgstr "不正な送信アドレス %s\n" -#: aplay/aplay.c:691 +#: aplay/aplay.c:713 #, fuzzy, c-format msgid "invalid period size argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:698 +#: aplay/aplay.c:720 #, fuzzy, c-format msgid "invalid buffer size argument '%s'" msgstr "不正な送信アドレス %s\n" -#: aplay/aplay.c:705 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "" -#: aplay/aplay.c:712 +#: aplay/aplay.c:734 #, fuzzy, c-format msgid "invalid start delay argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:719 +#: aplay/aplay.c:741 #, fuzzy, c-format msgid "invalid stop delay argument '%s'" msgstr "送信アドレスが不正です: %s\n" -#: aplay/aplay.c:774 +#: aplay/aplay.c:796 #, fuzzy, c-format msgid "invalid test coef argument '%s'" msgstr "不正な送信アドレス %s\n" -#: aplay/aplay.c:786 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "" -#: aplay/aplay.c:806 speaker-test/speaker-test.c:666 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, fuzzy, c-format msgid "Unable to parse channel map string: %s\n" msgstr "avail_min を設定できません: %s\n" -#: aplay/aplay.c:812 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "より詳しい情報は「%s --help」を実行してください\n" -#: aplay/aplay.c:828 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "" -#: aplay/aplay.c:833 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "" -#: aplay/aplay.c:840 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "" -#: aplay/aplay.c:850 aplay/aplay.c:974 aplay/aplay.c:1264 aplay/aplay.c:1458 -#: aplay/aplay.c:1979 aplay/aplay.c:2009 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "メモリが足りません" -#: aplay/aplay.c:874 +#: aplay/aplay.c:904 #, fuzzy, c-format msgid "Cannot create process ID file %s: %s" msgstr "WAVファイルがオープンできません: %s\n" -#: aplay/aplay.c:964 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "リードエラー (%i 行)" -#: aplay/aplay.c:1031 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" msgstr "" -#: aplay/aplay.c:1047 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "" -#: aplay/aplay.c:1054 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "" -#: aplay/aplay.c:1059 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "%d トラックを含む WAVE ファイルは再生できません" -#: aplay/aplay.c:1067 aplay/aplay.c:1193 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "警告: フォーマットは U8 に変更されます\n" -#: aplay/aplay.c:1077 aplay/aplay.c:1090 aplay/aplay.c:1101 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, fuzzy, c-format msgid "Warning: format is changed to %s\n" msgstr "警告: フォーマットは U8 に変更されます\n" -#: aplay/aplay.c:1106 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" @@ -712,851 +736,929 @@ msgstr "" "%2$d バイト長 %1$d サンプルビット (%3$d チャネル) の WAVE ファイルは再生でき" "ません" -#: aplay/aplay.c:1129 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr "%d ビット長のサンプルの WAVE ファイルは再生できません" -#: aplay/aplay.c:1187 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "警告: フォーマットは MU_LAW に変更されます\n" -#: aplay/aplay.c:1199 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "警告: フォーマットは S16_BE に変更されます\n" -#: aplay/aplay.c:1212 aplay/aplay.c:2294 aplay/aplay.c:2301 aplay/aplay.c:2831 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "警告: フォーマットは MU_LAW に変更されます\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "リードエラー" -#: aplay/aplay.c:1242 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "" -#: aplay/aplay.c:1251 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "" -#: aplay/aplay.c:1284 +#: aplay/aplay.c:1337 #, c-format -msgid "Channel %d doesn't match with hw_parmas" +msgid "Channel %d doesn't match with hw_params" msgstr "" -#: aplay/aplay.c:1310 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "指定の PCM を使用できません: 設定がありません" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "" -#: aplay/aplay.c:1334 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "アクセスタイプが使用不可能" -#: aplay/aplay.c:1339 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "サンプルフォーマットが使用不可能" -#: aplay/aplay.c:1345 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "サンプルフォーマットが使用不可能" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "チャネル数が使用不可能" -#: aplay/aplay.c:1360 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "警告: レートが不正確です (要求値 = %iHz, 使用値 = %iHz)\n" -#: aplay/aplay.c:1366 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " plug プラグイン%s を使用してください\n" -#: aplay/aplay.c:1403 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "hw params のインストールに失敗しました:" -#: aplay/aplay.c:1410 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "period と buffer サイズには同じ値を使用できません (%lu == %lu)" -#: aplay/aplay.c:1441 +#: aplay/aplay.c:1482 +#, fuzzy +#| msgid "unable to install sw params:" +msgid "Unable to get current sw params." +msgstr "sw params のインストールに失敗しました:" + +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "sw params のインストールに失敗しました:" -#: aplay/aplay.c:1476 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "" -#: aplay/aplay.c:1505 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "" -#: aplay/aplay.c:1529 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1631 #, fuzzy, c-format msgid "pause push error: %s" msgstr "ステータスエラー: %s" -#: aplay/aplay.c:1548 -#, fuzzy, c-format -msgid "pause release error: %s" -msgstr "サスペンド: prepare エラー: %s" - -#: aplay/aplay.c:1564 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " msgstr "" -#: aplay/aplay.c:1606 +#: aplay/aplay.c:1644 +#, fuzzy, c-format +msgid "pause release error: %s" +msgstr "サスペンド: prepare エラー: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "ステータスエラー: %s" -#: aplay/aplay.c:1611 -#, c-format -msgid "fatal %s: %s" -msgstr "" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1626 aplay/aplay.c:1634 -msgid "underrun" -msgstr "アンダーラン" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1634 -msgid "overrun" -msgstr "オーバーラン" - -#: aplay/aplay.c:1622 aplay/aplay.c:1633 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (少なくとも %.3f ms)\n" -#: aplay/aplay.c:1638 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "アンダーラン" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "オーバーラン" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "ステータス:\n" -#: aplay/aplay.c:1642 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "" -#: aplay/aplay.c:1648 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "ステータス(DRAINING):\n" -#: aplay/aplay.c:1652 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "録音ストリームのフォーマットが変更? 修復を試みます...\n" -#: aplay/aplay.c:1654 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "" -#: aplay/aplay.c:1661 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "ステータス(R/W):\n" -#: aplay/aplay.c:1664 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "読み書きエラー, ステータス = %s" -#: aplay/aplay.c:1674 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "サスペンド中です。レジュームします。" -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "失敗しました。ストリームを再スタートします。" -#: aplay/aplay.c:1681 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "サスペンド: prepare エラー: %s" -#: aplay/aplay.c:1686 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "終了\n" -#: aplay/aplay.c:1708 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr "" -#: aplay/aplay.c:1855 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "" -#: aplay/aplay.c:1889 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "最大ピーク (%li サンプル): 0x%08x " -#: aplay/aplay.c:1923 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " "%li\n" msgstr "" +#: aplay/aplay.c:2043 +#, c-format +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "" + +#: aplay/aplay.c:2047 +#, c-format +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "" + #: aplay/aplay.c:2051 #, c-format +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 +#, c-format msgid "write error: %s" msgstr "書込エラー: %s" -#: aplay/aplay.c:2099 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "書込(writev)エラー: %s" -#: aplay/aplay.c:2143 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "読込エラー: %s" -#: aplay/aplay.c:2187 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "読込(readv)エラー: %s" -#: aplay/aplay.c:2235 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "サイレンス用のバッファの取得に失敗しました" -#: aplay/aplay.c:2244 aplay/aplay.c:2472 aplay/aplay.c:2477 aplay/aplay.c:2527 -#: aplay/aplay.c:2536 aplay/aplay.c:2543 aplay/aplay.c:2553 aplay/aplay.c:2559 -#: aplay/aplay.c:2631 aplay/aplay.c:2661 aplay/aplay.c:2675 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "書込エラー" -#: aplay/aplay.c:2257 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "" -#: aplay/aplay.c:2260 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "" -#: aplay/aplay.c:2285 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "malloc エラー" -#: aplay/aplay.c:2289 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "Creative Labs Channel ファイル '%s' を演奏中...\n" -#: aplay/aplay.c:2357 aplay/aplay.c:2452 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "packed .voc ファイルは演奏できません" -#: aplay/aplay.c:2412 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "ループ演奏できません。%s はシーク不可能です\n" -#: aplay/aplay.c:2461 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "未知のブロックタイプ %d: 終了します。" -#: aplay/aplay.c:2595 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "WAVE は %s フォーマットをサポートしません..." -#: aplay/aplay.c:2655 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Sparc オーディオは %s フォーマットをサポートしません..." -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "再生中" -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "録音中" -#: aplay/aplay.c:2740 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "レート %d Hz, " -#: aplay/aplay.c:2742 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "モノラル" -#: aplay/aplay.c:2744 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "ステレオ" -#: aplay/aplay.c:2746 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "チャネル数 %i" -#: aplay/aplay.c:3344 aplay/aplay.c:3397 +#: aplay/aplay.c:3492 +#, fuzzy, c-format +#| msgid "You need to specify %d files" +msgid "You need to specify %u files" +msgstr "%d 個のファイルを指定してください" + +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "%d 個のファイルを指定してください" -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - ALSA sequencer 接続マネージャ\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "使用法:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * 二つのポートの接続/切り離し\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-オプション] 送信 受信\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " 送信, 受信 = クライアント:ポートの組\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect 切り離し\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive 排他接続\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # キューのリアルタイムスタンプに変換\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # キューのティックタイムスタンプに変換\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * 接続済みのポートの一覧\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [-オプション]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr " -i,--input 入力 (読込) ポートの一覧\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output 主力 (書込) ポートの一覧\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr " -i,--input 入力 (読込) ポートの一覧\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr " -l,--list 各ポートの現在の接続を表示\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * 全てのエクスポートされた接続を切り離す\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x, --removall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "接続先" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "接続元" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, fuzzy, c-format msgid "client %d: '%s' [type=%s" msgstr "クライアント %d: '%s' [タイプ=%s]\n" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "ユーザ" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "カーネル" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "sequencer をオープンできません\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "クライアント ID を取得できません\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "クライアント情報を取得できません\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "送信アドレスが不正です: %s\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "受信アドレスが不正です: %s\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "接続が見つかりません\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "切り離しに失敗 (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "既に接続されています\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "接続に失敗 (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - ALSA sequencer 上のネットワーククライアント/サーバ\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr "" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "使用法:\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " サーバモード: aseqnet [-オプション]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " クライアントモード: aseqnet [-オプション] サーバホスト\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "オプション:\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, fuzzy, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : TCP ポートの指定 (数字またはサービス名)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr " -s,--source addr : 指定のアドレス(クライアント:ポート)から読み込む\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest addr : 指定のアドレス(クライアント:ポート)に書き込む\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v,--verbose : 冗長メッセージ表示\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i,--info : 受信イベントを表示する\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "malloc できません\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "ファイルを閉じます..\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "不正な送信アドレス %s\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "サービス '%s' が /etc/services に見つかりません\n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "アドレス %s を取得できません\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "接続先" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "接続が多すぎます!\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "了解[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "アドレス %s を取得できません\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "ok.. 接続\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "チャネル %2d: コントロール : %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "チャネル %2d: ピッチベンド : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "チャネル %2d: ノートオン : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "チャネル %2d: ノートオフ : %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "切り離し\n" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "" -#: speaker-test/speaker-test.c:124 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "" -#: speaker-test/speaker-test.c:136 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "再生用に設定できません: 設定がみつかりません: %s\n" -#: speaker-test/speaker-test.c:526 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "アクセスタイプが不正です: %s\n" -#: speaker-test/speaker-test.c:533 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "指定のサンプルフォーマットを使用できません: %s\n" -#: speaker-test/speaker-test.c:540 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "チャネル数 (%i) を使用できません: %s\n" -#: speaker-test/speaker-test.c:548 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "レート %iHz を使用できません: %s\n" -#: speaker-test/speaker-test.c:553 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "設定レートが一致しません< (要求値 %iHz, 取得値 %iHz, エラー %d)\n" -#: speaker-test/speaker-test.c:557 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "レート %iHz (要求値 %iHz)\n" -#: speaker-test/speaker-test.c:563 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "バッファサイズ範囲 %lu 〜 %lu\n" -#: speaker-test/speaker-test.c:564 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "ピリオドサイズ範囲 %lu 〜 %lu\n" -#: speaker-test/speaker-test.c:566 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "要求されたピリオド長 %u us\n" -#: speaker-test/speaker-test.c:569 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "ピリオド長 %u us を設定できません: %s\n" -#: speaker-test/speaker-test.c:575 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "要求されたバッファ長 %u us\n" -#: speaker-test/speaker-test.c:578 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "バッファ長 %u us を設定できません: %s\n" -#: speaker-test/speaker-test.c:587 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "最大バッファサイズ %lu を使用\n" -#: speaker-test/speaker-test.c:590 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "バッファサイズ %lu を設定できません: %s\n" -#: speaker-test/speaker-test.c:596 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "ピリオド数 = %u\n" -#: speaker-test/speaker-test.c:599 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "ピリオド数 %u を設定できません: %s\n" -#: speaker-test/speaker-test.c:608 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "hw params を設定できません: %s\n" -#: speaker-test/speaker-test.c:614 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "period_size = %lu で設定\n" -#: speaker-test/speaker-test.c:615 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "buffer_size = %lu で設定\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "バッファが小さすぎます\n" -#: speaker-test/speaker-test.c:630 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "現在の swparams を取得できません: %s\n" -#: speaker-test/speaker-test.c:637 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "start_threshold モードを設定できません: %s\n" -#: speaker-test/speaker-test.c:644 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "avail_min を設定できません: %s\n" -#: speaker-test/speaker-test.c:651 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "再生用の sw params を設定できません: %s\n" -#: speaker-test/speaker-test.c:671 +#: speaker-test/speaker-test.c:621 #, fuzzy, c-format msgid "Unable to set channel map: %s\n" msgstr "avail_min を設定できません: %s\n" -#: speaker-test/speaker-test.c:696 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "アンダーランから復帰失敗: %s\n" -#: speaker-test/speaker-test.c:707 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "サスペンドから復帰失敗: %s\n" -#: speaker-test/speaker-test.c:771 speaker-test/speaker-test.c:1272 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "メモリが足りません\n" -#: speaker-test/speaker-test.c:776 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "WAVファイルがオープンできません: %s\n" -#: speaker-test/speaker-test.c:780 speaker-test/speaker-test.c:809 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "不正なWAVファイルです: %s\n" -#: speaker-test/speaker-test.c:785 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "WAVファイルではありません: %s\n" -#: speaker-test/speaker-test.c:789 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "未サポートのWAVフォーマット %d: %s\n" -#: speaker-test/speaker-test.c:794 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s はモノストリームではありません (%d チャネル)\n" -#: speaker-test/speaker-test.c:799 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "サンプルレートが不一致です(%d): %s\n" -#: speaker-test/speaker-test.c:804 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "未サポートのサンプルフォーマットビット %d: %s\n" -#: speaker-test/speaker-test.c:865 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "未定義のチャネル %d\n" -#: speaker-test/speaker-test.c:916 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "書込エラー: %d,%s\n" -#: speaker-test/speaker-test.c:918 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery 失敗: %d,%s\n" -#: speaker-test/speaker-test.c:1004 +#: speaker-test/speaker-test.c:938 +#, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 #, fuzzy, c-format msgid "" "Usage: speaker-test [OPTION]... \n" @@ -1569,7 +1671,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1598,76 +1701,86 @@ msgstr "" "-X,--force-frequency\t30-8000Hz範囲外許可\n" "\n" -#: speaker-test/speaker-test.c:1136 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "不正なピリオド数 %d\n" -#: speaker-test/speaker-test.c:1152 speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "不正なテストタイプ %s\n" -#: speaker-test/speaker-test.c:1189 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "未知のオプション '%c'\n" -#: speaker-test/speaker-test.c:1203 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "-s オプションの値が不正です\n" -#: speaker-test/speaker-test.c:1218 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "再生デバイス: %s\n" -#: speaker-test/speaker-test.c:1219 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "ストリームパラメータ: %iHz, %s, %i チャネル\n" -#: speaker-test/speaker-test.c:1222 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "16 オクターブのピンクノイズを使用\n" -#: speaker-test/speaker-test.c:1225 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "正弦波レート: %.4fHz\n" -#: speaker-test/speaker-test.c:1228 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "WAV ファイル\n" -#: speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "再生オープンエラー: %d,%s\n" -#: speaker-test/speaker-test.c:1244 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "hwparams の設定に失敗: %s\n" -#: speaker-test/speaker-test.c:1248 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "swparams の設定に失敗: %s\n" -#: speaker-test/speaker-test.c:1295 speaker-test/speaker-test.c:1317 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "転送に失敗しました: %s\n" -#: speaker-test/speaker-test.c:1303 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "ピリオド時間 = %lf\n" +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "サービス '%s' が /etc/services に見つかりません\n" + #~ msgid "Warning: format is changed to S16_LE\n" #~ msgstr "警告: フォーマットは S16_LE に変更されます\n" diff --git a/po/ka.po b/po/ka.po index 4fca706..a3cd97d 100644 --- a/po/ka.po +++ b/po/ka.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.2.7\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-09-08 09:06+0200\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2022-09-09 10:28+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian <(nothing)>\n" @@ -34,11 +34,22 @@ msgstr "ხმის ბარათების სიის მიღები msgid "enter device name..." msgstr "შეიყვანეთ მოწყობილობის სახელი..." -#: alsamixer/cli.c:43 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "გამოყენება: alsamixer [პარამეტრები]" -#: alsamixer/cli.c:44 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -m, --mouse enable mouse\n" +#| " -M, --no-mouse disable mouse\n" +#| " -f, --config=FILE configuration file\n" +#| " -F, --no-config do not load configuration file\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" @@ -48,7 +59,8 @@ msgid "" " -M, --no-mouse disable mouse\n" " -f, --config=FILE configuration file\n" " -F, --no-config do not load configuration file\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "სასარგებლო პარამეტრები:\n" " -h, --help ეს დახმარება\n" @@ -61,7 +73,7 @@ msgstr "" " -V, --view=რეჟიმი ხედის რეჟიმის გაშვება: playback (დაკვრა)/record " "(ჩაჭერა)/all (ყველა)" -#: alsamixer/cli.c:53 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -72,22 +84,22 @@ msgstr "" " -a, --abstraction=სახელი მიქსერის აბსტრაქციის დონე: none(არც ერთი)/" "basic (ძირითადი)" -#: alsamixer/cli.c:88 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "ბარათის არასწორი ინდექსი: %s\n" -#: alsamixer/cli.c:130 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "უცნობი აბსტრაქციის დონე: %s\n" -#: alsamixer/cli.c:135 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "უცნობი პარამეტრი: %c\n" -#: alsamixer/cli.c:137 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "მეტი ინფორმაციისთვის სცადეთ 'alsamixer --help'\n" @@ -223,7 +235,7 @@ msgstr "წინა" msgid "Rear" msgstr "უკანა" -#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:124 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "ცენტრი" @@ -376,24 +388,73 @@ msgstr "შეცდომა" msgid "Cannot open file \"%s\"." msgstr "ფაილის გახსნის შეცდომა: %s." -#: aplay/aplay.c:180 +#: aplay/aplay.c:184 msgid "raw data" msgstr "დაუმუშავებელი მონაცემი" -#: aplay/aplay.c:181 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:183 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:184 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "Sparc აუდიო" -#: aplay/aplay.c:205 -#, c-format +#: aplay/aplay.c:209 +#, fuzzy, c-format +#| msgid "" +#| "Usage: %s [OPTION]... [FILE]...\n" +#| "\n" +#| "-h, --help help\n" +#| " --version print current version\n" +#| "-l, --list-devices list all soundcards and digital audio devices\n" +#| "-L, --list-pcms list device names\n" +#| "-D, --device=NAME select PCM by name\n" +#| "-q, --quiet quiet mode\n" +#| "-t, --file-type TYPE file type (voc, wav, raw or au)\n" +#| "-c, --channels=# channels\n" +#| "-f, --format=FORMAT sample format (case insensitive)\n" +#| "-r, --rate=# sample rate\n" +#| "-d, --duration=# interrupt after # seconds\n" +#| "-s, --samples=# interrupt after # samples per channel\n" +#| "-M, --mmap mmap stream\n" +#| "-N, --nonblock nonblocking mode\n" +#| "-F, --period-time=# distance between interrupts is # microseconds\n" +#| "-B, --buffer-time=# buffer duration is # microseconds\n" +#| " --period-size=# distance between interrupts is # frames\n" +#| " --buffer-size=# buffer duration is # frames\n" +#| "-A, --avail-min=# min available space for wakeup is # microseconds\n" +#| "-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +#| " (relative to buffer size if <= 0)\n" +#| "-T, --stop-delay=# delay for automatic PCM stop is # microseconds " +#| "from xrun\n" +#| "-v, --verbose show PCM structure and setup (accumulative)\n" +#| "-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +#| "-I, --separate-channels one file for each channel\n" +#| "-i, --interactive allow interactive operation from stdin\n" +#| "-m, --chmap=ch1,ch2,.. Give the channel map to override or follow\n" +#| " --disable-resample disable automatic rate resample\n" +#| " --disable-channels disable automatic channel conversions\n" +#| " --disable-format disable automatic format conversions\n" +#| " --disable-softvol disable software volume control (softvol)\n" +#| " --test-position test ring buffer position\n" +#| " --test-coef=# test coefficient for ring buffer position " +#| "(default 8)\n" +#| " expression for validation is: coef * " +#| "(buffer_size / 2)\n" +#| " --test-nowait do not wait for ring buffer - eats whole CPU\n" +#| " --max-file-time=# start another output file when the old file has " +#| "recorded\n" +#| " for this many seconds\n" +#| " --process-id-file write the process ID here\n" +#| " --use-strftime apply the strftime facility to the output file " +#| "name\n" +#| " --dump-hw-params dump hw_params of the device\n" +#| " --fatal-errors treat all errors as fatal\n" msgid "" "Usage: %s [OPTION]... [FILE]...\n" "\n" @@ -406,6 +467,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -439,8 +501,7 @@ msgid "" "recorded\n" " for this many seconds\n" " --process-id-file write the process ID here\n" -" --use-strftime apply the strftime facility to the output file " -"name\n" +" --use-strftime apply the strftime facility to the output file name\n" " --dump-hw-params dump hw_params of the device\n" " --fatal-errors treat all errors as fatal\n" msgstr "" @@ -448,8 +509,7 @@ msgstr "" "\n" "-h, --help დახმარება\n" " --version მიმდინარე ვერსიის გამოტანა\n" -"-l, --list-devices ხმის ბარათებისა და ციფრული აუდიო მოწყობილობების " -"სია\n" +"-l, --list-devices ხმის ბარათებისა და ციფრული აუდიო მოწყობილობების სია\n" "-L, --list-pcms მოწყობილობების სახელების სია\n" "-D, --device=NAME PCM -ის სახელით არჩევა\n" "-q, --quiet ჩუმი რეჟიმი\n" @@ -491,16 +551,15 @@ msgstr "" "\t\t\t\t\t\tახალი ფაილის დაწყება\n" " --process-id-file პროცესის ID-ის ფაილში ჩაწერა\n" " --use-strftime გამოტანის ფაილის სახელზე strftime-ის გადატარება\n" -" --dump-hw-params მოწყობილობის აპარატურული პარამეტრების ფაილში " -"ჩაწერა\n" +" --dump-hw-params მოწყობილობის აპარატურული პარამეტრების ფაილში ჩაწერა\n" " --fatal-errors ყველა შეცდომის ფატალურად ჩათვლა\n" -#: aplay/aplay.c:250 speaker-test/speaker-test.c:961 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "სემპლის მისაღები ფორმატებია:" -#: aplay/aplay.c:256 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -509,346 +568,363 @@ msgstr "" "\n" "აქედან ზოგიერთი შეიძლება არჩეულ აპარატურაზე წვდომადი არ იყოს\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:262 #, c-format msgid "The available format shortcuts are:\n" msgstr "ფორმატების ხელმისაწვდომი შემოკლებები:\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 bit little endian, 44100, stereo)\n" -#: aplay/aplay.c:259 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 bit big endian, 44100, stereo)\n" -#: aplay/aplay.c:260 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 bit little endian, 48000, stereo)\n" -#: aplay/aplay.c:274 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "ხმის ბარათის პოვნა შეუძლებელია..." -#: aplay/aplay.c:277 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** %s აპარატურული მოწყობილობის სია ****\n" -#: aplay/aplay.c:306 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "ბარათი %i: %s [%s], მოწყობილობა %i: %s [%s]\n" -#: aplay/aplay.c:312 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " ქვემოწყობილობები: %i/%i\n" -#: aplay/aplay.c:319 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " ქვემოწყობილობა #%i: %s\n" -#: aplay/aplay.c:400 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "ავარიულად დასრულდა სიგნალით %s...\n" -#: aplay/aplay.c:555 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "ბრძანებას arecord ან aplay უნდა ერქვას" -#: aplay/aplay.c:599 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "ფაილის უცნობი ფორმატი: %s" -#: aplay/aplay.c:606 +#: aplay/aplay.c:614 #, c-format msgid "invalid channels argument '%s'" msgstr "არხის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:610 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "არხებისთვის მნიშვნელობა \"%i\" არასწორია" -#: aplay/aplay.c:630 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "არასწორი გაფართოებული ფორმატი \"%s\"" -#: aplay/aplay.c:638 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "არასწორი გაფართოებული ფორმატი \"%s\"" + +#: aplay/aplay.c:657 #, c-format msgid "invalid rate argument '%s'" msgstr "სიხშირის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:645 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "სიჩქარის არასწორი მნიშვნელობა: %i" -#: aplay/aplay.c:651 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "ხანგრძლივობის და სემპლის არგუმენტებს ერთდრულად ვერ გამოიყენებთ" -#: aplay/aplay.c:656 +#: aplay/aplay.c:675 #, c-format msgid "invalid duration argument '%s'" msgstr "ხანგრძლივობს არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:663 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "ხანგრძლივობის და სემპლის არგუმენტებს ერთდრულად ვერ გამოიყენებთ" -#: aplay/aplay.c:668 +#: aplay/aplay.c:687 #, c-format msgid "invalid samples argument '%s'" msgstr "სემპლის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:680 +#: aplay/aplay.c:699 #, c-format msgid "invalid period time argument '%s'" msgstr "დროის პერიოდის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:687 +#: aplay/aplay.c:706 #, c-format msgid "invalid buffer time argument '%s'" msgstr "ბუფერის დროის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:694 +#: aplay/aplay.c:713 #, c-format msgid "invalid period size argument '%s'" msgstr "პერიოდის ზომის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:701 +#: aplay/aplay.c:720 #, c-format msgid "invalid buffer size argument '%s'" msgstr "ბუფერის ზომის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:708 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "მინინალური ხელმისაწვდომი ადგილის არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:715 +#: aplay/aplay.c:734 #, c-format msgid "invalid start delay argument '%s'" msgstr "დაწყების დაყოვნების არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:722 +#: aplay/aplay.c:741 #, c-format msgid "invalid stop delay argument '%s'" msgstr "გაჩერების დაყოვნების არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:777 +#: aplay/aplay.c:796 #, c-format msgid "invalid test coef argument '%s'" msgstr "სატესტო კოეფიც. არასწორი არგუმენტი: '%s'" -#: aplay/aplay.c:789 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "მაქსიმალური ფაილის დროის არასწორი არგუმენტი:'%s'" -#: aplay/aplay.c:809 speaker-test/speaker-test.c:587 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, c-format msgid "Unable to parse channel map string: %s\n" msgstr "არხების რუკის სტრიქონის დამუშავების შეცდომა: %s\n" -#: aplay/aplay.c:815 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'\n" -#: aplay/aplay.c:831 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "აუდიოს გახსნის პრობლემა: %s" -#: aplay/aplay.c:836 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "ინფორმაციის შეცდომა: %s" -#: aplay/aplay.c:843 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "არაბლოკირებადი პარამეტრის შეცდომა: %s" -#: aplay/aplay.c:861 aplay/aplay.c:985 aplay/aplay.c:1275 aplay/aplay.c:1475 -#: aplay/aplay.c:2055 aplay/aplay.c:2085 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "მეხსიერება საკმარისი არ არის" -#: aplay/aplay.c:885 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "პროცესის ID-ის ფაილის (\"%s\") შექმნის შეცდომა: %s" -#: aplay/aplay.c:975 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "კითხვის შეცდომა (გამოძახებულია ხაზიდან %i)" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "'fmt'-ის ნაწილის უცნობი სიგრძე (წავიკითხე %u, %u მაინც უნდა იყოს)" -#: aplay/aplay.c:1053 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" msgstr "" "გაგრძელებადი 'fmt' ნაწილის უცნობი სიგრძე (წავიკითხე %u, %u მაინც უნდა იყოს)" -#: aplay/aplay.c:1058 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "ფორმატის არასწორი ჭდე გაფართოებად 'fmt' ნაწილში" -#: aplay/aplay.c:1065 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "" -"შეუძლებელია WAVE ფაილის დაკვრა (ფორმატით 0x%04x), რომელიც PCM-ის ან FLOAT-" -"ით არაა კოდირებული" +"შეუძლებელია WAVE ფაილის დაკვრა (ფორმატით 0x%04x), რომელიც PCM-ის ან FLOAT-ით " +"არაა კოდირებული" -#: aplay/aplay.c:1070 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "შეუძლებელია WAVE ფაილის დაკვრა %d აუდიობილიკით" -#: aplay/aplay.c:1078 aplay/aplay.c:1204 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "გაფრთხილება: ფორმატი U8-ზე შეიცვალა\n" -#: aplay/aplay.c:1088 aplay/aplay.c:1101 aplay/aplay.c:1112 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, c-format msgid "Warning: format is changed to %s\n" msgstr "გაფრთხილება: ფორმატი %s-ზე შეიცვალა\n" -#: aplay/aplay.c:1117 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" msgstr "" -" შეუძლებელია WAVE ფაილის დაკვრა სემპლით %d ბიტი, %d ბაიტის სიგანეში (%d " -"არხი)" +" შეუძლებელია WAVE ფაილის დაკვრა სემპლით %d ბიტი, %d ბაიტის სიგანეში (%d არხი)" -#: aplay/aplay.c:1140 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr " შეუძლებელია WAVE ფაილის დაკვრა, %d ბიტიანი სიგანის მქონე სემპლით" -#: aplay/aplay.c:1198 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "გაფრთხილება: ფორმატი MU_LAW-ზე შეიცვალა\n" -#: aplay/aplay.c:1210 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "გაფრთხილება: ფორმატი S16_BE-ზე შეიცვალა\n" -#: aplay/aplay.c:1223 aplay/aplay.c:2376 aplay/aplay.c:2383 aplay/aplay.c:2912 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "გაფრთხილება: ფორმატი MU_LAW-ზე შეიცვალა\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "წაკითხვის შეცდომა" -#: aplay/aplay.c:1253 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "არხების რაოდენობა hw_params და channel_map-ში ერმანეთს არ ემთხვევა" -#: aplay/aplay.c:1262 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "გაფრთხილება: არხების რუკის მიღების შეცდომა\n" -#: aplay/aplay.c:1296 +#: aplay/aplay.c:1337 #, c-format msgid "Channel %d doesn't match with hw_params" msgstr "არხი %d hw_params-ში არსებულს არ ემთხვევა" -#: aplay/aplay.c:1323 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "დაზიანებული კონფიგურაცია ამ PCM-ისთვის: კონფიგურაცია მიუწვდომელია" -#: aplay/aplay.c:1327 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "HW პარამეტრები მოწყობილობისთვის \"%s\".\n" -#: aplay/aplay.c:1347 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "წვდომის ტიპი ხელმიუწვდომელია" -#: aplay/aplay.c:1352 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "სემპლის ფორმატი ხელიმიუწვდომელია" -#: aplay/aplay.c:1358 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "სემპლის ფორმატი ხელიმიუწვდომელია" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "არხების რაოდენობა ხელიუწვდომელია" -#: aplay/aplay.c:1373 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "გაფრთხლება: სიხშირე სწორი არაა (მოთხოვნილი = %iჰც, მივიღე = %iჰც)\n" -#: aplay/aplay.c:1379 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " სცადეთ შეერთოთ დამატება %s\n" -#: aplay/aplay.c:1416 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "აპარატურული პარამეტრების დაყენების შეცდომა:" -#: aplay/aplay.c:1423 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "ბუფერის ზომის ტოლ პერიოდს ვერ გამოვიყენებ (%lu == %lu)" -#: aplay/aplay.c:1429 +#: aplay/aplay.c:1482 msgid "Unable to get current sw params." msgstr "პროგრამის მიმდინარე პარამეტრების მიღების შეცდომა." -#: aplay/aplay.c:1458 +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "პროგრამული პარამეტრების დაყენების შეცდომა:" -#: aplay/aplay.c:1493 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "snd_pcm_mmap_begin -ის პრობლემა: %s" -#: aplay/aplay.c:1522 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "stdin-დან O_NONBLOCK ალმის დაყენების შეცდომა\n" -#: aplay/aplay.c:1559 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "" "\rშეჩერების ბრძანება იგნორირებულია (აპარატურული მხარდაჭერა არ არსებობს)\n" -#: aplay/aplay.c:1567 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "შეჩერების გადაცემის შეცდომა: %s" -#: aplay/aplay.c:1578 -#, c-format -msgid "pause release error: %s" -msgstr "შეჩერების მოხსნის შეცდომა: %s" - -#: aplay/aplay.c:1594 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " @@ -856,100 +932,105 @@ msgstr "" "\r=== შეჩერება " "=== " -#: aplay/aplay.c:1636 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "შეჩერების მოხსნის შეცდომა: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "შეცდომის სტატუსი: %s" -#: aplay/aplay.c:1641 -#, c-format -msgid "fatal %s: %s" -msgstr "გატალური %s: %s" - -#: aplay/aplay.c:1642 aplay/aplay.c:1653 aplay/aplay.c:1656 aplay/aplay.c:1664 -msgid "underrun" -msgstr "არშევსება" - -#: aplay/aplay.c:1642 aplay/aplay.c:1653 aplay/aplay.c:1664 -msgid "overrun" -msgstr "გადავსება" - -#: aplay/aplay.c:1652 aplay/aplay.c:1663 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (სულ ცოტა %.3f მწმ სიგრძით)\n" -#: aplay/aplay.c:1668 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "არშევსება" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "გადავსება" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "სტატუსი:\n" -#: aplay/aplay.c:1672 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "გატალური %s: %s" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "xrun: მომზადების შეცდომა: %s" -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "სტატუსი(DRAINING):\n" -#: aplay/aplay.c:1683 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "ჩასაჭერი ნაკადის ფორმატი შეიცვალა? ვცდილობ აღვდგე....\n" -#: aplay/aplay.c:1685 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "xrun(DRAINING): მომზადების შეცდომა: %s" -#: aplay/aplay.c:1692 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "სტატუსი(R/W):\n" -#: aplay/aplay.c:1695 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "წაკითხვა/ჩაწერის შეცდომა. მდგომარეობა = %s" -#: aplay/aplay.c:1705 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "შეჩერებულია. ვცდილობ, გავაგრძელო. " -#: aplay/aplay.c:1711 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "შეცდომა. ნაკადის გადატვირთვა. " -#: aplay/aplay.c:1714 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "შეჩერება: მომზადების შეცდომა: %s" -#: aplay/aplay.c:1719 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "დასრულდა.\n" -#: aplay/aplay.c:1741 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr " !clip " -#: aplay/aplay.c:1893 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "ბიტის არასწორი ზომა %d.\n" -#: aplay/aplay.c:1929 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "მაქს პიკი (%li სემპლი): 0x%08x " -#: aplay/aplay.c:1970 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " @@ -958,7 +1039,7 @@ msgstr "" "ბუფერის საეჭვო მდებარეობა (%li სულ): ხელმის. = %li, დაყოვნება = %li, ბუფერი " "= %li\n" -#: aplay/aplay.c:1979 +#: aplay/aplay.c:2043 #, c-format msgid "" "Suspicious status buffer position (%li total): avail = %li, delay = %li, " @@ -967,7 +1048,7 @@ msgstr "" "სტატუსის ბუფერის საეჭვო მდებარეობა (%li სულ): ხელმის. = %li, დაყოვნება = " "%li, ბუფერი = %li\n" -#: aplay/aplay.c:1983 +#: aplay/aplay.c:2047 #, c-format msgid "" "Suspicious buffer position avail > delay (%li total): avail = %li, delay = " @@ -976,277 +1057,283 @@ msgstr "" "ბუფერის საეჭვო მდებარეობის ხელმის. > დაყოვნება (%li სულ): ხელმის. = %li, " "დაყოვნება = %li\n" -#: aplay/aplay.c:1987 +#: aplay/aplay.c:2051 #, c-format msgid "" "Suspicious status buffer position avail > delay (%li total): avail = %li, " "delay = %li\n" msgstr "" -"სტატუსის ბუფერის საეჭვო მდებარეობის ხელმის. > დაყოვნება (%li სულ): ხელმის. " -"= %li, დაყოვნება = %li\n" +"სტატუსის ბუფერის საეჭვო მდებარეობის ხელმის. > დაყოვნება (%li სულ): ხელმის. = " +"%li, დაყოვნება = %li\n" -#: aplay/aplay.c:2030 +#: aplay/aplay.c:2094 #, c-format msgid "Status(R/W) (standalone avail=%li delay=%li):\n" msgstr "სტატუსი(R/W) (ხელმისაწვდ=%li დაყოვნება=%li):\n" -#: aplay/aplay.c:2127 +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "ჩაწერის შეცდომა: %s" -#: aplay/aplay.c:2175 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "writev -ის შეცდომა: %s" -#: aplay/aplay.c:2221 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "read -ის შეცდომა: %s" -#: aplay/aplay.c:2268 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "readv -ის შეცდომა: %s" -#: aplay/aplay.c:2317 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "დადუმების ბუფერისთვის მეხსიერების გამოყოფის შეცდომა" -#: aplay/aplay.c:2326 aplay/aplay.c:2554 aplay/aplay.c:2559 aplay/aplay.c:2611 -#: aplay/aplay.c:2620 aplay/aplay.c:2627 aplay/aplay.c:2637 aplay/aplay.c:2643 -#: aplay/aplay.c:2715 aplay/aplay.c:2745 aplay/aplay.c:2759 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "ჩაწერის შეცდომა" -#: aplay/aplay.c:2339 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - დადუმების სეცდომა" -#: aplay/aplay.c:2342 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "voc_pcm_flush -ის შეცდომა" -#: aplay/aplay.c:2367 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "malloc -ის შეცდომა" -#: aplay/aplay.c:2371 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "Creative Labs-ი არხის ფაილის \"%s\"-ის დაკვრა...\n" -#: aplay/aplay.c:2439 aplay/aplay.c:2534 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "შეკუმშული .voc ფაილების დაკვრა შეუძლებელია" -#: aplay/aplay.c:2494 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "მარყუჟების დაკვრის პრობლემა: %s გადახვევადი არაა\n" -#: aplay/aplay.c:2543 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "ბლოკის უცნობი ტიპი %d. მუშაობის დასასრული." -#: aplay/aplay.c:2679 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Waved-ს %s ფორმატის მხარდაჭერა არ გააჩნია..." -#: aplay/aplay.c:2739 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Sparc-ის აუდიოს %s ფორმატის მხარდაჭერა არ გააჩნია..." -#: aplay/aplay.c:2814 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "მიმდინარეობს დაკვრა" -#: aplay/aplay.c:2814 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "ჩაწერა" -#: aplay/aplay.c:2818 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "სიხშირე %d ჰც, " -#: aplay/aplay.c:2820 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "მონო" -#: aplay/aplay.c:2822 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "სტერეო" -#: aplay/aplay.c:2824 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "არხები %i" -#: aplay/aplay.c:3431 +#: aplay/aplay.c:3492 #, c-format msgid "You need to specify %u files" msgstr "საჭიროა %u ფაილის მითითება" -#: aplay/aplay.c:3484 +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "საჭიროა %d ფაილის მითითება" -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - ALSA -ის სეკვენსერთან მიერთების მმართველი\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "(C) 1999-2000 Takashi Iwai, ყველა უფლება დაცულია\n" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "გამოყენება:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * ორ პორტს შორის კავშირი/გათიშვა\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-პარამეტრები] გამგზავნი მიმღები\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " გამგზავნი, მიმღები = კლიენტი:პორტი წყვილებს\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect disconnecგათიშვაt\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive ექსკლუზიური შეერთება\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # რიგში real-time-stamp -ის გარდაქმნა\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # რიგში tick-time-stamp -ის გარდაქმნა\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * მიერთებული პორტების სია (გამოწერის ქმედების გარეშე)\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [-პარამეტრები]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr " -i,--input შეტანის (წაკითხვადი) პორტების სია\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output გამოტანის (ჩაწერადი) პორტების სია\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr " -i,--input შეტანის (წაკითხვადი) პორტების სია\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr " -l,--list თითოეულ პორტზე მიმდინარე შეერთებების სია\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * ყველა გატანილი შეერთების მოცილება\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x, --removeall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "დაკავშირების სამიზნე" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "დაკავშირების წყარო" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, c-format msgid "client %d: '%s' [type=%s" msgstr "კლიენტი %d: '%s' [ტიპი=%s" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "მომხმარებელი" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "ბირთვი" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "სეკვენსერის გახსნის შეცდომა\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "კლიენტის ID-ის მიღების შეცდოა\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "კლიენტის ინფორმაციის დაყენების შეცდომა\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "გამგზავნის მისამართის დაყენების შეცდომა: %s\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:303 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "არასწორი სამიზნე მისამართი: %s\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "გამოწერის გარეშე\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "გათიშვის შეცდომა (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "შეერთება უკვე გამოწერილია\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "შეერთების შეცდომა (%s)\n" @@ -1392,265 +1479,290 @@ msgstr "არხი %2d: ნოტის გამორთვის მოვ msgid "disconnected\n" msgstr "გათიშულია\n" -#: speaker-test/speaker-test.c:120 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "წინა მარცხენა" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "წინა მარჯვენა" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "უკანა მარცხენა" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "უკანა მარკვენა" -#: speaker-test/speaker-test.c:125 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "LFE" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "მარცხენა მხარეს" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "მარჯვენა მხარეს" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "არხი 9" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "არხი 10" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "არხი 11" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "არხი 12" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "არხი 13" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "არხი 14" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "არხი 15" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "არხი 16" -#: speaker-test/speaker-test.c:440 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "დაკვრის კონფიგურაცია დაზიანებულია: კონფიგურაციის გარეშე: %s\n" -#: speaker-test/speaker-test.c:447 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "წვდომის ტიპი დასაკრავად ხელმიუწვდომელია: %s\n" -#: speaker-test/speaker-test.c:454 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "სემპლის ტიპი დასაკრავად ხელმიუწვდომელია: %s\n" -#: speaker-test/speaker-test.c:461 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "არხების რაოდენობა (%i) დასაკრავად ხელმიუწვდომელია: %s\n" -#: speaker-test/speaker-test.c:469 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "სიხშირე %iჰც დასაკრავად მიუწვდომელია: %s\n" -#: speaker-test/speaker-test.c:474 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "სიხშირე არ ემთხვევა (მოთხოვნილი %iჰც, მიღებული %iჰც, შეცდომა %d)\n" -#: speaker-test/speaker-test.c:478 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "სიხშირე დაყენებულია %iჰც-ზე (მოთხოვნილია %iჰც)\n" -#: speaker-test/speaker-test.c:484 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "ბუფერის ზომის დიაპაზონია %lu-დან %lu-მდე\n" -#: speaker-test/speaker-test.c:485 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "" "პერიოდის ზომის დიაპაზონია %lu-დან %lu-მდე\n" "\n" -#: speaker-test/speaker-test.c:487 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "მოთხოვნილი პერიოდის დროა %u მიკროწამი\n" -#: speaker-test/speaker-test.c:490 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "დაკვრისთვის პერიოდის დროდ %u მკწმ-ის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:496 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "მოთხოვნილი ბუფერის დროა %u მიკროწამი\n" -#: speaker-test/speaker-test.c:499 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "დაკვრისთვის ბაფერის დროდ %u მკწმ-ის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:508 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "გამოიყენება ბუფერის მაქსიმალური ზომა %lu\n" -#: speaker-test/speaker-test.c:511 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "დაკვრისთვის ბაფერის ზომად %lu-ის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:517 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "პერიოდები = %u\n" -#: speaker-test/speaker-test.c:520 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "დაკვრისთვის nperiods-ის %u-ზე დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:529 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "დაკვრისთვის აპარატურული პარამეტრების დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:535 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "period_size დაყენებულ იყო= %lu\n" -#: speaker-test/speaker-test.c:536 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "buffer_size დაყენებული იყო = %lu\n" -#: speaker-test/speaker-test.c:538 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "ბაფერი მეტისმეტად პატარაა. ვერ გამოვიყენებ\n" -#: speaker-test/speaker-test.c:551 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "დაკვრისთვის მიმდინარე პროგრამული პარამეტრების დადგენის შეცდომა: %s\n" -#: speaker-test/speaker-test.c:558 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "დაკვრისთვის დასაწყისის ზღვარის რეჟიმის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:565 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "დაკვრისთვის ხელმისაწვდომი მინიმუმის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:572 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "დაკვრისთვის პროგრამული პარამეტრების დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:592 +#: speaker-test/speaker-test.c:621 #, c-format msgid "Unable to set channel map: %s\n" msgstr "არხების რუკის დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "ბაფერის ვერშევსებიდან აღდგენა შეუძლებელია. მომზადების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:628 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "შეჩერებიდან აღდგენა შეუძლებელია. მომზადების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:692 speaker-test/speaker-test.c:1207 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "არასაკმარისი მეხსიერება\n" -#: speaker-test/speaker-test.c:697 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "WAV ფაილის გახსნის შეცდომა: %s\n" -#: speaker-test/speaker-test.c:701 speaker-test/speaker-test.c:730 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "არასწორი WAV ფაილი: %s\n" -#: speaker-test/speaker-test.c:706 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "არასწორი WAV ფაილი: %s\n" -#: speaker-test/speaker-test.c:710 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "WAV ფაილის არასწორი ფორმატი \"%d\" \"%s\"-სთვის\n" -#: speaker-test/speaker-test.c:715 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s მონო ნაკადს არ წარმოადგენს (%d არხი)\n" -#: speaker-test/speaker-test.c:720 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "სემპლინგის სიჩქარე არ ემთხვევა (%d) %s-სთვის\n" -#: speaker-test/speaker-test.c:725 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "სემპლის მხარდაუჭერელი ბიტები (%d) %s-სთვის\n" -#: speaker-test/speaker-test.c:786 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "აღუწერელი არხი %d\n" -#: speaker-test/speaker-test.c:837 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "ჩაწერის შეცდომა: %d,%s\n" -#: speaker-test/speaker-test.c:839 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery -ის შეცდომა: %d,%s\n" -#: speaker-test/speaker-test.c:942 +#: speaker-test/speaker-test.c:938 #, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, fuzzy, c-format +#| msgid "" +#| "Usage: speaker-test [OPTION]... \n" +#| "-h,--help\thelp\n" +#| "-D,--device\tplayback device\n" +#| "-r,--rate\tstream rate in Hz\n" +#| "-c,--channels\tcount of channels in stream\n" +#| "-f,--frequency\tsine wave frequency in Hz\n" +#| "-F,--format\tsample format\n" +#| "-b,--buffer\tring buffer size in us\n" +#| "-p,--period\tperiod size in us\n" +#| "-P,--nperiods\tnumber of periods\n" +#| "-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +#| "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +#| "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +#| "-w,--wavfile\tUse the given WAV file as a test sound\n" +#| "-W,--wavdir\tSpecify the directory containing WAV files\n" +#| "-m,--chmap\tSpecify the channel map to override\n" +#| "-X,--force-frequency\tforce frequencies outside the 30-8000hz range\n" +#| "-S,--scale\tScale of generated test tones in percent (default=80)\n" +#| "\n" msgid "" "Usage: speaker-test [OPTION]... \n" "-h,--help\thelp\n" @@ -1662,7 +1774,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1684,8 +1797,8 @@ msgstr "" "-P,--nperiods\tპერიოდების რიცხვი\n" "-t,--test\tpink=ვარდისფერი ხმაური, sine=სინუსოიდალური ტალღა, wav=WAV ფაილი\n" "-l,--nloops\tსატესტო მარყუჟების რაოდენობა, 0 = უსასრულო\n" -"-s,--speaker\tერთი დინამიკის ტესტი. მნიშვნელობები 1=მარცხენა, 2=მარჯვენა, " -"და ა.შ.\n" +"-s,--speaker\tერთი დინამიკის ტესტი. მნიშვნელობები 1=მარცხენა, 2=მარჯვენა, და " +"ა.შ.\n" "-w,--wavfile\tსატესტო ხმად მითითებული WAV ფაილის გამოყენება\n" "-W,--wavdir\t WAV ფაილების შემცველი საქაღალდე\n" "-m,--chmap\tგადასაფარი არხების რუკა\n" @@ -1693,72 +1806,78 @@ msgstr "" "-S,--scale\tსატესტო ტონების გაძლიერება პროცენტებში (ნაგულისხმები=80)\n" "\n" -#: speaker-test/speaker-test.c:1074 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "პერიოდების არასწორი რიცხვი: %d\n" -#: speaker-test/speaker-test.c:1090 speaker-test/speaker-test.c:1094 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "ტესტის არასწორი ტიპი %s\n" -#: speaker-test/speaker-test.c:1127 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "უცნობი პარამეტრი '%c'\n" -#: speaker-test/speaker-test.c:1141 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "-s პარამეტრის არასწორი მნიშვნელობა.\n" -#: speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "დამკვრელი მოწყობილობაა %s\n" -#: speaker-test/speaker-test.c:1157 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "ნაკადის პარამეტრებია %iჰც, %s, %i არხი\n" -#: speaker-test/speaker-test.c:1160 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "ვარდისფერი ხმაურისთვის 16 ოქტავის გამოყენება\n" -#: speaker-test/speaker-test.c:1163 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "სინუსოიდალური ტალღის სიხშირე %.4fჰც-ა\n" -#: speaker-test/speaker-test.c:1166 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "WAV ფაილ(ებ)-ი\n" -#: speaker-test/speaker-test.c:1176 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "დაკვრის მოწყობილობის გახსნის შეცდომა: %d,%s\n" -#: speaker-test/speaker-test.c:1182 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "აპარატურული პარამეტრების დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:1186 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "პროგრამული პარამეტრების დაყენების შეცდომა: %s\n" -#: speaker-test/speaker-test.c:1232 speaker-test/speaker-test.c:1254 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "გადატანის შეცდომა: %s\n" -#: speaker-test/speaker-test.c:1240 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "დრო თითოეულ პერიოდში = %lf\n" diff --git a/po/ko.po b/po/ko.po index 23b5520..303fcaf 100644 --- a/po/ko.po +++ b/po/ko.po @@ -7,45 +7,57 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.23\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-10 09:07+0100\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2023-05-25 17:58+0900\n" +"Last-Translator: Yi Yunseok \n" "Language-Team: Librezale \n" +"Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" -"Last-Translator: Yi Yunseok \n" "Plural-Forms: nplurals=1; plural=0;\n" -"Language: ko\n" -#: alsamixer/card_select.c:126 alsamixer/device_name.c:126 +#: alsamixer/card_select.c:77 alsamixer/device_name.c:127 msgid "Sound Card" msgstr "사운드 카드" -#: alsamixer/card_select.c:181 +#: alsamixer/card_select.c:115 msgid "(default)" msgstr "(기본)" -#: alsamixer/card_select.c:191 +#: alsamixer/card_select.c:125 msgid "cannot enumerate sound cards" msgstr "사운드 카드를 열거할 수 없음" -#: alsamixer/card_select.c:215 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "장치 이름 입력..." -#: alsamixer/cli.c:40 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "사용법: alsamixer [options]" # capture --> atzemate, hartze, kaptura(tze)...? -#: alsamixer/cli.c:41 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" " -c, --card=NUMBER sound card number or id\n" " -D, --device=NAME mixer device name\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -m, --mouse enable mouse\n" +" -M, --no-mouse disable mouse\n" +" -f, --config=FILE configuration file\n" +" -F, --no-config do not load configuration file\n" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "유용한 옵션:\n" " -h, --help 도움말\n" @@ -53,7 +65,7 @@ msgstr "" " -D, --device=NAME 믹서 장치 이름\n" " -V, --view=MODE 보기 모드 시작: 재생/캡처/모두" -#: alsamixer/cli.c:46 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -63,22 +75,22 @@ msgstr "" " -g, --no-color 색상 사용 전환\n" " -a, --abstraction=NAME 믹서 추상 레벨: 없음/기본" -#: alsamixer/cli.c:77 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "잘못된 카드 인덱스: %s\n" -#: alsamixer/cli.c:103 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "알 수 없는 추상 레벨: %s\n" -#: alsamixer/cli.c:108 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "알 수 없는 옵션: %c\n" -#: alsamixer/cli.c:110 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "`alsamixer --help' 명령으로 더 많은 정보 확인\n" @@ -91,139 +103,139 @@ msgstr "장치 이름:" msgid "%s: %s\n" msgstr "%s: %s\n" -#: alsamixer/mixer_display.c:98 +#: alsamixer/mixer_display.c:99 msgid "Card:" msgstr "카드:" -#: alsamixer/mixer_display.c:99 +#: alsamixer/mixer_display.c:100 msgid "Chip:" msgstr "칩:" -#: alsamixer/mixer_display.c:100 +#: alsamixer/mixer_display.c:101 msgid "View:" msgstr "보기:" -#: alsamixer/mixer_display.c:101 +#: alsamixer/mixer_display.c:102 msgid "Item:" msgstr "도구:" -#: alsamixer/mixer_display.c:104 +#: alsamixer/mixer_display.c:105 msgid "F1: Help" msgstr "F1: 도움말" -#: alsamixer/mixer_display.c:105 +#: alsamixer/mixer_display.c:106 msgid "F2: System information" msgstr "F2: 시스템 정보" -#: alsamixer/mixer_display.c:106 +#: alsamixer/mixer_display.c:107 msgid "F6: Select sound card" msgstr "F6: 사운드 카드 선택" # Esc --> Ihes / Esc -#: alsamixer/mixer_display.c:107 +#: alsamixer/mixer_display.c:108 msgid "Esc: Exit" msgstr "Esc: 나가기" -#: alsamixer/mixer_display.c:174 +#: alsamixer/mixer_display.c:179 msgid "(unplugged)" msgstr "(연결되지 않음)" -#: alsamixer/mixer_display.c:192 +#: alsamixer/mixer_display.c:197 msgid "Playback" msgstr "재생" -#: alsamixer/mixer_display.c:193 +#: alsamixer/mixer_display.c:198 msgid "Capture" msgstr "캡처" -#: alsamixer/mixer_display.c:194 +#: alsamixer/mixer_display.c:199 msgid "All" msgstr "모두" -#: alsamixer/mixer_display.c:234 +#: alsamixer/mixer_display.c:240 msgid "mute" msgstr "음소거" -#: alsamixer/mixer_display.c:275 alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:281 alsamixer/mixer_display.c:291 msgid "dB gain:" msgstr "dB 증폭:" -#: alsamixer/mixer_display.c:285 +#: alsamixer/mixer_display.c:291 #, c-format msgid " [%s %s, %s]" msgstr " [%s %s, %s]" -#: alsamixer/mixer_display.c:294 alsamixer/mixer_display.c:300 -#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:306 +#: alsamixer/mixer_display.c:312 alsamixer/mixer_display.c:318 msgid "Off" msgstr "끄기" -#: alsamixer/mixer_display.c:300 alsamixer/mixer_display.c:312 +#: alsamixer/mixer_display.c:306 alsamixer/mixer_display.c:318 msgid "On" msgstr "켜기" -#: alsamixer/mixer_display.c:363 +#: alsamixer/mixer_display.c:370 msgid "The sound device was unplugged." msgstr "사운드 장치 연결이 해제됐습니다." -#: alsamixer/mixer_display.c:364 +#: alsamixer/mixer_display.c:371 msgid "Press F6 to select another sound card." msgstr "F6을 눌러 다른 사운드 카드를 선택하세요." -#: alsamixer/mixer_display.c:379 +#: alsamixer/mixer_display.c:386 msgid "This sound device does not have any playback controls." msgstr "이 사운드 장치는 재생 제어를 할 수 없습니다." -#: alsamixer/mixer_display.c:381 +#: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." msgstr "이 사운드 장치는 캡처 제어를 할 수 없습니다." -#: alsamixer/mixer_display.c:383 +#: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." msgstr "이 사운드 장치는 제어할 수 없습니다." #. TRANSLATORS: playback on; one character -#: alsamixer/mixer_display.c:516 alsamixer/mixer_display.c:521 +#: alsamixer/mixer_display.c:523 alsamixer/mixer_display.c:528 msgid "O" msgstr "O" #. TRANSLATORS: playback muted; one character -#: alsamixer/mixer_display.c:518 alsamixer/mixer_display.c:522 +#: alsamixer/mixer_display.c:525 alsamixer/mixer_display.c:529 msgid "M" msgstr "M" #. TRANSLATORS: "left"; no more than two characters -#: alsamixer/mixer_display.c:536 +#: alsamixer/mixer_display.c:545 msgid "L" msgstr "L" #. TRANSLATORS: "right"; no more than two characters -#: alsamixer/mixer_display.c:540 +#: alsamixer/mixer_display.c:551 msgid "R" msgstr "R" #. TRANSLATORS: no more than eight characters -#: alsamixer/mixer_display.c:542 +#: alsamixer/mixer_display.c:555 msgid "CAPTURE" msgstr "캡처" -#: alsamixer/mixer_display.c:592 +#: alsamixer/mixer_display.c:611 msgid "Front" msgstr "전면" -#: alsamixer/mixer_display.c:595 +#: alsamixer/mixer_display.c:614 msgid "Rear" msgstr "후면" -#: alsamixer/mixer_display.c:598 speaker-test/speaker-test.c:125 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "중앙" -#: alsamixer/mixer_display.c:601 +#: alsamixer/mixer_display.c:620 msgid "Woofer" msgstr "우퍼" -#: alsamixer/mixer_display.c:604 +#: alsamixer/mixer_display.c:623 msgid "Side" msgstr "측면" @@ -355,11 +367,11 @@ msgstr " 클레멘스 라디쉬(Clemens Ladisch) " msgid "Help" msgstr "도움말" -#: alsamixer/proc_files.c:103 +#: alsamixer/proc_files.c:56 msgid "Select File" msgstr "파일 선택" -#: alsamixer/textbox.c:52 alsamixer/textbox.c:66 +#: alsamixer/textbox.c:51 alsamixer/textbox.c:65 msgid "Error" msgstr "오류" @@ -368,24 +380,73 @@ msgstr "오류" msgid "Cannot open file \"%s\"." msgstr "\"%s\" 파일을 열 수 없습니다." -#: aplay/aplay.c:178 +#: aplay/aplay.c:184 msgid "raw data" msgstr "raw 데이터" -#: aplay/aplay.c:179 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:181 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:182 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "스파크 오디오" -#: aplay/aplay.c:203 -#, c-format +#: aplay/aplay.c:209 +#, fuzzy, c-format +#| msgid "" +#| "Usage: %s [OPTION]... [FILE]...\n" +#| "\n" +#| "-h, --help help\n" +#| " --version print current version\n" +#| "-l, --list-devices list all soundcards and digital audio devices\n" +#| "-L, --list-pcms list device names\n" +#| "-D, --device=NAME select PCM by name\n" +#| "-q, --quiet quiet mode\n" +#| "-t, --file-type TYPE file type (voc, wav, raw or au)\n" +#| "-c, --channels=# channels\n" +#| "-f, --format=FORMAT sample format (case insensitive)\n" +#| "-r, --rate=# sample rate\n" +#| "-d, --duration=# interrupt after # seconds\n" +#| "-s, --samples=# interrupt after # samples per channel\n" +#| "-M, --mmap mmap stream\n" +#| "-N, --nonblock nonblocking mode\n" +#| "-F, --period-time=# distance between interrupts is # microseconds\n" +#| "-B, --buffer-time=# buffer duration is # microseconds\n" +#| " --period-size=# distance between interrupts is # frames\n" +#| " --buffer-size=# buffer duration is # frames\n" +#| "-A, --avail-min=# min available space for wakeup is # microseconds\n" +#| "-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +#| " (relative to buffer size if <= 0)\n" +#| "-T, --stop-delay=# delay for automatic PCM stop is # microseconds " +#| "from xrun\n" +#| "-v, --verbose show PCM structure and setup (accumulative)\n" +#| "-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +#| "-I, --separate-channels one file for each channel\n" +#| "-i, --interactive allow interactive operation from stdin\n" +#| "-m, --chmap=ch1,ch2,.. Give the channel map to override or follow\n" +#| " --disable-resample disable automatic rate resample\n" +#| " --disable-channels disable automatic channel conversions\n" +#| " --disable-format disable automatic format conversions\n" +#| " --disable-softvol disable software volume control (softvol)\n" +#| " --test-position test ring buffer position\n" +#| " --test-coef=# test coefficient for ring buffer position " +#| "(default 8)\n" +#| " expression for validation is: coef * " +#| "(buffer_size / 2)\n" +#| " --test-nowait do not wait for ring buffer - eats whole CPU\n" +#| " --max-file-time=# start another output file when the old file has " +#| "recorded\n" +#| " for this many seconds\n" +#| " --process-id-file write the process ID here\n" +#| " --use-strftime apply the strftime facility to the output file " +#| "name\n" +#| " --dump-hw-params dump hw_params of the device\n" +#| " --fatal-errors treat all errors as fatal\n" msgid "" "Usage: %s [OPTION]... [FILE]...\n" "\n" @@ -398,6 +459,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -431,8 +493,7 @@ msgid "" "recorded\n" " for this many seconds\n" " --process-id-file write the process ID here\n" -" --use-strftime apply the strftime facility to the output file " -"name\n" +" --use-strftime apply the strftime facility to the output file name\n" " --dump-hw-params dump hw_params of the device\n" " --fatal-errors treat all errors as fatal\n" msgstr "" @@ -480,12 +541,12 @@ msgstr "" " --dump-hw-params 장치의 hw_params 덤프\n" " --fatal-errors 모든 오류를 치명적 오류로 취급\n" -#: aplay/aplay.c:248 speaker-test/speaker-test.c:1023 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "인식되는 샘플 형식:" -#: aplay/aplay.c:254 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -494,337 +555,362 @@ msgstr "" "\n" "이 중 일부는 선택한 하드웨어에서 사용 불가능\n" -#: aplay/aplay.c:255 +#: aplay/aplay.c:262 #, c-format msgid "The available format shortcuts are:\n" msgstr "사용 가능한 포맷 단축키:\n" -#: aplay/aplay.c:256 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16비트 리틀 엔디언, 44100, 스테레오)\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16비트 빅 엔디언, 44100, 스테레오)\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16비트 리틀 엔디언, 48000, 스테레오)\n" -#: aplay/aplay.c:272 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "사운드 카드를 찾을 수 없음..." -#: aplay/aplay.c:275 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** %s 하드웨어 장치 목록 ****\n" -#: aplay/aplay.c:304 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "카드 %i: %s [%s], 장치 %i: %s [%s]\n" -#: aplay/aplay.c:310 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " 주변장치: %i/%i\n" -#: aplay/aplay.c:317 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " 주변장치 #%i: %s\n" -#: aplay/aplay.c:398 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "%s 신호로 인해 중단됨...\n" -#: aplay/aplay.c:553 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "명령은 aplay 또는 arecord로 지정해야 함" -#: aplay/aplay.c:597 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "인식할 수 없는 파일 형식 %s" -#: aplay/aplay.c:604 +#: aplay/aplay.c:614 #, c-format msgid "invalid channels argument '%s'" msgstr "잘못된 채널 인수 '%s'" -#: aplay/aplay.c:608 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "채널의 %i 값이 잘못됨" -#: aplay/aplay.c:627 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "잘못된 확장 형식 '%s'" -#: aplay/aplay.c:635 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "잘못된 확장 형식 '%s'" + +#: aplay/aplay.c:657 #, c-format msgid "invalid rate argument '%s'" msgstr "잘못된 속도 인수 '%s'" -#: aplay/aplay.c:642 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "잘못된 속도 값 %i" -#: aplay/aplay.c:648 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "샘플링과 지속시간 인수는 함께 사용할 수 없음" -#: aplay/aplay.c:653 +#: aplay/aplay.c:675 #, c-format msgid "invalid duration argument '%s'" msgstr "잘못된 지속시간 인수 '%s'" -#: aplay/aplay.c:660 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "지속 시간과 샘플링 인수는 함께 사용할 수 없음" -#: aplay/aplay.c:665 +#: aplay/aplay.c:687 #, c-format msgid "invalid samples argument '%s'" msgstr "잘못된 샘플링 인수 '%s'" -#: aplay/aplay.c:677 +#: aplay/aplay.c:699 #, c-format msgid "invalid period time argument '%s'" msgstr "잘못된 주기 시간 인수 '%s'" -#: aplay/aplay.c:684 +#: aplay/aplay.c:706 #, c-format msgid "invalid buffer time argument '%s'" msgstr "잘못된 버퍼 시간 인수 '%s'" -#: aplay/aplay.c:691 +#: aplay/aplay.c:713 #, c-format msgid "invalid period size argument '%s'" msgstr "잘못된 주기 크기 인수 '%s'" -#: aplay/aplay.c:698 +#: aplay/aplay.c:720 #, c-format msgid "invalid buffer size argument '%s'" msgstr "잘못된 버퍼 크기 인수 '%s'" -#: aplay/aplay.c:705 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "잘못된 최소 사용 가능 공간 인수 '%s'" -#: aplay/aplay.c:712 +#: aplay/aplay.c:734 #, c-format msgid "invalid start delay argument '%s'" msgstr "잘못된 시작 지연 인수 '%s'" -#: aplay/aplay.c:719 +#: aplay/aplay.c:741 #, c-format msgid "invalid stop delay argument '%s'" msgstr "잘못된 중지 지연 인수 '%s'" -#: aplay/aplay.c:774 +#: aplay/aplay.c:796 #, c-format msgid "invalid test coef argument '%s'" msgstr "잘못된 테스트 계수 인수 '%s'" -#: aplay/aplay.c:786 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "잘못된 최대 파일 시간 인수 '%s'" -#: aplay/aplay.c:806 speaker-test/speaker-test.c:666 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, c-format msgid "Unable to parse channel map string: %s\n" msgstr "채널 맵 문자열 구문 분석 불가: %s\n" -#: aplay/aplay.c:812 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "`%s --help' 명령으로 더 많은 정보를 확인할 수 있습니다.\n" -#: aplay/aplay.c:828 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "오디오 열기 오류: %s" -#: aplay/aplay.c:833 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "정보 오류: %s" -#: aplay/aplay.c:840 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "비블록 설정 오류: %s" -#: aplay/aplay.c:850 aplay/aplay.c:974 aplay/aplay.c:1264 aplay/aplay.c:1458 -#: aplay/aplay.c:1979 aplay/aplay.c:2009 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "메모리 부족" -#: aplay/aplay.c:874 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "%s 프로세스 ID 파일을 생성할 수 없음: %s" -#: aplay/aplay.c:964 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "읽기 오류 (%i 행에서 호출됨)" -#: aplay/aplay.c:1031 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "알 수 없는 'fmt ' 청크 크기 (%u 읽기는 최소한 %u 값과 같아야 함)" -#: aplay/aplay.c:1042 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" msgstr "" "알 수 없는 'fmt ' 확장 가능 청크 크기 (%u 읽기는 최소한 %u 값과 같아야 함)" -#: aplay/aplay.c:1047 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "잘못된 'fmt ' 확장 가능 청크 포맷 태그" -#: aplay/aplay.c:1054 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" msgstr "재생할 수 없는 PCM 또는 FLOAT로 인코딩되지 않은 WAVE 파일 형식 0x%04x" -#: aplay/aplay.c:1059 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "%d 트랙의 WAVE 파일 재생 불가" -#: aplay/aplay.c:1067 aplay/aplay.c:1193 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "주의: 형식이 U8로 변경됨\n" -#: aplay/aplay.c:1077 aplay/aplay.c:1090 aplay/aplay.c:1101 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, c-format msgid "Warning: format is changed to %s\n" msgstr "주의: 형식이 %s로 변경됨\n" -#: aplay/aplay.c:1106 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" msgstr " %d 바이트 폭에서 %d 비트 WAVE 샘플 파일 재생 불가 (%d 채널)" -#: aplay/aplay.c:1129 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr " %d 비트 폭의 WAVE 샘플 파일 재생 불가" -#: aplay/aplay.c:1187 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "주의: 포맷이 MU_LAW로 변경됨\n" -#: aplay/aplay.c:1199 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "주의: 포맷이 S16_BE로 변경됨\n" -#: aplay/aplay.c:1212 aplay/aplay.c:2294 aplay/aplay.c:2301 aplay/aplay.c:2831 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "주의: 포맷이 MU_LAW로 변경됨\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "읽기 오류" -#: aplay/aplay.c:1242 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "채널 맵과 hw_param 간 채널 번호가 일치하지 않음" -#: aplay/aplay.c:1251 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "주의: 채널 맵을 가져올 수 없음\n" -#: aplay/aplay.c:1284 -#, c-format -msgid "Channel %d doesn't match with hw_parmas" +#: aplay/aplay.c:1337 +#, fuzzy, c-format +#| msgid "Channel %d doesn't match with hw_parmas" +msgid "Channel %d doesn't match with hw_params" msgstr "채널 %d 및 hw_params가 일치하지 않음" -#: aplay/aplay.c:1310 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "손상된 PCM 구성: 사용 가능한 구성이 없음" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "\"%s\" 장치의 하드웨어 매개변수:\n" -#: aplay/aplay.c:1334 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "액세스 유형을 사용할 수 없음" -#: aplay/aplay.c:1339 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "사용할 수 없는 샘플 형식" -#: aplay/aplay.c:1345 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "사용할 수 없는 샘플 형식" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "채널 수를 사용할 수 없음" -#: aplay/aplay.c:1360 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "주의: 정확하지 않은 속도 (요청됨 = %iHz, 가져옴 = %iHz)\n" -#: aplay/aplay.c:1366 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " %s 플러그인을 연결해야 함\n" -#: aplay/aplay.c:1403 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "하드웨어 매개변수 설치 불가:" -#: aplay/aplay.c:1410 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "버퍼 크기와 같은 주기는 사용할 수 없음 (%lu == %lu)" -#: aplay/aplay.c:1441 +#: aplay/aplay.c:1482 +#, fuzzy +#| msgid "unable to install sw params:" +msgid "Unable to get current sw params." +msgstr "소프트웨어 매개변수 설치 불가:" + +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "소프트웨어 매개변수 설치 불가:" -#: aplay/aplay.c:1476 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "snd_pcm_mmap_begin 문제: %s" -#: aplay/aplay.c:1505 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "stdin O_NONBLOCK 플래그 설정 실패\n" -#: aplay/aplay.c:1529 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "\r일시정지 명령이 무시됨 (하드웨어 지원 없음)\n" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "일시정지 푸시 오류: %s" -#: aplay/aplay.c:1548 -#, c-format -msgid "pause release error: %s" -msgstr "일시정지 릴리즈 오류: %s" - -#: aplay/aplay.c:1564 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " @@ -832,746 +918,840 @@ msgstr "" "\r=== 일시정지 " "=== " -#: aplay/aplay.c:1606 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "일시정지 릴리즈 오류: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "상태 오류: %s" -#: aplay/aplay.c:1611 -#, c-format -msgid "fatal %s: %s" -msgstr "치명적인 %s: %s" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1626 aplay/aplay.c:1634 -msgid "underrun" -msgstr "언더런" - -#: aplay/aplay.c:1612 aplay/aplay.c:1623 aplay/aplay.c:1634 -msgid "overrun" -msgstr "오버런" - -#: aplay/aplay.c:1622 aplay/aplay.c:1633 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (최소 %.3f ms 길이)\n" -#: aplay/aplay.c:1638 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "언더런" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "오버런" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "상태:\n" -#: aplay/aplay.c:1642 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "치명적인 %s: %s" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "xrun: 준비 오류: %s" -#: aplay/aplay.c:1648 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "상태(사용 중):\n" -#: aplay/aplay.c:1652 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "스트림 형식 캡처가 변경됐나요? 복구를 시도합니다...\n" -#: aplay/aplay.c:1654 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "xrun(사용 중): 준비 오류: %s" -#: aplay/aplay.c:1661 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "상태(R/W):\n" -#: aplay/aplay.c:1664 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "읽기/쓰기 오류, 상태 = %s" -#: aplay/aplay.c:1674 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "중지됨. 재개합니다. " -#: aplay/aplay.c:1679 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "실패. 스트림을 재개합니다. " -#: aplay/aplay.c:1681 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "중지됨: 준비 오류: %s" -#: aplay/aplay.c:1686 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "완료.\n" -#: aplay/aplay.c:1708 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr " !클립 " -#: aplay/aplay.c:1855 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "지원되지 않는 비트 크기 %d.\n" -#: aplay/aplay.c:1889 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "최대 피크 (%li 샘플): 0x%08x " -#: aplay/aplay.c:1923 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " "%li\n" msgstr "의심스러운 버퍼 위치 (%li 전체): 가능 = %li, 지연 = %li, 버퍼 = %li\n" +#: aplay/aplay.c:2043 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "의심스러운 버퍼 위치 (%li 전체): 가능 = %li, 지연 = %li, 버퍼 = %li\n" + +#: aplay/aplay.c:2047 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "의심스러운 버퍼 위치 (%li 전체): 가능 = %li, 지연 = %li, 버퍼 = %li\n" + #: aplay/aplay.c:2051 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "의심스러운 버퍼 위치 (%li 전체): 가능 = %li, 지연 = %li, 버퍼 = %li\n" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "쓰기 오류: %s" -#: aplay/aplay.c:2099 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "쓰기 오류: %s" -#: aplay/aplay.c:2143 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "읽기 오류: %s" -#: aplay/aplay.c:2187 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "읽기 오류: %s" -#: aplay/aplay.c:2235 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "무음 버퍼를 할당할 수 없음" -#: aplay/aplay.c:2244 aplay/aplay.c:2472 aplay/aplay.c:2477 aplay/aplay.c:2527 -#: aplay/aplay.c:2536 aplay/aplay.c:2543 aplay/aplay.c:2553 aplay/aplay.c:2559 -#: aplay/aplay.c:2631 aplay/aplay.c:2661 aplay/aplay.c:2675 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "쓰기 오류" -#: aplay/aplay.c:2257 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - 무음 오류" -#: aplay/aplay.c:2260 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "voc_pcm_flush 오류" -#: aplay/aplay.c:2285 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "malloc 오류" -#: aplay/aplay.c:2289 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "크리에이티브 랩스 채널 파일 '%s' 재생 중...\n" -#: aplay/aplay.c:2357 aplay/aplay.c:2452 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "압축된 .voc 파일은 재생 불가" -#: aplay/aplay.c:2412 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "루프 재생 불가; %s 찾을 수 없음\n" -#: aplay/aplay.c:2461 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "알 수 없는 블록 유형 %d. 끝냅니다." -#: aplay/aplay.c:2595 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Wave는 %s 형식을 지원하지 않습니다..." -#: aplay/aplay.c:2655 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "스파크 오디오는 %s 형식을 지원하지 않습니다..." -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "재생 중" -#: aplay/aplay.c:2736 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "녹음 중" -#: aplay/aplay.c:2740 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "%d Hz 속도, " -#: aplay/aplay.c:2742 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "모노" -#: aplay/aplay.c:2744 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "스테레오" -#: aplay/aplay.c:2746 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "채널 %i" -#: aplay/aplay.c:3344 aplay/aplay.c:3397 +#: aplay/aplay.c:3492 +#, fuzzy, c-format +#| msgid "You need to specify %d files" +msgid "You need to specify %u files" +msgstr "%d 파일을 지정해야 함" + +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "%d 파일을 지정해야 함" -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - ALSA 시퀀서 연결 매니저\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "Copyright (C) 1999-2000 Takashi Iwai\n" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * 두 포트 간에 연결/해제\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-options] sender receiver\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " sender, receiver = 클라이언트:포트 연결\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect 연결 해제\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive 단독 연결\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # 대기열의 실시간 스탬프 변환\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # 대기열의 틱-타임 스팸프 변환\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * 연결된 포트 목록 (수신 행동 없음)\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [-options]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr " -i,--input 인풋 (읽을 수 있는) 포트 목록\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr " -o,--output 아웃풋 (쓸 수 있는) 포트\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr " -i,--input 인풋 (읽을 수 있는) 포트 목록\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr " -l,--list 각 포트에 현재 연결한 목록\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * 내보낸 모든 연결 제거\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x, --removeall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "다음으로 연결 중" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "다음에 연결됨" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, c-format msgid "client %d: '%s' [type=%s" msgstr "클라이언트 %d: '%s' [유형=%s" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "사용자" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "커널" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "시퀀서를 열 수 없음\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "클라이언트 id를 가져올 수 없음\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "클라이언트 정보를 설정할 수 없음\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "잘못된 전달 주소 %s\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "잘못된 대상 주소 %s\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "수신을 찾을 수 없음\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "연결 해제 실패 (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "이미 수신 중인 연결\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "연결 실패 (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - ALSA 시퀀서 네트워크 클라이언트/서버\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr " Copyright (C) 1999 Takashi Iwai\n" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "사용법:\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " 서버 모드: aseqnet [-options]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " 클라이언트 모드: aseqnet [-options] server_host\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "옵션:\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : TCP 포트 지정 (서비스 이름 또는 숫자)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr " -s,--source addr : 주어진 주소(addr)로부터 읽음 (클라이언트:포트)\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest addr : 주어진 주소(addr)로 쓰기 (클라이언트:포트)\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v, --verbose : 자세한 메시지 출력\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i, --info : 수신된 특정 이벤트 출력\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "malloc 불가\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "파일 닫는 중..\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "시퀀서 열림: %d:%d\n" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "잘못된 소스 주소 %s\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "/etc/services에서 서비스 '%s'를 찾을 수 없음 \n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "가져올 수 없는 주소 %s\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "다음으로 연결 중" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "연결이 너무 많아요!\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "승인됨[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "가져올 수 없는 주소 %s\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "확인.. 연결됨\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "채널 %2d: 제어 이벤트 : %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "채널 %2d: 피치밴더 : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "채널 %2d: 노트 온 이벤트 : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "채널 %2d: 노트 오프 이벤트: %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "연결 해제됨\n" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "왼쪽 전면" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "오른쪽 전면" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "왼쪽 후면" -#: speaker-test/speaker-test.c:124 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "오른쪽 후면" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "LFE" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "왼쪽 측면" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "오른쪽 측면" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "채널 9" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "채널 10" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "채널 11" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "채널 12" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "채널 13" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "채널 14" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "채널 15" -#: speaker-test/speaker-test.c:136 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "채널 16" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "손상된 재생 구성: 사용 가능한 구성 없음: %s\n" -#: speaker-test/speaker-test.c:526 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "재생에 사용할 수 없는 액세스 유형: %s\n" -#: speaker-test/speaker-test.c:533 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "재생에 사용할 수 없는 샘플 형식: %s\n" -#: speaker-test/speaker-test.c:540 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "재생에 사용할 수 없는 채널 수(%i): %s\n" -#: speaker-test/speaker-test.c:548 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "재생에 사용할 수 없는 %iHz 샘플링 속도: %s\n" -#: speaker-test/speaker-test.c:553 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "속도가 일치하지 않음 (%iHz 요청됨, %iHz 가져옴, 오류 %d)\n" -#: speaker-test/speaker-test.c:557 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "속도를 %iHz로 설정 (%iHz 요청됨)\n" -#: speaker-test/speaker-test.c:563 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "%lu에서 %lu로 보내는 버퍼 크기 범위\n" -#: speaker-test/speaker-test.c:564 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "%lu에서 %lu로 보내는 주기 크기 범위\n" -#: speaker-test/speaker-test.c:566 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "요청된 주기 시간 %u us\n" -#: speaker-test/speaker-test.c:569 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "재생에 %u us 주기 시간 설정 불가: %s\n" -#: speaker-test/speaker-test.c:575 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "요청된 버퍼 시간 %u us\n" -#: speaker-test/speaker-test.c:578 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "재생에 %u us 버퍼 시간 적용 불가: %s\n" -#: speaker-test/speaker-test.c:587 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "최대 버퍼 크기 %lu 사용함\n" -#: speaker-test/speaker-test.c:590 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "재생에 버퍼 크기 %lu 설정 불가: %s\n" -#: speaker-test/speaker-test.c:596 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "주기 = %u\n" -#: speaker-test/speaker-test.c:599 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "재생에 nperiods %u 사용 불가: %s\n" -#: speaker-test/speaker-test.c:608 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "재생에 하드웨어 매개변수 사용 불가: %s\n" -#: speaker-test/speaker-test.c:614 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "설정된 period_size = %lu\n" -#: speaker-test/speaker-test.c:615 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "설정된 buffer_size = %lu\n" -#: speaker-test/speaker-test.c:617 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "버퍼가 작아 사용할 수 없음\n" -#: speaker-test/speaker-test.c:630 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "재생을 위한 현재 swparams 확인 불가: %s\n" -#: speaker-test/speaker-test.c:637 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "" "재생을 위한 시작 임계값 모드 설정 불가: %s\n" "\n" -#: speaker-test/speaker-test.c:644 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "재생을 위한 최소 효력을 설정할 수 없음: %s\n" -#: speaker-test/speaker-test.c:651 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "재생을 위한 소프트웨어 매개변수를 설정할 수 없음: %s\n" -#: speaker-test/speaker-test.c:671 +#: speaker-test/speaker-test.c:621 #, c-format msgid "Unable to set channel map: %s\n" msgstr "채널 맵을 설정할 수 없음: %s\n" -#: speaker-test/speaker-test.c:696 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "언더런에서 복구할 수 없음, 준비 실패: %s\n" -#: speaker-test/speaker-test.c:707 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "중지 상태에서 복구할 수 없음, 준비 실패: %s\n" -#: speaker-test/speaker-test.c:771 speaker-test/speaker-test.c:1272 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "메모리 부족\n" -#: speaker-test/speaker-test.c:776 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "%s WAV 파일을 열 수 없음\n" -#: speaker-test/speaker-test.c:780 speaker-test/speaker-test.c:809 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "잘못된 WAV 파일 %s\n" -#: speaker-test/speaker-test.c:785 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "WAV 파일이 아님: %s\n" -#: speaker-test/speaker-test.c:789 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "%d WAV 형식은 %s에 지원되지 않음\n" -#: speaker-test/speaker-test.c:794 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s(은)는 모노 스트림이 아님 (%d 채널)\n" -#: speaker-test/speaker-test.c:799 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "샘플링 속도 (%d)가 %s와 일치하지 않음 \n" -#: speaker-test/speaker-test.c:804 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "샘플 형식 비트 %d가 %s에 지원되지 않음\n" -#: speaker-test/speaker-test.c:865 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "정의되지 않은 채널 %d\n" -#: speaker-test/speaker-test.c:916 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "쓰기 오류: %d,%s\n" -#: speaker-test/speaker-test.c:918 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery 실패: %d,%s\n" -#: speaker-test/speaker-test.c:1004 +#: speaker-test/speaker-test.c:938 #, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, fuzzy, c-format +#| msgid "" +#| "Usage: speaker-test [OPTION]... \n" +#| "-h,--help\thelp\n" +#| "-D,--device\tplayback device\n" +#| "-r,--rate\tstream rate in Hz\n" +#| "-c,--channels\tcount of channels in stream\n" +#| "-f,--frequency\tsine wave frequency in Hz\n" +#| "-F,--format\tsample format\n" +#| "-b,--buffer\tring buffer size in us\n" +#| "-p,--period\tperiod size in us\n" +#| "-P,--nperiods\tnumber of periods\n" +#| "-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +#| "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +#| "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +#| "-w,--wavfile\tUse the given WAV file as a test sound\n" +#| "-W,--wavdir\tSpecify the directory containing WAV files\n" +#| "-m,--chmap\tSpecify the channel map to override\n" +#| "-X,--force-frequency\tforce frequencies outside the 30-8000hz range\n" +#| "-S,--scale\tScale of generated test tones in percent (default=80)\n" +#| "\n" msgid "" "Usage: speaker-test [OPTION]... \n" "-h,--help\thelp\n" @@ -1583,7 +1763,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1613,72 +1794,82 @@ msgstr "" "-S,--scale\t생성된 테스트 톤의 크기 비율 (기본값=80)\n" "\n" -#: speaker-test/speaker-test.c:1136 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "유효하지 않은 주기 %d\n" -#: speaker-test/speaker-test.c:1152 speaker-test/speaker-test.c:1156 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "잘못된 테스트 유형 %s\n" -#: speaker-test/speaker-test.c:1189 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "알 수 없는 옵션 '%c'\n" -#: speaker-test/speaker-test.c:1203 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "-s 옵션 매개변수가 잘못됐습니다.\n" -#: speaker-test/speaker-test.c:1218 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "재생 장치 %s\n" -#: speaker-test/speaker-test.c:1219 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "스트림 매개변수 %iHz, %s, %i 채널\n" -#: speaker-test/speaker-test.c:1222 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "16 옥타브의 핑크 노이즈 사용\n" -#: speaker-test/speaker-test.c:1225 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "%.4fHz 사인(Sine)파 속도\n" -#: speaker-test/speaker-test.c:1228 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "WAV 파일\n" -#: speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "재생 열기 오류: %d,%s\n" -#: speaker-test/speaker-test.c:1244 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "매개변수 hwparams 설정 실패: %s\n" -#: speaker-test/speaker-test.c:1248 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "매개변수 swparams 설정 실패: %s\n" -#: speaker-test/speaker-test.c:1295 speaker-test/speaker-test.c:1317 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "전송 실패함: %s\n" -#: speaker-test/speaker-test.c:1303 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "주기별 시간 = %lf\n" + +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "/etc/services에서 서비스 '%s'를 찾을 수 없음 \n" diff --git a/po/sk.po b/po/sk.po index 213fc39..9f2827e 100644 --- a/po/sk.po +++ b/po/sk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: alsa-utils 1.0.23\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-18 14:55+0200\n" +"POT-Creation-Date: 2026-03-19 16:41+0800\n" "PO-Revision-Date: 2020-10-18 15:13+0200\n" "Last-Translator: Jose Riha \n" "Language-Team: Slovak\n" @@ -29,15 +29,26 @@ msgstr "(predvolená)" msgid "cannot enumerate sound cards" msgstr "Chyba počas vyčíslovania zvukových kariet" -#: alsamixer/card_select.c:147 +#: alsamixer/card_select.c:151 msgid "enter device name..." msgstr "zadajte názov zariadenia..." -#: alsamixer/cli.c:43 +#: alsamixer/cli.c:45 msgid "Usage: alsamixer [options]" msgstr "Použitie: alsamixer [možnosti]" -#: alsamixer/cli.c:44 +#: alsamixer/cli.c:46 +#, fuzzy +#| msgid "" +#| "Useful options:\n" +#| " -h, --help this help\n" +#| " -c, --card=NUMBER sound card number or id\n" +#| " -D, --device=NAME mixer device name\n" +#| " -m, --mouse enable mouse\n" +#| " -M, --no-mouse disable mouse\n" +#| " -f, --config=FILE configuration file\n" +#| " -F, --no-config do not load configuration file\n" +#| " -V, --view=MODE starting view mode: playback/capture/all" msgid "" "Useful options:\n" " -h, --help this help\n" @@ -47,7 +58,8 @@ msgid "" " -M, --no-mouse disable mouse\n" " -f, --config=FILE configuration file\n" " -F, --no-config do not load configuration file\n" -" -V, --view=MODE starting view mode: playback/capture/all" +" -V, --view=MODE starting view mode: playback/capture/all\n" +" -B, --black-background use black background color" msgstr "" "Užitočné možnosti:\n" " -h, --help tento pomocník\n" @@ -57,9 +69,10 @@ msgstr "" " -M, --no-mouse vypnúť myš\n" " -f, --config=SÚBOR súbor s konfiguráciou\n" " -F, --no-config nenačítať súbor s konfiguráciou\n" -" -V, --view=REŽIM spustiť v režime zobrazenia: playback/capture/all (prehrávanie/záznam/všetko)" +" -V, --view=REŽIM spustiť v režime zobrazenia: playback/capture/all " +"(prehrávanie/záznam/všetko)" -#: alsamixer/cli.c:53 +#: alsamixer/cli.c:56 msgid "" "Debugging options:\n" " -g, --no-color toggle using of colors\n" @@ -69,22 +82,22 @@ msgstr "" " -g, --no-color bez farby\n" " -a, --abstraction=NÁZOV úroveň abstrakcie mixéra: none/basic" -#: alsamixer/cli.c:88 +#: alsamixer/cli.c:92 #, c-format msgid "invalid card index: %s\n" msgstr "neplatné číslo karty: %s\n" -#: alsamixer/cli.c:126 +#: alsamixer/cli.c:137 #, c-format msgid "unknown abstraction level: %s\n" msgstr "neznáma úroveň abstrakcie: %s\n" -#: alsamixer/cli.c:131 +#: alsamixer/cli.c:142 #, c-format msgid "unknown option: %c\n" msgstr "neznáma voľba: %c\n" -#: alsamixer/cli.c:133 +#: alsamixer/cli.c:144 msgid "try `alsamixer --help' for more information\n" msgstr "skúste `alsamixer --help' pre viac informácií\n" @@ -181,7 +194,8 @@ msgstr "Toto zvukové zariadenie neposkytuje ovládacie prvky pre prehrávanie." #: alsamixer/mixer_display.c:388 msgid "This sound device does not have any capture controls." -msgstr "Toto zvukové zariadenie neposkytuje ovládacie prvky pre zaznamenávanie." +msgstr "" +"Toto zvukové zariadenie neposkytuje ovládacie prvky pre zaznamenávanie." #: alsamixer/mixer_display.c:390 msgid "This sound device does not have any controls." @@ -220,7 +234,7 @@ msgstr "Predné" msgid "Rear" msgstr "Zadné" -#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:124 +#: alsamixer/mixer_display.c:617 speaker-test/speaker-test.c:134 msgid "Center" msgstr "Stredné" @@ -373,24 +387,73 @@ msgstr "Chyba" msgid "Cannot open file \"%s\"." msgstr "Chyba pri otváraní súboru \"%s\"." -#: aplay/aplay.c:180 +#: aplay/aplay.c:184 msgid "raw data" msgstr "surové dáta" -#: aplay/aplay.c:181 +#: aplay/aplay.c:185 msgid "VOC" msgstr "VOC" -#: aplay/aplay.c:183 +#: aplay/aplay.c:187 msgid "WAVE" msgstr "WAVE" -#: aplay/aplay.c:184 +#: aplay/aplay.c:188 msgid "Sparc Audio" msgstr "Sparc-Audio" -#: aplay/aplay.c:205 -#, c-format +#: aplay/aplay.c:209 +#, fuzzy, c-format +#| msgid "" +#| "Usage: %s [OPTION]... [FILE]...\n" +#| "\n" +#| "-h, --help help\n" +#| " --version print current version\n" +#| "-l, --list-devices list all soundcards and digital audio devices\n" +#| "-L, --list-pcms list device names\n" +#| "-D, --device=NAME select PCM by name\n" +#| "-q, --quiet quiet mode\n" +#| "-t, --file-type TYPE file type (voc, wav, raw or au)\n" +#| "-c, --channels=# channels\n" +#| "-f, --format=FORMAT sample format (case insensitive)\n" +#| "-r, --rate=# sample rate\n" +#| "-d, --duration=# interrupt after # seconds\n" +#| "-s, --samples=# interrupt after # samples per channel\n" +#| "-M, --mmap mmap stream\n" +#| "-N, --nonblock nonblocking mode\n" +#| "-F, --period-time=# distance between interrupts is # microseconds\n" +#| "-B, --buffer-time=# buffer duration is # microseconds\n" +#| " --period-size=# distance between interrupts is # frames\n" +#| " --buffer-size=# buffer duration is # frames\n" +#| "-A, --avail-min=# min available space for wakeup is # microseconds\n" +#| "-R, --start-delay=# delay for automatic PCM start is # microseconds \n" +#| " (relative to buffer size if <= 0)\n" +#| "-T, --stop-delay=# delay for automatic PCM stop is # microseconds " +#| "from xrun\n" +#| "-v, --verbose show PCM structure and setup (accumulative)\n" +#| "-V, --vumeter=TYPE enable VU meter (TYPE: mono or stereo)\n" +#| "-I, --separate-channels one file for each channel\n" +#| "-i, --interactive allow interactive operation from stdin\n" +#| "-m, --chmap=ch1,ch2,.. Give the channel map to override or follow\n" +#| " --disable-resample disable automatic rate resample\n" +#| " --disable-channels disable automatic channel conversions\n" +#| " --disable-format disable automatic format conversions\n" +#| " --disable-softvol disable software volume control (softvol)\n" +#| " --test-position test ring buffer position\n" +#| " --test-coef=# test coefficient for ring buffer position " +#| "(default 8)\n" +#| " expression for validation is: coef * " +#| "(buffer_size / 2)\n" +#| " --test-nowait do not wait for ring buffer - eats whole CPU\n" +#| " --max-file-time=# start another output file when the old file has " +#| "recorded\n" +#| " for this many seconds\n" +#| " --process-id-file write the process ID here\n" +#| " --use-strftime apply the strftime facility to the output file " +#| "name\n" +#| " --dump-hw-params dump hw_params of the device\n" +#| " --fatal-errors treat all errors as fatal\n" msgid "" "Usage: %s [OPTION]... [FILE]...\n" "\n" @@ -403,6 +466,7 @@ msgid "" "-t, --file-type TYPE file type (voc, wav, raw or au)\n" "-c, --channels=# channels\n" "-f, --format=FORMAT sample format (case insensitive)\n" +" --subformat=SUBFORMAT sample subformat (case insensitive)\n" "-r, --rate=# sample rate\n" "-d, --duration=# interrupt after # seconds\n" "-s, --samples=# interrupt after # samples per channel\n" @@ -436,8 +500,7 @@ msgid "" "recorded\n" " for this many seconds\n" " --process-id-file write the process ID here\n" -" --use-strftime apply the strftime facility to the output file " -"name\n" +" --use-strftime apply the strftime facility to the output file name\n" " --dump-hw-params dump hw_params of the device\n" " --fatal-errors treat all errors as fatal\n" msgstr "" @@ -491,16 +554,15 @@ msgstr "" "aktuálnom súbore zaznamenaných # sekúnd\n" " --process-id-file zapísať číslo procesu do súboru\n" " --use-strftime formátovať názov súboru funkciou strftime\n" -" --dump-hw-params vypísať hardvérové parametre (hw_params) " -"zariadenia\n" +" --dump-hw-params vypísať hardvérové parametre (hw_params) zariadenia\n" " --fatal-errors všetky chyby vyhodnotiť ako závažné\n" -#: aplay/aplay.c:250 speaker-test/speaker-test.c:945 +#: aplay/aplay.c:255 speaker-test/speaker-test.c:1001 #, c-format msgid "Recognized sample formats are:" msgstr "Podporované formáty vzorkovania sú:" -#: aplay/aplay.c:256 +#: aplay/aplay.c:261 #, c-format msgid "" "\n" @@ -509,229 +571,242 @@ msgstr "" "\n" "Niektoré z nich nemusia byť dostupné na vybranom hardvéri.\n" -#: aplay/aplay.c:257 +#: aplay/aplay.c:262 #, c-format msgid "The available format shortcuts are:\n" msgstr "Dostupné skratky formátov sú:\n" -#: aplay/aplay.c:258 +#: aplay/aplay.c:263 #, c-format msgid "-f cd (16 bit little endian, 44100, stereo)\n" msgstr "-f cd (16 bitov, Little Endian, 44100 Hz, stereo)\n" -#: aplay/aplay.c:259 +#: aplay/aplay.c:264 #, c-format msgid "-f cdr (16 bit big endian, 44100, stereo)\n" msgstr "-f cdr (16 bitov, Big Endian, 44100 Hz, stereo)\n" -#: aplay/aplay.c:260 +#: aplay/aplay.c:265 #, c-format msgid "-f dat (16 bit little endian, 48000, stereo)\n" msgstr "-f dat (16 bitov, Little Endian, 48000 Hz, stereo)\n" -#: aplay/aplay.c:274 +#: aplay/aplay.c:279 msgid "no soundcards found..." msgstr "neboli nájdené žiadne zvukové karty..." -#: aplay/aplay.c:277 +#: aplay/aplay.c:282 #, c-format msgid "**** List of %s Hardware Devices ****\n" msgstr "**** Zoznam hardvérových zariadení (%s) ****\n" -#: aplay/aplay.c:306 +#: aplay/aplay.c:311 #, c-format msgid "card %i: %s [%s], device %i: %s [%s]\n" msgstr "karta %i: %s [%s], zariadenie %i: %s [%s]\n" -#: aplay/aplay.c:312 +#: aplay/aplay.c:317 #, c-format msgid " Subdevices: %i/%i\n" msgstr " Podriadené zariadenia: %i/%i\n" -#: aplay/aplay.c:319 +#: aplay/aplay.c:324 #, c-format msgid " Subdevice #%i: %s\n" msgstr " Podriadené zariadenie #%i: %s\n" -#: aplay/aplay.c:400 +#: aplay/aplay.c:405 #, c-format msgid "Aborted by signal %s...\n" msgstr "Zrušené signálom %s ...\n" -#: aplay/aplay.c:555 +#: aplay/aplay.c:562 msgid "command should be named either arecord or aplay" msgstr "príkaz by sa mal volať buď arecord alebo aplay" -#: aplay/aplay.c:599 +#: aplay/aplay.c:607 #, c-format msgid "unrecognized file format %s" msgstr "nerozpoznaný formát súboru %s" -#: aplay/aplay.c:606 +#: aplay/aplay.c:614 #, c-format msgid "invalid channels argument '%s'" msgstr "neplatný argument kanála '%s'" -#: aplay/aplay.c:610 +#: aplay/aplay.c:618 #, c-format msgid "value %i for channels is invalid" msgstr "hodnota %i pre kanále je neplatná" -#: aplay/aplay.c:629 +#: aplay/aplay.c:638 #, c-format msgid "wrong extended format '%s'" msgstr "neplatný rozšírený formát '%s'" -#: aplay/aplay.c:637 +#: aplay/aplay.c:650 +#, fuzzy, c-format +#| msgid "wrong extended format '%s'" +msgid "wrong extended subformat '%s'" +msgstr "neplatný rozšírený formát '%s'" + +#: aplay/aplay.c:657 #, c-format msgid "invalid rate argument '%s'" msgstr "neplatný argument frekvencie '%s'" -#: aplay/aplay.c:644 +#: aplay/aplay.c:664 #, c-format msgid "bad speed value %i" msgstr "nesprávna hodnota rýchlosti %i" -#: aplay/aplay.c:650 +#: aplay/aplay.c:670 msgid "duration and samples arguments cannot be used together" msgstr "argumenty pre trvanie a počet vzoriek nesmú byť použité spolu" -#: aplay/aplay.c:655 +#: aplay/aplay.c:675 #, c-format msgid "invalid duration argument '%s'" msgstr "neplatný argument trvania '%s'" -#: aplay/aplay.c:662 +#: aplay/aplay.c:682 msgid "samples and duration arguments cannot be used together" msgstr "argumenty pre počet vzoriek a trvanie nesmú byť použité spolu" -#: aplay/aplay.c:667 +#: aplay/aplay.c:687 #, c-format msgid "invalid samples argument '%s'" msgstr "neplatný argument vzoriek '%s'" -#: aplay/aplay.c:679 +#: aplay/aplay.c:699 #, c-format msgid "invalid period time argument '%s'" msgstr "neplatný argument času periódy '%s'" -#: aplay/aplay.c:686 +#: aplay/aplay.c:706 #, c-format msgid "invalid buffer time argument '%s'" msgstr "neplatný argument času vyrovnávacej pamäte '%s'" -#: aplay/aplay.c:693 +#: aplay/aplay.c:713 #, c-format msgid "invalid period size argument '%s'" msgstr "neplatný argument veľkosti periódy '%s'" -#: aplay/aplay.c:700 +#: aplay/aplay.c:720 #, c-format msgid "invalid buffer size argument '%s'" msgstr "neplatný argument veľkosti vyrovnávacej pamäte '%s'" -#: aplay/aplay.c:707 +#: aplay/aplay.c:727 #, c-format msgid "invalid min available space argument '%s'" msgstr "neplatný argument min. dostupného miesta '%s'" -#: aplay/aplay.c:714 +#: aplay/aplay.c:734 #, c-format msgid "invalid start delay argument '%s'" msgstr "neplatný argument oneskorenia pri štarte '%s'" -#: aplay/aplay.c:721 +#: aplay/aplay.c:741 #, c-format msgid "invalid stop delay argument '%s'" msgstr "neplatný argument oneskorenia pri zastavení '%s'" -#: aplay/aplay.c:776 +#: aplay/aplay.c:796 #, c-format msgid "invalid test coef argument '%s'" msgstr "neplatný argument testovacieho koeficienta '%s'" -#: aplay/aplay.c:788 +#: aplay/aplay.c:808 #, c-format msgid "invalid max file time argument '%s'" msgstr "neplatný argument pre max. čas súboru '%s'" -#: aplay/aplay.c:808 speaker-test/speaker-test.c:571 +#: aplay/aplay.c:828 speaker-test/speaker-test.c:616 #, c-format msgid "Unable to parse channel map string: %s\n" msgstr "Chyba pri dekódovaní reťazca s mapou kanálov: %s\n" -#: aplay/aplay.c:814 +#: aplay/aplay.c:834 #, c-format msgid "Try `%s --help' for more information.\n" msgstr "Skúste `%s --help' pre ďalšie informácie.\n" -#: aplay/aplay.c:830 +#: aplay/aplay.c:850 #, c-format msgid "audio open error: %s" msgstr "chyba pri otváraní zariadenia: %s" -#: aplay/aplay.c:835 +#: aplay/aplay.c:855 #, c-format msgid "info error: %s" msgstr "chyba pri čítaní informácií o zariadení: %s" -#: aplay/aplay.c:842 +#: aplay/aplay.c:862 #, c-format msgid "nonblock setting error: %s" msgstr "chyba pri nastavovaní režimu bez blokovania: %s" -#: aplay/aplay.c:852 aplay/aplay.c:976 aplay/aplay.c:1266 aplay/aplay.c:1466 -#: aplay/aplay.c:1986 aplay/aplay.c:2016 +#: aplay/aplay.c:880 aplay/aplay.c:1004 aplay/aplay.c:1316 aplay/aplay.c:1539 +#: aplay/aplay.c:2119 aplay/aplay.c:2149 msgid "not enough memory" msgstr "nedostatok pamäte" -#: aplay/aplay.c:876 +#: aplay/aplay.c:904 #, c-format msgid "Cannot create process ID file %s: %s" msgstr "Chyba pri vytváraní súboru s ID procesu %s: %s" -#: aplay/aplay.c:966 +#: aplay/aplay.c:994 #, c-format msgid "read error (called from line %i)" msgstr "chyba pri čítaní (volané na riadku %i)" -#: aplay/aplay.c:1033 +#: aplay/aplay.c:1062 #, c-format msgid "unknown length of 'fmt ' chunk (read %u, should be %u at least)" msgstr "neznáma dĺžka 'fmt ' bloku (prečítané %u, malo by byť aspoň %u)" -#: aplay/aplay.c:1044 +#: aplay/aplay.c:1073 #, c-format msgid "" "unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)" msgstr "" "neznáma dĺžka rozšíreného 'fmt ' bloku (prečítané %u, malo by byť aspoň %u)" -#: aplay/aplay.c:1049 +#: aplay/aplay.c:1078 msgid "wrong format tag in extensible 'fmt ' chunk" msgstr "neznámy formát značky rozšíreného 'fmt ' bloku" -#: aplay/aplay.c:1056 +#: aplay/aplay.c:1086 #, c-format msgid "can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded" -msgstr "nie je možné prehrať WAV súbor vo formáte 0x%04x, ktorý nie je kódovaný ako PCM alebo FLOAT" +msgstr "" +"nie je možné prehrať WAV súbor vo formáte 0x%04x, ktorý nie je kódovaný ako " +"PCM alebo FLOAT" -#: aplay/aplay.c:1061 +#: aplay/aplay.c:1091 #, c-format msgid "can't play WAVE-files with %d tracks" msgstr "nie je možné prehrať súbory WAV s %d stopami" -#: aplay/aplay.c:1069 aplay/aplay.c:1195 +#: aplay/aplay.c:1096 +#, c-format +msgid "valid bps greater than bps: %d > %d" +msgstr "" + +#: aplay/aplay.c:1103 aplay/aplay.c:1239 #, c-format msgid "Warning: format is changed to U8\n" msgstr "Varovanie: formát bol zmenený na U8\n" -#: aplay/aplay.c:1079 aplay/aplay.c:1092 aplay/aplay.c:1103 +#: aplay/aplay.c:1113 aplay/aplay.c:1126 aplay/aplay.c:1137 #, c-format msgid "Warning: format is changed to %s\n" msgstr "Varovanie: formát bol zmenený na %s\n" -#: aplay/aplay.c:1108 +#: aplay/aplay.c:1142 #, c-format msgid "" " can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)" @@ -739,217 +814,229 @@ msgstr "" " nie je možné prehrať súbory WAV s vzorkovaním %d bitov v %d bajtoch (%d " "kanálov)" -#: aplay/aplay.c:1131 +#: aplay/aplay.c:1175 #, c-format msgid " can't play WAVE-files with sample %d bits wide" msgstr " nie je možné prehrať súbory WAV o šírke vzorky %d bitov" -#: aplay/aplay.c:1189 +#: aplay/aplay.c:1233 #, c-format msgid "Warning: format is changed to MU_LAW\n" msgstr "Varovanie: formát bol zmenený na MU_LAW\n" -#: aplay/aplay.c:1201 +#: aplay/aplay.c:1245 #, c-format msgid "Warning: format is changed to S16_BE\n" msgstr "Varovanie: formát bol zmenený na S16_BE\n" -#: aplay/aplay.c:1214 aplay/aplay.c:2307 aplay/aplay.c:2314 aplay/aplay.c:2839 +#: aplay/aplay.c:1251 +#, fuzzy, c-format +#| msgid "Warning: format is changed to MU_LAW\n" +msgid "Warning: format is changed to A_LAW\n" +msgstr "Varovanie: formát bol zmenený na MU_LAW\n" + +#: aplay/aplay.c:1264 aplay/aplay.c:2440 aplay/aplay.c:2447 aplay/aplay.c:2973 msgid "read error" msgstr "chyba pri čítaní" -#: aplay/aplay.c:1244 +#: aplay/aplay.c:1294 msgid "Channel numbers don't match between hw_params and channel map" msgstr "Počet kanálov medzi hw_params a mapou kanálov nesedí" -#: aplay/aplay.c:1253 +#: aplay/aplay.c:1303 #, c-format msgid "Warning: unable to get channel map\n" msgstr "Varovanie: nie je možné získať mapu kanálov\n" -#: aplay/aplay.c:1287 +#: aplay/aplay.c:1337 #, c-format msgid "Channel %d doesn't match with hw_params" msgstr "Kanál %d nesedí s hardvérovými parametrami (hw_params)" -#: aplay/aplay.c:1314 +#: aplay/aplay.c:1364 msgid "Broken configuration for this PCM: no configurations available" msgstr "" "Neplatná konfigurácia pre toto zariadenie PCM: žiadne dostupné konfigurácie" -#: aplay/aplay.c:1318 +#: aplay/aplay.c:1368 aplay/aplay.c:1474 #, c-format msgid "HW Params of device \"%s\":\n" msgstr "HW parametre zariadenia \"%s\":\n" -#: aplay/aplay.c:1338 +#: aplay/aplay.c:1388 msgid "Access type not available" msgstr "Typ prístupu nie je dostupný" -#: aplay/aplay.c:1343 +#: aplay/aplay.c:1393 msgid "Sample format non available" msgstr "Formát vzorkovania nie je dostupný" -#: aplay/aplay.c:1349 +#: aplay/aplay.c:1399 +#, fuzzy +#| msgid "Sample format non available" +msgid "Sample subformat not available" +msgstr "Formát vzorkovania nie je dostupný" + +#: aplay/aplay.c:1404 msgid "Channels count non available" msgstr "Počet kanálov nie je dostupný" -#: aplay/aplay.c:1364 +#: aplay/aplay.c:1419 #, c-format msgid "Warning: rate is not accurate (requested = %iHz, got = %iHz)\n" msgstr "" "Varovanie: frekvencia je nepresná (vyžiadané: %i Hz, obdržané: %i Hz)\n" -#: aplay/aplay.c:1370 +#: aplay/aplay.c:1425 #, c-format msgid " please, try the plug plugin %s\n" msgstr " vyskúšajte, prosím, doplnok plug: %s\n" -#: aplay/aplay.c:1407 +#: aplay/aplay.c:1462 msgid "Unable to install hw params:" msgstr "Chyba pri nastavovaní hw parametrov:" -#: aplay/aplay.c:1414 +#: aplay/aplay.c:1469 #, c-format msgid "Can't use period equal to buffer size (%lu == %lu)" msgstr "" "Nie je možné použiť periódu rovnakú ako veľkosť vyrovnávacej pamäte (%lu == " "%lu)" -#: aplay/aplay.c:1420 +#: aplay/aplay.c:1482 msgid "Unable to get current sw params." msgstr "chyba pri nastavovaní softvérových parametrov:" -#: aplay/aplay.c:1449 +#: aplay/aplay.c:1522 msgid "unable to install sw params:" msgstr "chyba pri nastavovaní sw parametrov:" -#: aplay/aplay.c:1484 +#: aplay/aplay.c:1557 #, c-format msgid "snd_pcm_mmap_begin problem: %s" msgstr "problém s snd_pcm_mmap_begin: %s" -#: aplay/aplay.c:1513 +#: aplay/aplay.c:1586 #, c-format msgid "stdin O_NONBLOCK flag setup failed\n" msgstr "chyba pri nastavovaní príznaku O_NONBLOCK\n" -#: aplay/aplay.c:1537 +#: aplay/aplay.c:1623 #, c-format msgid "\rPAUSE command ignored (no hw support)\n" msgstr "\rpríkaz PAUSE ignorovaný (chýba podpora v hardvéri)\n" -#: aplay/aplay.c:1545 +#: aplay/aplay.c:1631 #, c-format msgid "pause push error: %s" msgstr "chyba pri pozastavení: %s" -#: aplay/aplay.c:1556 -#, c-format -msgid "pause release error: %s" -msgstr "chyba pri ukončovaní pozastavenia: %s" - -#: aplay/aplay.c:1572 +#: aplay/aplay.c:1634 #, c-format msgid "" "\r=== PAUSE === " msgstr "" "\r=== PAUZA === " -#: aplay/aplay.c:1614 +#: aplay/aplay.c:1644 +#, c-format +msgid "pause release error: %s" +msgstr "chyba pri ukončovaní pozastavenia: %s" + +#: aplay/aplay.c:1700 #, c-format msgid "status error: %s" msgstr "chyba stavu: %s" -#: aplay/aplay.c:1619 -#, c-format -msgid "fatal %s: %s" -msgstr "fatálna %s: %s" - -#: aplay/aplay.c:1620 aplay/aplay.c:1631 aplay/aplay.c:1634 aplay/aplay.c:1642 -msgid "underrun" -msgstr "podtečenie" - -#: aplay/aplay.c:1620 aplay/aplay.c:1631 aplay/aplay.c:1642 -msgid "overrun" -msgstr "pretečenie" - -#: aplay/aplay.c:1630 aplay/aplay.c:1641 +#: aplay/aplay.c:1710 aplay/aplay.c:1721 #, c-format msgid "%s!!! (at least %.3f ms long)\n" msgstr "%s!!! (o dĺžke aspoň %.3f ms)\n" -#: aplay/aplay.c:1646 +#: aplay/aplay.c:1711 aplay/aplay.c:1714 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "underrun" +msgstr "podtečenie" + +#: aplay/aplay.c:1711 aplay/aplay.c:1722 aplay/aplay.c:1731 +msgid "overrun" +msgstr "pretečenie" + +#: aplay/aplay.c:1726 #, c-format msgid "Status:\n" msgstr "Stav:\n" -#: aplay/aplay.c:1650 +#: aplay/aplay.c:1730 +#, c-format +msgid "fatal %s: %s" +msgstr "fatálna %s: %s" + +#: aplay/aplay.c:1736 #, c-format msgid "xrun: prepare error: %s" msgstr "xrun: chyba pri inicializácii: %s" -#: aplay/aplay.c:1656 +#: aplay/aplay.c:1743 #, c-format msgid "Status(DRAINING):\n" msgstr "Stav (VYČERPANIE):\n" -#: aplay/aplay.c:1660 +#: aplay/aplay.c:1747 #, c-format msgid "capture stream format change? attempting recover...\n" msgstr "zmena formátu prúdu zaznamenávaných dát? pokúšam sa zotaviť...\n" -#: aplay/aplay.c:1662 +#: aplay/aplay.c:1749 #, c-format msgid "xrun(DRAINING): prepare error: %s" msgstr "xrun (VYČERPANIE): chyba počas inicializácie: %s" -#: aplay/aplay.c:1669 +#: aplay/aplay.c:1756 #, c-format msgid "Status(R/W):\n" msgstr "Stav (R/W):\n" -#: aplay/aplay.c:1672 +#: aplay/aplay.c:1759 #, c-format msgid "read/write error, state = %s" msgstr "chyba čítania/zápisu, stav = %s" -#: aplay/aplay.c:1682 +#: aplay/aplay.c:1769 #, c-format msgid "Suspended. Trying resume. " msgstr "Pozastavené. Pokúšam sa prebudiť. " -#: aplay/aplay.c:1688 +#: aplay/aplay.c:1775 #, c-format msgid "Failed. Restarting stream. " msgstr "Zlyhalo. Reštartujem stream. " -#: aplay/aplay.c:1691 +#: aplay/aplay.c:1778 #, c-format msgid "suspend: prepare error: %s" msgstr "Pozastavenie: chyba pri inicializácií: %s" -#: aplay/aplay.c:1696 +#: aplay/aplay.c:1783 #, c-format msgid "Done.\n" msgstr "Hotovo.\n" -#: aplay/aplay.c:1718 +#: aplay/aplay.c:1805 #, c-format msgid " !clip " msgstr " !orezanie " -#: aplay/aplay.c:1862 +#: aplay/aplay.c:1957 #, c-format msgid "Unsupported bit size %d.\n" msgstr "Nepodporovaná bitová dĺžka %d.\n" -#: aplay/aplay.c:1896 +#: aplay/aplay.c:1993 #, c-format msgid "Max peak (%li samples): 0x%08x " msgstr "Max. hodnota (%li vzoriek): 0x%08x " -#: aplay/aplay.c:1930 +#: aplay/aplay.c:2034 #, c-format msgid "" "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer = " @@ -958,657 +1045,746 @@ msgstr "" "Podozrivá pozícia vyrovnávacej pämate (celkom %li): dostupné = %li, " "oneskorenie = %li, vyr. pamäť = %li\n" -#: aplay/aplay.c:2058 +#: aplay/aplay.c:2043 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position (%li total): avail = %li, delay = %li, " +"buffer = %li\n" +msgstr "" +"Podozrivá pozícia vyrovnávacej pämate (celkom %li): dostupné = %li, " +"oneskorenie = %li, vyr. pamäť = %li\n" + +#: aplay/aplay.c:2047 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious buffer position avail > delay (%li total): avail = %li, delay = " +"%li\n" +msgstr "" +"Podozrivá pozícia vyrovnávacej pämate (celkom %li): dostupné = %li, " +"oneskorenie = %li, vyr. pamäť = %li\n" + +#: aplay/aplay.c:2051 +#, fuzzy, c-format +#| msgid "" +#| "Suspicious buffer position (%li total): avail = %li, delay = %li, buffer " +#| "= %li\n" +msgid "" +"Suspicious status buffer position avail > delay (%li total): avail = %li, " +"delay = %li\n" +msgstr "" +"Podozrivá pozícia vyrovnávacej pämate (celkom %li): dostupné = %li, " +"oneskorenie = %li, vyr. pamäť = %li\n" + +#: aplay/aplay.c:2094 +#, c-format +msgid "Status(R/W) (standalone avail=%li delay=%li):\n" +msgstr "" + +#: aplay/aplay.c:2191 #, c-format msgid "write error: %s" msgstr "Chyba pri zápise: %s" -#: aplay/aplay.c:2106 +#: aplay/aplay.c:2239 #, c-format msgid "writev error: %s" msgstr "Chyba pri zápise vektora: %s" -#: aplay/aplay.c:2152 +#: aplay/aplay.c:2285 #, c-format msgid "read error: %s" msgstr "Chyba pri čítaní: %s" -#: aplay/aplay.c:2199 +#: aplay/aplay.c:2332 #, c-format msgid "readv error: %s" msgstr "Chyba pri čítaní vektora: %s" -#: aplay/aplay.c:2248 +#: aplay/aplay.c:2381 msgid "can't allocate buffer for silence" msgstr "Nepodarilo sa alokovať vyrovnávaciu pamäť pre ticho" -#: aplay/aplay.c:2257 aplay/aplay.c:2485 aplay/aplay.c:2490 aplay/aplay.c:2540 -#: aplay/aplay.c:2549 aplay/aplay.c:2556 aplay/aplay.c:2566 aplay/aplay.c:2572 -#: aplay/aplay.c:2644 aplay/aplay.c:2674 aplay/aplay.c:2688 +#: aplay/aplay.c:2390 aplay/aplay.c:2619 aplay/aplay.c:2624 aplay/aplay.c:2676 +#: aplay/aplay.c:2685 aplay/aplay.c:2692 aplay/aplay.c:2702 aplay/aplay.c:2708 +#: aplay/aplay.c:2773 aplay/aplay.c:2806 aplay/aplay.c:2820 msgid "write error" msgstr "Chyba pri zápise" -#: aplay/aplay.c:2270 +#: aplay/aplay.c:2403 #, c-format msgid "voc_pcm_flush - silence error" msgstr "voc_pcm_flush - chyba pri nastavovaní ticha" -#: aplay/aplay.c:2273 +#: aplay/aplay.c:2406 msgid "voc_pcm_flush error" msgstr "chyba voc_pcm_flush" -#: aplay/aplay.c:2298 +#: aplay/aplay.c:2431 msgid "malloc error" msgstr "chyba malloc" -#: aplay/aplay.c:2302 +#: aplay/aplay.c:2435 #, c-format msgid "Playing Creative Labs Channel file '%s'...\n" msgstr "Prehrávam súbor Creative Labs Channel '%s'...\n" -#: aplay/aplay.c:2370 aplay/aplay.c:2465 +#: aplay/aplay.c:2504 aplay/aplay.c:2599 msgid "can't play packed .voc files" msgstr "Nie je možné prehrať komprimované súbory .voc" -#: aplay/aplay.c:2425 +#: aplay/aplay.c:2559 #, c-format msgid "can't play loops; %s isn't seekable\n" msgstr "Nedokážem prehrať slučku; v %s nie je možné skákať\n" -#: aplay/aplay.c:2474 +#: aplay/aplay.c:2608 #, c-format msgid "unknown blocktype %d. terminate." msgstr "Neznámy typ bloku %d. Končím." -#: aplay/aplay.c:2608 +#: aplay/aplay.c:2743 #, c-format msgid "Wave doesn't support %s format..." msgstr "Wave nepodporuje formát %s..." -#: aplay/aplay.c:2668 +#: aplay/aplay.c:2800 #, c-format msgid "Sparc Audio doesn't support %s format..." msgstr "Sparc audio nepodporuje formát %s..." -#: aplay/aplay.c:2743 +#: aplay/aplay.c:2875 msgid "Playing" msgstr "Prehrávam" -#: aplay/aplay.c:2743 +#: aplay/aplay.c:2875 msgid "Recording" msgstr "Nahrávam" -#: aplay/aplay.c:2747 +#: aplay/aplay.c:2879 #, c-format msgid "Rate %d Hz, " msgstr "Frekvencia: %d Hz, " -#: aplay/aplay.c:2749 +#: aplay/aplay.c:2881 #, c-format msgid "Mono" msgstr "Mono" -#: aplay/aplay.c:2751 +#: aplay/aplay.c:2883 #, c-format msgid "Stereo" msgstr "Stereo" -#: aplay/aplay.c:2753 +#: aplay/aplay.c:2885 #, c-format msgid "Channels %i" msgstr "%i Kanály" -#: aplay/aplay.c:3356 +#: aplay/aplay.c:3492 #, c-format msgid "You need to specify %u files" msgstr "Musíte zadať %u súborov" -#: aplay/aplay.c:3409 +#: aplay/aplay.c:3545 #, c-format msgid "You need to specify %d files" msgstr "Musíte zadať %d súborov." -#: seq/aconnect/aconnect.c:49 +#: seq/aconnect/aconnect.c:63 #, c-format msgid "aconnect - ALSA sequencer connection manager\n" msgstr "aconnect - Správca spojení pre ALSA sekvencér\n" -#: seq/aconnect/aconnect.c:50 +#: seq/aconnect/aconnect.c:64 #, c-format msgid "Copyright (C) 1999-2000 Takashi Iwai\n" msgstr "Autorské práva © 1999-2000 Takashi Iwai\n" -#: seq/aconnect/aconnect.c:51 +#: seq/aconnect/aconnect.c:65 #, c-format msgid "Usage:\n" msgstr "Syntax:\n" -#: seq/aconnect/aconnect.c:52 +#: seq/aconnect/aconnect.c:66 #, c-format msgid " * Connection/disconnection between two ports\n" msgstr " * Vytvorenie/zrušenie spojenia dvoch prípojok (portov)\n" -#: seq/aconnect/aconnect.c:53 +#: seq/aconnect/aconnect.c:67 #, c-format msgid " aconnect [-options] sender receiver\n" msgstr " aconnect [-možnosti] odosielateľ prijímateľ\n" -#: seq/aconnect/aconnect.c:54 +#: seq/aconnect/aconnect.c:68 #, c-format msgid " sender, receiver = client:port pair\n" msgstr " odosielateľ, prijímateľ = pár klient:port\n" -#: seq/aconnect/aconnect.c:55 +#: seq/aconnect/aconnect.c:69 #, c-format msgid " -d,--disconnect disconnect\n" msgstr " -d,--disconnect zrušiť spojenie\n" -#: seq/aconnect/aconnect.c:56 +#: seq/aconnect/aconnect.c:70 #, c-format msgid " -e,--exclusive exclusive connection\n" msgstr " -e,--exclusive výhradné spojenie\n" -#: seq/aconnect/aconnect.c:57 +#: seq/aconnect/aconnect.c:71 #, c-format msgid " -r,--real # convert real-time-stamp on queue\n" msgstr " -r,--real # konvertovať príznak reálneho času zdroja\n" -#: seq/aconnect/aconnect.c:58 +#: seq/aconnect/aconnect.c:72 #, c-format msgid " -t,--tick # convert tick-time-stamp on queue\n" msgstr " -t,--tick # konvertovať príznak tiknutia času zdroja\n" -#: seq/aconnect/aconnect.c:59 +#: seq/aconnect/aconnect.c:73 #, c-format msgid " * List connected ports (no subscription action)\n" msgstr " * Zobraziť pripojené prípojky (porty), bez vytvárania spojení\n" -#: seq/aconnect/aconnect.c:60 +#: seq/aconnect/aconnect.c:74 #, c-format msgid " aconnect -i|-o [-options]\n" msgstr " aconnect -i|-o [-možnosti]\n" -#: seq/aconnect/aconnect.c:61 +#: seq/aconnect/aconnect.c:75 #, c-format msgid " -i,--input list input (readable) ports\n" msgstr "" " -i,--input zobraziť vstupné (čitateľné) prípojky (porty)\n" -#: seq/aconnect/aconnect.c:62 +#: seq/aconnect/aconnect.c:76 #, c-format msgid " -o,--output list output (writable) ports\n" msgstr "" -" -o,--output zobraziť výstupné (zapisovateľné) prípojky " -"(porty)\n" +" -o,--output zobraziť výstupné (zapisovateľné) prípojky (porty)\n" -#: seq/aconnect/aconnect.c:63 +#: seq/aconnect/aconnect.c:77 +#, fuzzy, c-format +#| msgid " -i,--input list input (readable) ports\n" +msgid " -a,--all show inactive ports, too\n" +msgstr "" +" -i,--input zobraziť vstupné (čitateľné) prípojky (porty)\n" + +#: seq/aconnect/aconnect.c:78 #, c-format msgid " -l,--list list current connections of each port\n" msgstr "" " -l,--list zobraziť aktuálne spojenia pri každej prípojke " "(porte)\n" -#: seq/aconnect/aconnect.c:64 +#: seq/aconnect/aconnect.c:79 #, c-format msgid " * Remove all exported connections\n" msgstr " * Odstrániť všetky exportované spojenia\n" -#: seq/aconnect/aconnect.c:65 +#: seq/aconnect/aconnect.c:80 #, c-format msgid " -x, --removeall\n" msgstr " -x,--removeall\n" -#: seq/aconnect/aconnect.c:132 +#: seq/aconnect/aconnect.c:156 msgid "Connecting To" msgstr "Pripájam k" -#: seq/aconnect/aconnect.c:133 +#: seq/aconnect/aconnect.c:157 msgid "Connected From" msgstr "Pripojené z" -#: seq/aconnect/aconnect.c:171 +#: seq/aconnect/aconnect.c:200 #, c-format msgid "client %d: '%s' [type=%s" msgstr "klient %d: '%s' [typ=%s" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "user" msgstr "Používateľ" -#: seq/aconnect/aconnect.c:175 +#: seq/aconnect/aconnect.c:204 msgid "kernel" msgstr "Jadro" -#: seq/aconnect/aconnect.c:323 +#: seq/aconnect/aconnect.c:367 #, c-format msgid "can't open sequencer\n" msgstr "Chyba pri otváraní sekvencéra\n" -#: seq/aconnect/aconnect.c:351 +#: seq/aconnect/aconnect.c:399 #, c-format msgid "can't get client id\n" msgstr "Chyba pri čítaní id klienta\n" -#: seq/aconnect/aconnect.c:358 +#: seq/aconnect/aconnect.c:406 #, c-format msgid "can't set client info\n" msgstr "Chyba pri nastavovaní informácií o klientovi\n" -#: seq/aconnect/aconnect.c:365 +#: seq/aconnect/aconnect.c:413 #, c-format msgid "invalid sender address %s\n" msgstr "Neplatná adresa odosielateľa %s\n" -#: seq/aconnect/aconnect.c:370 seq/aseqnet/aseqnet.c:290 +#: seq/aconnect/aconnect.c:418 seq/aseqnet/aseqnet.c:303 #, c-format msgid "invalid destination address %s\n" msgstr "Neplatná adresa cieľa %s\n" -#: seq/aconnect/aconnect.c:384 +#: seq/aconnect/aconnect.c:432 #, c-format msgid "No subscription is found\n" msgstr "Spojenie sa nenašlo\n" -#: seq/aconnect/aconnect.c:389 +#: seq/aconnect/aconnect.c:437 #, c-format msgid "Disconnection failed (%s)\n" msgstr "Chyba pri rušení spojenia (%s)\n" -#: seq/aconnect/aconnect.c:395 +#: seq/aconnect/aconnect.c:443 #, c-format msgid "Connection is already subscribed\n" msgstr "Spojenie je už zaregistrované\n" -#: seq/aconnect/aconnect.c:400 +#: seq/aconnect/aconnect.c:448 #, c-format msgid "Connection failed (%s)\n" msgstr "Chyba spojenia (%s)\n" -#: seq/aseqnet/aseqnet.c:164 +#: seq/aseqnet/aseqnet.c:171 #, c-format msgid "aseqnet - network client/server on ALSA sequencer\n" msgstr "aseqnet - sieťový klient/server pre ALSA sekvencér\n" -#: seq/aseqnet/aseqnet.c:165 +#: seq/aseqnet/aseqnet.c:172 #, c-format msgid " Copyright (C) 1999 Takashi Iwai\n" msgstr " Autorské práva © 1999 Takashi Iwai\n" -#: seq/aseqnet/aseqnet.c:166 +#: seq/aseqnet/aseqnet.c:173 #, c-format msgid "usage:\n" msgstr "Syntax:\n" -#: seq/aseqnet/aseqnet.c:167 +#: seq/aseqnet/aseqnet.c:174 #, c-format msgid " server mode: aseqnet [-options]\n" msgstr " Server-Modus: aseqnet [Optionen]\n" -#: seq/aseqnet/aseqnet.c:168 +#: seq/aseqnet/aseqnet.c:175 #, c-format msgid " client mode: aseqnet [-options] server_host\n" msgstr " Client-Modus: aseqnet [Optionen] ServerHost\n" -#: seq/aseqnet/aseqnet.c:169 +#: seq/aseqnet/aseqnet.c:176 #, c-format msgid "options:\n" msgstr "Možnosti:\n" -#: seq/aseqnet/aseqnet.c:170 +#: seq/aseqnet/aseqnet.c:177 +#, c-format +msgid " -6,--ipv6 : use IPv6 TCP protocol\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:178 #, c-format msgid " -p,--port # : specify TCP port (digit or service name)\n" msgstr " -p,--port # : port TCP (číslo alebo meno služby)\n" -#: seq/aseqnet/aseqnet.c:171 +#: seq/aseqnet/aseqnet.c:179 #, c-format msgid " -s,--source addr : read from given addr (client:port)\n" msgstr " -s,--source # : čítať z adresy (klient:port)\n" -#: seq/aseqnet/aseqnet.c:172 +#: seq/aseqnet/aseqnet.c:180 #, c-format msgid " -d,--dest addr : write to given addr (client:port)\n" msgstr " -d,--dest # : zapísať na adresu (klient:port)\n" -#: seq/aseqnet/aseqnet.c:173 +#: seq/aseqnet/aseqnet.c:181 +#, c-format +msgid " -n,--name value : use a specific midi process name\n" +msgstr "" + +#: seq/aseqnet/aseqnet.c:182 #, c-format msgid " -v, --verbose : print verbose messages\n" msgstr " -v,--verbose : zobraziť podrobnejšie hlásenia\n" -#: seq/aseqnet/aseqnet.c:174 +#: seq/aseqnet/aseqnet.c:183 #, c-format msgid " -i, --info : print certain received events\n" msgstr " -i,--info : zobraziť určité udalosti príjmu\n" -#: seq/aseqnet/aseqnet.c:188 +#: seq/aseqnet/aseqnet.c:197 #, c-format msgid "can't malloc\n" msgstr "chyba pri malloc\n" -#: seq/aseqnet/aseqnet.c:213 +#: seq/aseqnet/aseqnet.c:222 #, c-format msgid "closing files..\n" msgstr "zatváram súbory ...\n" -#: seq/aseqnet/aseqnet.c:272 +#: seq/aseqnet/aseqnet.c:285 #, c-format msgid "sequencer opened: %d:%d\n" msgstr "sekvencér otvorený: %d:%d\n" -#: seq/aseqnet/aseqnet.c:279 +#: seq/aseqnet/aseqnet.c:292 #, c-format msgid "invalid source address %s\n" msgstr "neplatná zdrojová adresa %s\n" -#: seq/aseqnet/aseqnet.c:309 -#, c-format -msgid "service '%s' is not found in /etc/services\n" -msgstr "Služba '%s' nebola nájdená v /etc/services\n" +#: seq/aseqnet/aseqnet.c:362 +#, fuzzy, c-format +#| msgid "can't get address %s\n" +msgid "can't get address\n" +msgstr "nepodarilo sa získať adresu %s\n" -#: seq/aseqnet/aseqnet.c:377 +#: seq/aseqnet/aseqnet.c:376 seq/aseqnet/aseqnet.c:461 +#, fuzzy, c-format +#| msgid "Connecting To" +msgid "connecting to: %s\n" +msgstr "Pripájam k" + +#: seq/aseqnet/aseqnet.c:414 #, c-format msgid "too many connections!\n" msgstr "Príliš veľa spojení!\n" -#: seq/aseqnet/aseqnet.c:388 +#: seq/aseqnet/aseqnet.c:425 #, c-format msgid "accepted[%d]\n" msgstr "prijaté[%d]\n" -#: seq/aseqnet/aseqnet.c:411 +#: seq/aseqnet/aseqnet.c:447 #, c-format msgid "can't get address %s\n" msgstr "nepodarilo sa získať adresu %s\n" -#: seq/aseqnet/aseqnet.c:422 +#: seq/aseqnet/aseqnet.c:475 #, c-format msgid "ok.. connected\n" msgstr "OK ... pripojené\n" -#: seq/aseqnet/aseqnet.c:518 +#: seq/aseqnet/aseqnet.c:574 #, c-format msgid "Channel %2d: Control event : %5d\n" msgstr "Kanál %2d: udalosť ovládania: %5d\n" -#: seq/aseqnet/aseqnet.c:522 +#: seq/aseqnet/aseqnet.c:578 #, c-format msgid "Channel %2d: Pitchbender : %5d\n" msgstr "Kanál %2d: Pitchbender : %5d\n" -#: seq/aseqnet/aseqnet.c:526 +#: seq/aseqnet/aseqnet.c:582 #, c-format msgid "Channel %2d: Note On event : %5d\n" msgstr "Kanál %2d: Udalosť aktivovanej noty : %5d\n" -#: seq/aseqnet/aseqnet.c:530 +#: seq/aseqnet/aseqnet.c:586 #, c-format msgid "Channel %2d: Note Off event: %5d\n" msgstr "Kanál %2d: Udalosť deaktivovanej noty: %5d\n" -#: seq/aseqnet/aseqnet.c:585 +#: seq/aseqnet/aseqnet.c:641 #, c-format msgid "disconnected\n" msgstr "Spojenie zrušené\n" -#: speaker-test/speaker-test.c:120 +#: speaker-test/speaker-test.c:130 msgid "Front Left" msgstr "Predný ľavý" -#: speaker-test/speaker-test.c:121 +#: speaker-test/speaker-test.c:131 msgid "Front Right" msgstr "Predný pravý" -#: speaker-test/speaker-test.c:122 +#: speaker-test/speaker-test.c:132 msgid "Rear Left" msgstr "Zadný ľavý" -#: speaker-test/speaker-test.c:123 +#: speaker-test/speaker-test.c:133 msgid "Rear Right" msgstr "Zadný pravý" -#: speaker-test/speaker-test.c:125 +#: speaker-test/speaker-test.c:135 msgid "LFE" msgstr "Subwoofer" -#: speaker-test/speaker-test.c:126 +#: speaker-test/speaker-test.c:136 msgid "Side Left" msgstr "Stredový ľavý" -#: speaker-test/speaker-test.c:127 +#: speaker-test/speaker-test.c:137 msgid "Side Right" msgstr "Stredový pravý" -#: speaker-test/speaker-test.c:128 +#: speaker-test/speaker-test.c:138 msgid "Channel 9" msgstr "Kanál 9" -#: speaker-test/speaker-test.c:129 +#: speaker-test/speaker-test.c:139 msgid "Channel 10" msgstr "Kanál 10" -#: speaker-test/speaker-test.c:130 +#: speaker-test/speaker-test.c:140 msgid "Channel 11" msgstr "Kanál 11" -#: speaker-test/speaker-test.c:131 +#: speaker-test/speaker-test.c:141 msgid "Channel 12" msgstr "Kanál 12" -#: speaker-test/speaker-test.c:132 +#: speaker-test/speaker-test.c:142 msgid "Channel 13" msgstr "Kanál 13" -#: speaker-test/speaker-test.c:133 +#: speaker-test/speaker-test.c:143 msgid "Channel 14" msgstr "Kanál 14" -#: speaker-test/speaker-test.c:134 +#: speaker-test/speaker-test.c:144 msgid "Channel 15" msgstr "Kanál 15" -#: speaker-test/speaker-test.c:135 +#: speaker-test/speaker-test.c:145 msgid "Channel 16" msgstr "Kanál 16" -#: speaker-test/speaker-test.c:424 +#: speaker-test/speaker-test.c:465 #, c-format msgid "Broken configuration for playback: no configurations available: %s\n" msgstr "Neplatná konfigurácia prehrávania: žiadne dostupné konfigurácie: %s\n" -#: speaker-test/speaker-test.c:431 +#: speaker-test/speaker-test.c:472 #, c-format msgid "Access type not available for playback: %s\n" msgstr "Typ prístupu nie je dostupný pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:438 +#: speaker-test/speaker-test.c:479 #, c-format msgid "Sample format not available for playback: %s\n" msgstr "Formát vzorkovania nie je dostupný pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:445 +#: speaker-test/speaker-test.c:486 #, c-format msgid "Channels count (%i) not available for playbacks: %s\n" msgstr "Počet kanálov (%i) nie je dostupný pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:453 +#: speaker-test/speaker-test.c:494 #, c-format msgid "Rate %iHz not available for playback: %s\n" msgstr "Frekvencia %i Hz nie je dostupná pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:458 +#: speaker-test/speaker-test.c:499 #, c-format msgid "Rate doesn't match (requested %iHz, get %iHz, err %d)\n" msgstr "Frekvencia nesedí (vyžiadané: %i Hz, obdržané: %i Hz, kód chyby %d)\n" -#: speaker-test/speaker-test.c:462 +#: speaker-test/speaker-test.c:503 #, c-format msgid "Rate set to %iHz (requested %iHz)\n" msgstr "Frekvencia nastavená na %i Hz (vyžiadané: %i Hz)\n" -#: speaker-test/speaker-test.c:468 +#: speaker-test/speaker-test.c:509 #, c-format msgid "Buffer size range from %lu to %lu\n" msgstr "Veľkosť vyrovnávacej pamäte v rozmedzí od %lu do %lu\n" -#: speaker-test/speaker-test.c:469 +#: speaker-test/speaker-test.c:510 #, c-format msgid "Period size range from %lu to %lu\n" msgstr "Veľkosť periódy v rozmedzí od %lu do %lu\n" -#: speaker-test/speaker-test.c:471 +#: speaker-test/speaker-test.c:514 #, c-format msgid "Requested period time %u us\n" msgstr "Vyžiadaný čas periódy %u µs\n" -#: speaker-test/speaker-test.c:474 +#: speaker-test/speaker-test.c:519 #, c-format msgid "Unable to set period time %u us for playback: %s\n" msgstr "Chyba pri nastavovaní času periódy %u µs pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:480 +#: speaker-test/speaker-test.c:525 #, c-format msgid "Requested buffer time %u us\n" msgstr "Vyžiadaný čas vyrovnávacej pamäte %u µs\n" -#: speaker-test/speaker-test.c:483 +#: speaker-test/speaker-test.c:528 #, c-format msgid "Unable to set buffer time %u us for playback: %s\n" msgstr "" "Chyba pri nastavovaní času vyrovnávacej pamäte %u µs pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:492 +#: speaker-test/speaker-test.c:537 #, c-format msgid "Using max buffer size %lu\n" msgstr "Používam max. veľkosť vyrovnávacej pamäte %lu\n" -#: speaker-test/speaker-test.c:495 +#: speaker-test/speaker-test.c:540 #, c-format msgid "Unable to set buffer size %lu for playback: %s\n" msgstr "" "Chyba pri nastavovaní veľkosti vyrovnávacej pamäte %lu pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:501 +#: speaker-test/speaker-test.c:546 #, c-format msgid "Periods = %u\n" msgstr "Periódy = %u\n" -#: speaker-test/speaker-test.c:504 +#: speaker-test/speaker-test.c:549 #, c-format msgid "Unable to set nperiods %u for playback: %s\n" msgstr "Chyba pri nastavovaní počtu periód %u pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:513 +#: speaker-test/speaker-test.c:558 #, c-format msgid "Unable to set hw params for playback: %s\n" msgstr "Chyba pri nastavovaní hw parametrov pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:519 +#: speaker-test/speaker-test.c:564 #, c-format msgid "was set period_size = %lu\n" msgstr "nastavené: period_size = %lu\n" -#: speaker-test/speaker-test.c:520 +#: speaker-test/speaker-test.c:565 #, c-format msgid "was set buffer_size = %lu\n" msgstr "nastavené: buffer_size = %lu\n" -#: speaker-test/speaker-test.c:522 +#: speaker-test/speaker-test.c:567 #, c-format msgid "buffer to small, could not use\n" msgstr "vyrovnávacia pamäť príliš malá, nedá sa použiť\n" -#: speaker-test/speaker-test.c:535 +#: speaker-test/speaker-test.c:580 #, c-format msgid "Unable to determine current swparams for playback: %s\n" msgstr "Chyba pri zisťovaní softvérových parametrov pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:542 +#: speaker-test/speaker-test.c:587 #, c-format msgid "Unable to set start threshold mode for playback: %s\n" msgstr "Chyba pri nastavovaní začiatku prahového režimu pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:549 +#: speaker-test/speaker-test.c:594 #, c-format msgid "Unable to set avail min for playback: %s\n" msgstr "Chyba pri nastavovaní dostupného minima pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:556 +#: speaker-test/speaker-test.c:601 #, c-format msgid "Unable to set sw params for playback: %s\n" msgstr "Chyba pri nastavovaní softvérových parametrov pre prehrávanie: %s\n" -#: speaker-test/speaker-test.c:576 +#: speaker-test/speaker-test.c:621 #, c-format msgid "Unable to set channel map: %s\n" msgstr "Chyba pri zostavovaní mapy kanálov: %s\n" -#: speaker-test/speaker-test.c:601 +#: speaker-test/speaker-test.c:646 #, c-format msgid "Can't recovery from underrun, prepare failed: %s\n" msgstr "" "Nepodarilo sa zotaviť z podtečenia (underrun), chyba pri inicializácii: %s\n" -#: speaker-test/speaker-test.c:612 +#: speaker-test/speaker-test.c:657 #, c-format msgid "Can't recovery from suspend, prepare failed: %s\n" msgstr "Nepodarilo sa zotaviť z pozastavenia, chyba pri inicializácii: %s\n" -#: speaker-test/speaker-test.c:676 speaker-test/speaker-test.c:1191 +#: speaker-test/speaker-test.c:721 speaker-test/speaker-test.c:1257 #, c-format msgid "No enough memory\n" msgstr "Nedostatok pamäte\n" -#: speaker-test/speaker-test.c:681 +#: speaker-test/speaker-test.c:726 #, c-format msgid "Cannot open WAV file %s\n" msgstr "Nepodarilo sa otvoriť súbor WAV %s\n" -#: speaker-test/speaker-test.c:685 speaker-test/speaker-test.c:714 +#: speaker-test/speaker-test.c:730 speaker-test/speaker-test.c:759 #, c-format msgid "Invalid WAV file %s\n" msgstr "Neplatný súbor WAV %s\n" -#: speaker-test/speaker-test.c:690 +#: speaker-test/speaker-test.c:735 #, c-format msgid "Not a WAV file: %s\n" msgstr "Toto nie je súbor WAV: %s\n" -#: speaker-test/speaker-test.c:694 +#: speaker-test/speaker-test.c:739 #, c-format msgid "Unsupported WAV format %d for %s\n" msgstr "Neplatný formát WAV súboru %d v %s\n" -#: speaker-test/speaker-test.c:699 +#: speaker-test/speaker-test.c:744 #, c-format msgid "%s is not a mono stream (%d channels)\n" msgstr "%s nie je monofónny prúd (%d kanálov)\n" -#: speaker-test/speaker-test.c:704 +#: speaker-test/speaker-test.c:749 #, c-format msgid "Sample rate doesn't match (%d) for %s\n" msgstr "Frekvencia vzorkovania (%d) nesedí s %s\n" -#: speaker-test/speaker-test.c:709 +#: speaker-test/speaker-test.c:754 #, c-format msgid "Unsupported sample format bits %d for %s\n" msgstr "Nepodporovaný formát vzorkovania s %d bitmi v %s\n" -#: speaker-test/speaker-test.c:770 +#: speaker-test/speaker-test.c:815 #, c-format msgid "Undefined channel %d\n" msgstr "Kanál %d nie je definovaný\n" -#: speaker-test/speaker-test.c:821 +#: speaker-test/speaker-test.c:866 #, c-format msgid "Write error: %d,%s\n" msgstr "Chyba pri zápise: %d, %s\n" -#: speaker-test/speaker-test.c:823 +#: speaker-test/speaker-test.c:868 #, c-format msgid "xrun_recovery failed: %d,%s\n" msgstr "xrun_recovery zlyhalo: %d, %s\n" -#: speaker-test/speaker-test.c:926 +#: speaker-test/speaker-test.c:938 #, c-format +msgid "\tSMPTE ST-2095 noise batch was %2.2fdB RMS\n" +msgstr "" + +#: speaker-test/speaker-test.c:982 +#, fuzzy, c-format +#| msgid "" +#| "Usage: speaker-test [OPTION]... \n" +#| "-h,--help\thelp\n" +#| "-D,--device\tplayback device\n" +#| "-r,--rate\tstream rate in Hz\n" +#| "-c,--channels\tcount of channels in stream\n" +#| "-f,--frequency\tsine wave frequency in Hz\n" +#| "-F,--format\tsample format\n" +#| "-b,--buffer\tring buffer size in us\n" +#| "-p,--period\tperiod size in us\n" +#| "-P,--nperiods\tnumber of periods\n" +#| "-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +#| "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" +#| "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" +#| "-w,--wavfile\tUse the given WAV file as a test sound\n" +#| "-W,--wavdir\tSpecify the directory containing WAV files\n" +#| "-m,--chmap\tSpecify the channel map to override\n" +#| "-X,--force-frequency\tforce frequencies outside the 30-8000hz range\n" +#| "-S,--scale\tScale of generated test tones in percent (default=80)\n" +#| "\n" msgid "" "Usage: speaker-test [OPTION]... \n" "-h,--help\thelp\n" @@ -1620,7 +1796,8 @@ msgid "" "-b,--buffer\tring buffer size in us\n" "-p,--period\tperiod size in us\n" "-P,--nperiods\tnumber of periods\n" -"-t,--test\tpink=use pink noise, sine=use sine wave, wav=WAV file\n" +"-t,--test\tpink=use pink noise, sine=use sine wave, st2095=use SMPTE ST-2095 " +"noise, wav=WAV file\n" "-l,--nloops\tspecify number of loops to test, 0 = infinite\n" "-s,--speaker\tsingle speaker test. Values 1=Left, 2=right, etc\n" "-w,--wavfile\tUse the given WAV file as a test sound\n" @@ -1640,8 +1817,7 @@ msgstr "" "-b,--buffer\tveľkosť ring buffera v µs\n" "-p,--period\tveľkosť periódy v µs\n" "-P,--nperiods\tpočet periód\n" -"-t,--test\tpink=použiť ružový šum, sine=použiť sínusovú vlnu, wav=súbor " -"WAV\n" +"-t,--test\tpink=použiť ružový šum, sine=použiť sínusovú vlnu, wav=súbor WAV\n" "-l,--nloops\tpočet slučiek pre test, 0 = nekonečno\n" "-s,--speaker\totestovať samostatný reproduktor. Hodnoty: 1=ľavý, 2=pravý, " "atď.\n" @@ -1653,72 +1829,82 @@ msgstr "" "(predvolené=80)\n" "\n" -#: speaker-test/speaker-test.c:1058 +#: speaker-test/speaker-test.c:1114 #, c-format msgid "Invalid number of periods %d\n" msgstr "Neplatný počet periód %d\n" -#: speaker-test/speaker-test.c:1074 speaker-test/speaker-test.c:1078 +#: speaker-test/speaker-test.c:1127 speaker-test/speaker-test.c:1137 +#: speaker-test/speaker-test.c:1141 #, c-format msgid "Invalid test type %s\n" msgstr "Neplatný typ testu %s\n" -#: speaker-test/speaker-test.c:1111 +#: speaker-test/speaker-test.c:1174 #, c-format msgid "Unknown option '%c'\n" msgstr "Neznáma voľba '%c'\n" -#: speaker-test/speaker-test.c:1125 +#: speaker-test/speaker-test.c:1188 #, c-format msgid "Invalid parameter for -s option.\n" msgstr "Neplatný parameter pre voľbu -s.\n" -#: speaker-test/speaker-test.c:1140 +#: speaker-test/speaker-test.c:1203 #, c-format msgid "Playback device is %s\n" msgstr "Zariadenie prehrávania je %s\n" -#: speaker-test/speaker-test.c:1141 +#: speaker-test/speaker-test.c:1204 #, c-format msgid "Stream parameters are %iHz, %s, %i channels\n" msgstr "Parametre prúdu sú %i Hz, %s, %i kanály\n" -#: speaker-test/speaker-test.c:1144 +#: speaker-test/speaker-test.c:1207 +#, c-format +msgid "Using SMPTE ST-2095 -18.5dB AES FS band-limited pink noise\n" +msgstr "" + +#: speaker-test/speaker-test.c:1210 #, c-format msgid "Using 16 octaves of pink noise\n" msgstr "Používam 16 oktáv ružového šumu\n" -#: speaker-test/speaker-test.c:1147 +#: speaker-test/speaker-test.c:1213 #, c-format msgid "Sine wave rate is %.4fHz\n" msgstr "Frekvencia sínusovej vlny je %.4f Hz\n" -#: speaker-test/speaker-test.c:1150 +#: speaker-test/speaker-test.c:1216 #, c-format msgid "WAV file(s)\n" msgstr "Súbor(y) WAV\n" -#: speaker-test/speaker-test.c:1160 +#: speaker-test/speaker-test.c:1226 #, c-format msgid "Playback open error: %d,%s\n" msgstr "Chyba pri otváraní zariadenia prehrávania: %d, %s\n" -#: speaker-test/speaker-test.c:1166 +#: speaker-test/speaker-test.c:1232 #, c-format msgid "Setting of hwparams failed: %s\n" msgstr "Chyba pri nastavovaní hardvérových parametrov (hwparams): %s\n" -#: speaker-test/speaker-test.c:1170 +#: speaker-test/speaker-test.c:1236 #, c-format msgid "Setting of swparams failed: %s\n" msgstr "Chyba pri nastavovaní softvérových parametrov (swparams): %s\n" -#: speaker-test/speaker-test.c:1216 speaker-test/speaker-test.c:1238 +#: speaker-test/speaker-test.c:1282 speaker-test/speaker-test.c:1304 #, c-format msgid "Transfer failed: %s\n" msgstr "Chyba pri prenose: %s\n" -#: speaker-test/speaker-test.c:1224 +#: speaker-test/speaker-test.c:1290 #, c-format msgid "Time per period = %lf\n" msgstr "Čas na periódu = %lf\n" + +#, c-format +#~ msgid "service '%s' is not found in /etc/services\n" +#~ msgstr "Služba '%s' nebola nájdená v /etc/services\n" diff --git a/seq/Makefile.am b/seq/Makefile.am index 2c84cee..a617126 100644 --- a/seq/Makefile.am +++ b/seq/Makefile.am @@ -1 +1 @@ -SUBDIRS=aconnect aplaymidi aseqdump aseqnet +SUBDIRS=aconnect aplaymidi aplaymidi2 aseqdump aseqnet aseqsend diff --git a/seq/aconnect/aconnect.c b/seq/aconnect/aconnect.c index 7096feb..d782ef0 100644 --- a/seq/aconnect/aconnect.c +++ b/seq/aconnect/aconnect.c @@ -29,18 +29,15 @@ #include #include "gettext.h" -#ifdef SND_SEQ_PORT_CAP_INACTIVE -#define HANDLE_SHOW_ALL static int show_all; -#else -#define show_all 0 -#endif -static void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...) + +#if SND_LIB_VER(1, 2, 15) < SND_LIB_VERSION +static void error_handler(const char *file, int line, const char *function, int errcode, const char *fmt, ...) { va_list arg; - if (err == ENOENT) /* Ignore those misleading "warnings" */ + if (errcode == ENOENT) /* Ignore those misleading "warnings" */ return; va_start(arg, fmt); fprintf(stderr, "ALSA lib %s:%i:(%s) ", file, line, function); @@ -50,6 +47,16 @@ static void error_handler(const char *file, int line, const char *function, int putc('\n', stderr); va_end(arg); } +#else +static snd_lib_log_handler_t original_log_handler; +static void log_handler(int prio, int interface, const char *file, int line, const char *function, int errcode, const char *fmt, va_list arg) +{ + if (prio == SND_LOG_ERROR && errcode == ENOENT) /* Ignore those misleading "warnings" */ + return; + if (original_log_handler) + original_log_handler(prio, interface, file, line, function, errcode, fmt, arg); +} +#endif static void usage(void) { @@ -67,9 +74,7 @@ static void usage(void) printf(_(" aconnect -i|-o [-options]\n")); printf(_(" -i,--input list input (readable) ports\n")); printf(_(" -o,--output list output (writable) ports\n")); -#ifdef HANDLE_SHOW_ALL printf(_(" -a,--all show inactive ports, too\n")); -#endif printf(_(" -l,--list list current connections of each port\n")); printf(_(" * Remove all exported connections\n")); printf(_(" -x, --removeall\n")); @@ -84,15 +89,11 @@ static void usage(void) #define perm_ok(cap,bits) (((cap) & (bits)) == (bits)) -#ifdef SND_SEQ_PORT_DIR_INPUT static int check_direction(snd_seq_port_info_t *pinfo, int bit) { int dir = snd_seq_port_info_get_direction(pinfo); return !dir || (dir & bit); } -#else -#define check_direction(x, y) 1 -#endif static int check_permission(snd_seq_port_info_t *pinfo, int perm) { @@ -174,20 +175,16 @@ static void do_search_port(snd_seq_t *seq, int perm, action_func_t do_action) /* reset query info */ snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo)); snd_seq_port_info_set_port(pinfo, -1); -#ifdef HANDLE_SHOW_ALL if (show_all) snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_INACTIVE); -#endif count = 0; while (snd_seq_query_next_port(seq, pinfo) >= 0) { if (check_permission(pinfo, perm)) { do_action(seq, cinfo, pinfo, count); count++; } -#ifdef HANDLE_SHOW_ALL if (show_all) snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_INACTIVE); -#endif } } } @@ -205,7 +202,6 @@ static void print_port(snd_seq_t *seq ATTRIBUTE_UNUSED, snd_seq_client_info_get_name(cinfo), (snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? _("user") : _("kernel"))); -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION switch (snd_seq_client_info_get_midi_version(cinfo)) { case SND_SEQ_CLIENT_UMP_MIDI_1_0: printf(",UMP-MIDI1"); @@ -214,27 +210,21 @@ static void print_port(snd_seq_t *seq ATTRIBUTE_UNUSED, printf(",UMP-MIDI2"); break; } -#endif -#ifdef HANDLE_SHOW_ALL - if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_INACTIVE) - printf(",INACTIVE"); -#endif -#ifdef HAVE_SEQ_CLIENT_INFO_GET_CARD card = snd_seq_client_info_get_card(cinfo); -#endif if (card != -1) printf(",card=%d", card); -#ifdef HAVE_SEQ_CLIENT_INFO_GET_PID pid = snd_seq_client_info_get_pid(cinfo); -#endif if (pid != -1) printf(",pid=%d", pid); printf("]\n"); } - printf(" %3d '%-16s'\n", + printf(" %3d '%-16s'", snd_seq_port_info_get_port(pinfo), snd_seq_port_info_get_name(pinfo)); + if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_INACTIVE) + printf(" [INACTIVE]"); + printf("\n"); } static void print_port_and_subs(snd_seq_t *seq, snd_seq_client_info_t *cinfo, @@ -298,11 +288,7 @@ enum { SUBSCRIBE, UNSUBSCRIBE, LIST, REMOVE_ALL }; -#ifdef HANDLE_SHOW_ALL #define ACONNECT_OPTS "dior:t:elxa" -#else -#define ACONNECT_OPTS "dior:t:elx" -#endif static const struct option long_option[] = { {"disconnect", 0, NULL, 'd'}, @@ -313,9 +299,7 @@ static const struct option long_option[] = { {"exclusive", 0, NULL, 'e'}, {"list", 0, NULL, 'l'}, {"removeall", 0, NULL, 'x'}, -#ifdef HANDLE_SHOW_ALL {"all", 0, NULL, 'a'}, -#endif {NULL, 0, NULL, 0}, }; @@ -369,12 +353,10 @@ int main(int argc, char **argv) case 'x': command = REMOVE_ALL; break; -#ifdef HANDLE_SHOW_ALL case 'a': command = LIST; show_all = 1; break; -#endif default: usage(); exit(1); @@ -386,7 +368,11 @@ int main(int argc, char **argv) return 1; } +#if SND_LIB_VER(1, 2, 15) < SND_LIB_VERSION snd_lib_error_set_handler(error_handler); +#else + original_log_handler = snd_lib_log_set_handler(log_handler); +#endif switch (command) { case LIST: diff --git a/seq/aplaymidi/aplaymidi.c b/seq/aplaymidi/aplaymidi.c index 66038e2..7aeea82 100644 --- a/seq/aplaymidi/aplaymidi.c +++ b/seq/aplaymidi/aplaymidi.c @@ -30,9 +30,7 @@ #include #include #include "version.h" -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION #include -#endif /* * 31.25 kbaud, one start bit, eight data bits, two stop bits. @@ -78,9 +76,7 @@ static int file_offset; /* current offset in input file */ static int num_tracks; static struct track *tracks; static int smpte_timing; -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION static int ump_mode; -#endif /* prints an error message to stderr */ static void errormsg(const char *msg, ...) @@ -685,7 +681,6 @@ static int fill_legacy_event(struct event* event, snd_seq_event_t *ev) return 0; } -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION static unsigned char to_ump_status(unsigned char ev_type) { switch (ev_type) { @@ -762,13 +757,10 @@ static int fill_ump_event(struct event* event, snd_seq_ump_event_t *ump_ev, snd_seq_ev_set_ump_data(ump_ev, &ump, sizeof(ump)); return 0; } -#endif /* HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION */ static void play_midi(void) { -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION snd_seq_ump_event_t ump_ev; -#endif snd_seq_event_t ev; int i, max_tick, err; @@ -830,7 +822,7 @@ static void play_midi(void) if (err < 0) continue; } -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION + if (ump_mode) { err = fill_ump_event(event, &ump_ev, &ev); if (err < 0) @@ -839,7 +831,6 @@ static void play_midi(void) check_snd("output event", err); continue; } -#endif /* this blocks when the output pool has been filled */ err = snd_seq_event_output(seq, &ev); @@ -957,9 +948,7 @@ static void usage(const char *argv0) "-V, --version print current version\n" "-l, --list list all possible output ports\n" "-p, --port=client:port,... set port(s) to play to\n" -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION "-u, --ump=version UMP output (only version=1 is supported)\n" -#endif "-d, --delay=seconds delay after song ends\n", argv0); } @@ -969,12 +958,7 @@ static void version(void) puts("aplaymidi version " SND_UTIL_VERSION_STR); } -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION #define OPTIONS "hVlp:d:u:" -#else -#define OPTIONS "hVlp:d:" -#endif - int main(int argc, char *argv[]) { @@ -984,9 +968,7 @@ int main(int argc, char *argv[]) {"version", 0, NULL, 'V'}, {"list", 0, NULL, 'l'}, {"port", 1, NULL, 'p'}, -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION {"ump", 1, NULL, 'u'}, -#endif {"delay", 1, NULL, 'd'}, {0} }; @@ -1013,15 +995,11 @@ int main(int argc, char *argv[]) case 'd': end_delay = atoi(optarg); break; -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION case 'u': - if (strcmp(optarg, "1")) { - errormsg("Only MIDI 1.0 is supported"); - return 1; - } - ump_mode = 1; + ump_mode = atoi(optarg); + if (ump_mode < 0 || ump_mode > 1) + fatal("Only MIDI 1.0 is supported"); break; -#endif default: usage(argv[0]); return 1; @@ -1029,13 +1007,11 @@ int main(int argc, char *argv[]) } -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION if (ump_mode) { int err; err = snd_seq_set_client_midi_version(seq, SND_SEQ_CLIENT_UMP_MIDI_1_0); check_snd("set midi version", err); } -#endif if (do_list) { list_ports(); diff --git a/seq/aplaymidi/arecordmidi.1 b/seq/aplaymidi/arecordmidi.1 index 78b3a3a..585f2fc 100644 --- a/seq/aplaymidi/arecordmidi.1 +++ b/seq/aplaymidi/arecordmidi.1 @@ -66,7 +66,7 @@ will generate a "format 0" file. .I \-m,\-\-metronome=client:port Plays a metronome signal on the specified sequencer port. -Metronome sounds are played on channel 10, MIDI notes 33 & 34 (GM2/GS/XG +Metronome sounds are played on channel 10, MIDI notes 33 & 34 (GM2/GS/XG metronome standard notes), with velocity 100 and duration 1. .TP @@ -74,7 +74,7 @@ metronome standard notes), with velocity 100 and duration 1. Sets the time signature for the MIDI file and metronome. The time signature is specified as usual with two numbers, representing -the numerator and denominator of the time signature as it would be +the numerator and denominator of the time signature as it would be notated. The denominator must be a power of two. Both numbers should be separated by a colon. The time signature is 4:4 by default. diff --git a/seq/aplaymidi2/Makefile.am b/seq/aplaymidi2/Makefile.am new file mode 100644 index 0000000..8985382 --- /dev/null +++ b/seq/aplaymidi2/Makefile.am @@ -0,0 +1,5 @@ +AM_CPPFLAGS = -I$(top_srcdir)/include +EXTRA_DIST = aplaymidi2.1 arecordmidi2.1 + +bin_PROGRAMS = aplaymidi2 arecordmidi2 +man_MANS = aplaymidi2.1 arecordmidi2.1 diff --git a/seq/aplaymidi2/aplaymidi2.1 b/seq/aplaymidi2/aplaymidi2.1 new file mode 100644 index 0000000..6817962 --- /dev/null +++ b/seq/aplaymidi2/aplaymidi2.1 @@ -0,0 +1,84 @@ +.TH APLAYMIDI2 1 "4 July 2024" + +.SH NAME +aplaymidi2 \- play MIDI Clip Files + +.SH SYNOPSIS +.B aplaymidi2 +\-p client:port[,...] midi2file ... + +.SH DESCRIPTION +.B aplaymidi2 +is a command-line utility that plays the specified MIDI Clip file(s) to one +or more ALSA sequencer ports. + +.SH OPTIONS + +.TP +.I \-h, \-\-help +Prints a list of options. + +.TP +.I \-V, \-\-version +Prints the current version. + +.TP +.I \-p, \-\-port=client:port,... +Sets the sequencer port(s) to which the events in the MIDI Clip file(s) are +sent. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +Multiple ports can be specified to allow playback of MIDI Clip file(s) that +contain events for multiple devices (ports) corresponding to the +multiple UMP Groups. + +For compatibility with +.B pmidi(1), +the port specification is taken from the +.I ALSA_OUTPUT_PORTS +environment variable if none is given on the command line. + +.B aplaymidi2 +supports only basic UMP events: in addition to the standard MIDI1 and +MIDI2 CVMs and 7bit SysEx, only the following are supported: +DCTPQ, DC, Set Tempo, Start Clip, End Clip. +Lyrics and other meta data in Flex Data are printed, too, unless +\fI\-s\fP option is given. + +The multiple output ports are useful when the given MIDI Clip file +contains the UMP packets for multiple Groups. +When the destination port is a UMP MIDI 2.0 port, the single +connection should suffice, though, since a MIDI 2.0 port can process +the inputs for multiple Groups. For other cases (e.g. connecting to a +legacy MIDI port), you would need to specify the destination port per +Group. If undefined, it's sent to the first destination port as +default. + +.TP +.I \-d, \-\-delay=seconds +Specifies how long to wait after the end of each MIDI Clip file, +to allow the last notes to die away. +Default is 2 seconds. + +.TP +.I \-s, \-\-silent +Don't show message texts. + +.TP +.I \-a, \-\-passall +Pass all UMP packets as is. + +As default, \fBaplaymidi2\fP passes only MIDI1 and MIDI2 channel voice +messages and process other UMP packets internally. +With this option, it passes all UMP packets to the target. + +.SH SEE ALSO +pmidi(1) +.br +aplaymidi(1) + +.SH AUTHOR +Takashi Iwai diff --git a/seq/aplaymidi2/aplaymidi2.c b/seq/aplaymidi2/aplaymidi2.c new file mode 100644 index 0000000..f71958d --- /dev/null +++ b/seq/aplaymidi2/aplaymidi2.c @@ -0,0 +1,581 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * aplaymidi2.c - simple player of a MIDI Clip File over ALSA sequencer + */ + +#include "aconfig.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "version.h" + +static snd_seq_t *seq; +static int client; +static int port_count; +static snd_seq_addr_t ports[16]; +static int queue; +static int end_delay = 2; +static int silent; +static int passall; + +static unsigned int _current_tempo = 50000000; /* default 120 bpm */ +static unsigned int tempo_base = 10; +static unsigned int current_tick; + +/* prints an error message to stderr */ +static void errormsg(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); +} + +/* prints an error message to stderr, and dies */ +static void fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +/* memory allocation error handling */ +static void check_mem(void *p) +{ + if (!p) + fatal("Out of memory"); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +/* open and initialize the sequencer client */ +static void init_seq(void) +{ + int err; + + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0); + check_snd("open sequencer", err); + + err = snd_seq_set_client_name(seq, "aplaymidi2"); + check_snd("set client name", err); + + client = snd_seq_client_id(seq); + check_snd("get client id", client); + + err = snd_seq_set_client_midi_version(seq, SND_SEQ_CLIENT_UMP_MIDI_2_0); + check_snd("set midi version", err); +} + +/* parses one or more port addresses from the string */ +static void parse_ports(const char *arg) +{ + char *buf, *s, *port_name; + int err; + + /* make a copy of the string because we're going to modify it */ + buf = strdup(arg); + check_mem(buf); + + for (port_name = s = buf; s; port_name = s + 1) { + /* Assume that ports are separated by commas. We don't use + * spaces because those are valid in client names. */ + s = strchr(port_name, ','); + if (s) + *s = '\0'; + + ++port_count; + if (port_count > 16) + fatal("Too many ports specified"); + + err = snd_seq_parse_address(seq, &ports[port_count - 1], port_name); + if (err < 0) + fatal("Invalid port %s - %s", port_name, snd_strerror(err)); + } + + free(buf); +} + +/* create a source port to send from */ +static void create_source_port(void) +{ + snd_seq_port_info_t *pinfo; + int err; + + snd_seq_port_info_alloca(&pinfo); + + /* the first created port is 0 anyway, but let's make sure ... */ + snd_seq_port_info_set_port(pinfo, 0); + snd_seq_port_info_set_port_specified(pinfo, 1); + + snd_seq_port_info_set_name(pinfo, "aplaymidi2"); + + snd_seq_port_info_set_capability(pinfo, 0); /* sic */ + snd_seq_port_info_set_type(pinfo, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | + SND_SEQ_PORT_TYPE_APPLICATION); + + err = snd_seq_create_port(seq, pinfo); + check_snd("create port", err); +} + +/* create a queue */ +static void create_queue(void) +{ + if (!snd_seq_has_queue_tempo_base(seq)) + tempo_base = 1000; + + queue = snd_seq_alloc_named_queue(seq, "aplaymidi2"); + check_snd("create queue", queue); +} + +/* connect to destination ports */ +static void connect_ports(void) +{ + int i, err; + + for (i = 0; i < port_count; ++i) { + err = snd_seq_connect_to(seq, 0, ports[i].client, ports[i].port); + if (err < 0) + fatal("Cannot connect to port %d:%d - %s", + ports[i].client, ports[i].port, snd_strerror(err)); + } +} + +/* read 32bit word and convert to native endian: + * return 0 on success, -1 on error + */ +static int read_word(FILE *file, uint32_t *dest) +{ + uint32_t v; + + if (fread(&v, 4, 1, file) != 1) + return -1; + *dest = be32toh(v); + return 0; +} + +/* read a UMP packet: return the number of packets, -1 on error */ +static int read_ump_packet(FILE *file, uint32_t *buf) +{ + snd_ump_msg_hdr_t *h = (snd_ump_msg_hdr_t *)buf; + + int i, num; + + if (read_word(file, buf) < 0) + return -1; + num = snd_ump_packet_length(h->type); + for (i = 1; i < num; i++) { + if (read_word(file, buf + i) < 0) + return -1; + } + return num; +} + +/* read the file header and verify it's MIDI Clip File: return 0 on success */ +static int verify_file_header(FILE *file) +{ + unsigned char buf[8]; + + if (fread(buf, 1, 8, file) != 8) + return -1; + if (memcmp(buf, "SMF2CLIP", 8)) + return -1; + return 0; +} + +/* return the current tempo, corrected to be sent to host */ +static int current_tempo(void) +{ + if (tempo_base != 10) + return _current_tempo / 100; /* down to us */ + return _current_tempo; +} + +/* send a timer event */ +static void send_timer_event(unsigned int type, unsigned int val) +{ + snd_seq_ump_event_t ev = { + .type = type, + .flags = SND_SEQ_TIME_STAMP_TICK | SND_SEQ_EVENT_LENGTH_FIXED, + }; + + ev.queue = queue; + ev.source.port = 0; + ev.time.tick = current_tick; + + ev.dest.client = SND_SEQ_CLIENT_SYSTEM; + ev.dest.port = SND_SEQ_PORT_SYSTEM_TIMER; + ev.data.queue.queue = queue; + ev.data.queue.param.value = val; + + snd_seq_ump_event_output(seq, &ev); +} + +/* set DCTPQ */ +static void set_dctpq(unsigned int ppq) +{ + snd_seq_queue_tempo_t *queue_tempo; + + snd_seq_queue_tempo_alloca(&queue_tempo); + snd_seq_queue_tempo_set_tempo(queue_tempo, current_tempo()); + snd_seq_queue_tempo_set_ppq(queue_tempo, ppq); + snd_seq_queue_tempo_set_tempo_base(queue_tempo, tempo_base); + + if (snd_seq_set_queue_tempo(seq, queue, queue_tempo) < 0) + errormsg("Cannot set queue tempo (%d)", queue); +} + +/* set DC */ +static void set_dc(unsigned int ticks) +{ + current_tick += ticks; +} + +/* set tempo event */ +static void set_tempo(unsigned int tempo) +{ + _current_tempo = tempo; + send_timer_event(SND_SEQ_EVENT_TEMPO, current_tempo()); +} + +/* start clip */ +static void start_clip(void) +{ + if (snd_seq_start_queue(seq, queue, NULL) < 0) + errormsg("Cannot start queue (%d)", queue); +} + +/* end clip */ +static void end_clip(void) +{ + send_timer_event(SND_SEQ_EVENT_STOP, 0); +} + +/* send a UMP packet */ +static void send_ump(const uint32_t *ump, int len) +{ + snd_seq_ump_event_t ev = { + .flags = SND_SEQ_TIME_STAMP_TICK | SND_SEQ_EVENT_LENGTH_FIXED | + SND_SEQ_EVENT_UMP, + }; + int group; + + memcpy(ev.ump, ump, len * 4); + + ev.queue = queue; + ev.source.port = 0; + ev.time.tick = current_tick; + group = snd_ump_msg_group(ump); + if (group >= port_count) + ev.dest = ports[0]; + else + ev.dest = ports[group]; + + snd_seq_ump_event_output(seq, &ev); +} + +struct flexdata_text_prefix { + unsigned char status_bank; + unsigned char status; + const char *prefix; +}; + +static struct flexdata_text_prefix text_prefix[] = { + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PROJECT_NAME, + .prefix = "Project" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_SONG_NAME, + .prefix = "Song" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_MIDI_CLIP_NAME, + .prefix = "MIDI Clip" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_COPYRIGHT_NOTICE, + .prefix = "Copyright" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_COMPOSER_NAME, + .prefix = "Composer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICIST_NAME, + .prefix = "Lyricist" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_ARRANGER_NAME, + .prefix = "Arranger" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PUBLISHER_NAME, + .prefix = "Publisher" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PRIMARY_PERFORMER, + .prefix = "Performer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_ACCOMPANY_PERFORMAER, + .prefix = "Accompany Performer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_DATE, + .prefix = "Recording Date" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_LOCATION, + .prefix = "Recording Location" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS, + .prefix = "Lyrics" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS_LANGUAGE, + .prefix = "Lyrics Language" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY, + .prefix = "Ruby" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY_LANGUAGE, + .prefix = "Ruby Language" }, + {} +}; + +static void show_text(const uint32_t *ump) +{ + static unsigned char textbuf[256]; + static int len; + const snd_ump_msg_flex_data_t *fh = + (const snd_ump_msg_flex_data_t *)ump; + const char *prefix; + int i; + + if (fh->meta.format == SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE || + fh->meta.format == SND_UMP_FLEX_DATA_MSG_FORMAT_START) + len = 0; + + for (i = 0; i < 12 && len < (int)sizeof(textbuf); i++) { + textbuf[len] = snd_ump_get_byte(ump, 4 + i); + if (!textbuf[len]) + break; + switch (textbuf[len]) { + case 0x0a: /* end of paragraph */ + case 0x0d: /* end of line */ + textbuf[len] = '\n'; + break; + } + len++; + } + + if (fh->meta.format != SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE && + fh->meta.format != SND_UMP_FLEX_DATA_MSG_FORMAT_END) + return; + + if (len >= (int)sizeof(textbuf)) + len = sizeof(textbuf) - 1; + textbuf[len] = 0; + + prefix = NULL; + for (i = 0; text_prefix[i].status_bank; i++) { + if (text_prefix[i].status_bank == fh->meta.status_bank && + text_prefix[i].status == fh->meta.status) { + prefix = text_prefix[i].prefix; + break; + } + } + + if (prefix) { + printf("%s: %s\n", prefix, textbuf); + } else { + printf("(%d:%d): %s\n", fh->meta.status_bank, fh->meta.status, + textbuf); + } + + len = 0; +} + +/* play the given MIDI Clip File content */ +static void play_midi(FILE *file) +{ + uint32_t ump[4]; + int len; + + current_tick = 0; + + while ((len = read_ump_packet(file, ump)) > 0) { + const snd_ump_msg_hdr_t *h = (snd_ump_msg_hdr_t *)ump; + + if (passall) + send_ump(ump, len); + + if (h->type == SND_UMP_MSG_TYPE_UTILITY) { + const snd_ump_msg_utility_t *uh = + (const snd_ump_msg_utility_t *)ump; + switch (h->status) { + case SND_UMP_UTILITY_MSG_STATUS_DCTPQ: + set_dctpq(uh->dctpq.ticks); + continue; + case SND_UMP_UTILITY_MSG_STATUS_DC: + set_dc(uh->dctpq.ticks); + continue; + } + } else if (h->type == SND_UMP_MSG_TYPE_FLEX_DATA) { + const snd_ump_msg_flex_data_t *fh = + (const snd_ump_msg_flex_data_t *)ump; + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_TEMPO) { + set_tempo(fh->set_tempo.tempo); + continue; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_METADATA || + fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT) { + if (!silent) + show_text(ump); + continue; + } + } else if (h->type == SND_UMP_MSG_TYPE_STREAM) { + const snd_ump_msg_stream_t *sh = + (const snd_ump_msg_stream_t *)ump; + switch (sh->gen.status) { + case SND_UMP_STREAM_MSG_STATUS_START_CLIP: + start_clip(); + continue; + case SND_UMP_STREAM_MSG_STATUS_END_CLIP: + end_clip(); + continue; + } + } else if (!passall && + (h->type == SND_UMP_MSG_TYPE_MIDI1_CHANNEL_VOICE || + h->type == SND_UMP_MSG_TYPE_DATA || + h->type == SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE)) { + send_ump(ump, len); + } + } + + snd_seq_drain_output(seq); + snd_seq_sync_output_queue(seq); + + /* give the last notes time to die away */ + if (end_delay > 0) + sleep(end_delay); +} + +static void play_file(const char *file_name) +{ + FILE *file; + + if (!strcmp(file_name, "-")) + file = stdin; + else + file = fopen(file_name, "rb"); + if (!file) { + errormsg("Cannot open %s - %s", file_name, strerror(errno)); + return; + } + + if (verify_file_header(file) < 0) { + errormsg("%s is not a MIDI Clip File", file_name); + goto error; + } + + play_midi(file); + + error: + if (file != stdin) + fclose(file); +} + +static void usage(const char *argv0) +{ + printf( + "Usage: %s -p client:port[,...] [-d delay] midifile ...\n" + "-h, --help this help\n" + "-V, --version print current version\n" + "-p, --port=client:port,... set port(s) to play to\n" + "-d, --delay=seconds delay after song ends\n" + "-s, --silent don't show texts\n" + "-a, --passall pass all UMP packets as-is\n", + argv0); +} + +static void version(void) +{ + puts("aplaymidi2 version " SND_UTIL_VERSION_STR); +} + +int main(int argc, char *argv[]) +{ + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"port", 1, NULL, 'p'}, + {"delay", 1, NULL, 'd'}, + {"silent", 0, NULL, 's'}, + {"passall", 0, NULL, 'a'}, + {0} + }; + int c; + + init_seq(); + + while ((c = getopt_long(argc, argv, "hVp:d:sa", + long_options, NULL)) != -1) { + switch (c) { + case 'h': + usage(argv[0]); + return 0; + case 'V': + version(); + return 0; + case 'p': + parse_ports(optarg); + break; + case 'd': + end_delay = atoi(optarg); + break; + case 's': + silent = 1; + break; + case 'a': + passall = 1; + break; + default: + usage(argv[0]); + return 1; + } + } + + + if (port_count < 1) { + /* use env var for compatibility with pmidi */ + const char *ports_str = getenv("ALSA_OUTPUT_PORTS"); + if (ports_str) + parse_ports(ports_str); + if (port_count < 1) { + errormsg("Please specify at least one port with --port."); + return 1; + } + } + if (optind >= argc) { + errormsg("Please specify a file to play."); + return 1; + } + + create_source_port(); + create_queue(); + connect_ports(); + + for (; optind < argc; optind++) + play_file(argv[optind]); + + snd_seq_close(seq); + return 0; +} diff --git a/seq/aplaymidi2/arecordmidi2.1 b/seq/aplaymidi2/arecordmidi2.1 new file mode 100644 index 0000000..c20db8d --- /dev/null +++ b/seq/aplaymidi2/arecordmidi2.1 @@ -0,0 +1,110 @@ +.TH ARECORDMIDI2 1 "4 July 2024" + +.SH NAME +arecordmidi2 \- record a MIDI Clip file + +.SH SYNOPSIS +.B arecordmidi2 +[options] midi2file + +.SH DESCRIPTION +.B arecordmidi2 +is a command-line utility that records a MIDI Clip file from one or +more ALSA sequencer ports. + +To stop recording, press Ctrl+C. + +When \fB\-\fP is passed to the MIDI Clip file argument, +it's recorded to stdout. It implies \fI\-s\fP option, too. + +.SH OPTIONS + +.TP +.I \-h,\-\-help +Prints a list of options. + +.TP +.I \-V,\-\-version +Prints the current version. + +.TP +.I \-p,\-\-port=client:port,... +Sets the sequencer port(s) from which events are recorded. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +\fBarecordmidi2\fP creates a UMP Endpoint containing the same number +of Function Blocks as specified by this option, each of which is +connected to the specified port as a source. + +When no source ports are specified with \fI\-p\fP option, +\fBarecordmidi2\fP creates a UMP Endpoint with full 16 Function Blocks +and records from those inputs. User can connect the sequencer ports +freely via \fBaconnect\fP, for example. This mode can be used +together with the interactive mode via \fI\-r\fP option. + +.TP +.I \-b,\-\-bpm=beats +Sets the musical tempo of the MIDI file, in beats per minute. +The default value is 120 BPM. + +.TP +.I \-t,\-\-ticks=ticks +Sets the resolution of timestamps (ticks) in the MIDI file, +in ticks per beat. +The default value is 384 ticks/beat. + +.TP +.I \-i,\-\-timesig=numerator:denominator +Sets the time signature for the MIDI file. + +The time signature is specified as usual with two numbers, representing +the numerator and denominator of the time signature as it would be +notated. The denominator must be a power of two. Both numbers should be +separated by a colon. The time signature is 4:4 by default. + +.TP +.I \-n,\-\-num-events=events +Stops the recording after receiving the given number of events. + +.TP +.I \-u,\-\-ump=version +Sets the UMP MIDI protocol version. Either 1 or 2 has to be given for +MIDI 1.0 and MIDI 2.0 protocol, respectively. +Default is 1. + +.TP +.I \-r,\-\-interactive +Run in the interactive mode. \fBarecordmidi2\fP waits for a RETURN +key input from the terminal to start the recording. After starting, +the recording ends when another RETURN key is input from the +terminal. The received events before the start of recording are +discarded. + +.TP +.I \-s,\-\-silent +Don't print messages to stdout. + +.TP +.I \-P,\-\-profile=file +Read the UMP data from the given file and put them into the +configuration section of the recorded output. +The file must contain only valid UMP data encoded in big-endian. + +.TP +.I \-\-song=text, \-\-clip=text, \-\-copyright=text, \-\-composer=text, \ +\-\-lyricist=text, \-\-arranger=text, \-\-publisher=text, \ +\-\-performer=text \-\-accompany=text, \-\-date=text, \-\-location=text +Put the given meta data text in the configuration section. + +.SH SEE ALSO +arecordmidi(1) +.br +aplaymidi2(1) + +.SH AUTHOR +Takashi Iwai + + diff --git a/seq/aplaymidi2/arecordmidi2.c b/seq/aplaymidi2/arecordmidi2.c new file mode 100644 index 0000000..467af65 --- /dev/null +++ b/seq/aplaymidi2/arecordmidi2.c @@ -0,0 +1,717 @@ +/* + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "aconfig.h" +#include "version.h" + +static snd_seq_t *seq; +static int client; +static int port_count; +static snd_seq_addr_t *ports; +static int queue; +static int midi_version = 1; +static int beats = 120; +static int ticks = 384; +static int tempo_base = 10; +static volatile sig_atomic_t stop; +static int ts_num = 4; /* time signature: numerator */ +static int ts_div = 4; /* time signature: denominator */ +static int last_tick; +static int silent; +static const char *profile_ump_file; + +#define MAX_METADATA 16 +static int metadata_num; +static unsigned int metadata_types[MAX_METADATA]; +static const char *metadata_texts[MAX_METADATA]; + +/* 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, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +/* memory allocation error handling */ +static void check_mem(void *p) +{ + if (!p) + fatal("Out of memory"); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +/* open a sequencer client */ +static void init_seq(void) +{ + int err; + + /* open sequencer */ + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0); + check_snd("open sequencer", err); + + /* find out our client's id */ + client = snd_seq_client_id(seq); + check_snd("get client id", client); +} + +/* set up UMP virtual client/port */ +static void create_ump_client(void) +{ + snd_ump_endpoint_info_t *ep; + snd_ump_block_info_t *blk; + snd_seq_port_info_t *pinfo; + int num_groups; + int i, err; + + /* in passive mode, create full 16 groups */ + if (port_count) + num_groups = port_count; + else + num_groups = 16; + + /* create a UMP Endpoint */ + snd_ump_endpoint_info_alloca(&ep); + snd_ump_endpoint_info_set_name(ep, "arecordmidi2"); + if (midi_version == 1) { + snd_ump_endpoint_info_set_protocol_caps(ep, SND_UMP_EP_INFO_PROTO_MIDI1); + snd_ump_endpoint_info_set_protocol(ep, SND_UMP_EP_INFO_PROTO_MIDI1); + } else { + snd_ump_endpoint_info_set_protocol_caps(ep, SND_UMP_EP_INFO_PROTO_MIDI2); + snd_ump_endpoint_info_set_protocol(ep, SND_UMP_EP_INFO_PROTO_MIDI2); + } + snd_ump_endpoint_info_set_num_blocks(ep, num_groups); + + err = snd_seq_create_ump_endpoint(seq, ep, num_groups); + check_snd("create UMP endpoint", err); + + /* create UMP Function Blocks */ + snd_ump_block_info_alloca(&blk); + for (i = 0; i < num_groups; i++) { + char blkname[32]; + + sprintf(blkname, "Group %d", i + 1); + snd_ump_block_info_set_name(blk, blkname); + snd_ump_block_info_set_direction(blk, SND_UMP_DIR_INPUT); + snd_ump_block_info_set_first_group(blk, i); + snd_ump_block_info_set_num_groups(blk, 1); + snd_ump_block_info_set_ui_hint(blk, SND_UMP_BLOCK_UI_HINT_RECEIVER); + + err = snd_seq_create_ump_block(seq, i, blk); + check_snd("create UMP block", err); + } + + /* toggle timestamping for all input ports */ + snd_seq_port_info_alloca(&pinfo); + for (i = 0; i <= num_groups; i++) { + err = snd_seq_get_port_info(seq, i, pinfo); + check_snd("get port info", err); + snd_seq_port_info_set_timestamping(pinfo, 1); + snd_seq_port_info_set_timestamp_queue(pinfo, queue); + snd_seq_set_port_info(seq, i, pinfo); + check_snd("set port info", err); + } +} + +/* parses one or more port addresses from the string */ +static void parse_ports(const char *arg) +{ + char *buf, *s, *port_name; + int err; + + /* make a copy of the string because we're going to modify it */ + buf = strdup(arg); + check_mem(buf); + + for (port_name = s = buf; s; port_name = s + 1) { + /* Assume that ports are separated by commas. We don't use + * spaces because those are valid in client names. + */ + s = strchr(port_name, ','); + if (s) + *s = '\0'; + + ++port_count; + ports = realloc(ports, port_count * sizeof(snd_seq_addr_t)); + check_mem(ports); + + err = snd_seq_parse_address(seq, &ports[port_count - 1], port_name); + if (err < 0) + fatal("Invalid port %s - %s", port_name, snd_strerror(err)); + } + + free(buf); +} + +/* parses time signature specification */ +static void time_signature(const char *arg) +{ + long x = 0; + char *sep; + + x = strtol(arg, &sep, 10); + if (x < 1 || x > 64 || *sep != ':') + fatal("Invalid time signature (%s)", arg); + ts_num = x; + x = strtol(++sep, NULL, 10); + if (x < 1 || x > 64) + fatal("Invalid time signature (%s)", arg); + ts_div = x; +} + +/* create a queue, set up the default tempo */ +static void create_queue(void) +{ + snd_seq_queue_tempo_t *tempo; + + if (!snd_seq_has_queue_tempo_base(seq)) + tempo_base = 1000; + + queue = snd_seq_alloc_named_queue(seq, "arecordmidi2"); + check_snd("create queue", queue); + + snd_seq_queue_tempo_alloca(&tempo); + if (tempo_base == 1000) + snd_seq_queue_tempo_set_tempo(tempo, 60000000 / beats); + else + snd_seq_queue_tempo_set_tempo(tempo, (unsigned int)(6000000000ULL / beats)); + snd_seq_queue_tempo_set_ppq(tempo, ticks); + snd_seq_queue_tempo_set_tempo_base(tempo, tempo_base); + if (snd_seq_set_queue_tempo(seq, queue, tempo) < 0) + fatal("Cannot set queue tempo (%d)", queue); +} + +/* connect to the input ports */ +static void connect_ports(void) +{ + int i, err; + + for (i = 0; i < port_count; ++i) { + err = snd_seq_connect_from(seq, i + 1, + ports[i].client, ports[i].port); + check_snd("port connection", err); + } +} + +/* write the given UMP packet */ +static void write_ump(FILE *file, const void *src) +{ + const snd_ump_msg_hdr_t *h = src; + const uint32_t *p = src; + uint32_t v; + int len; + + len = snd_ump_packet_length(h->type); + while (len-- > 0) { + v = htobe32(*p++); + fwrite(&v, 4, 1, file); + } +} + +/* write a DC message */ +static void write_dcs(FILE *file, unsigned int t) +{ + snd_ump_msg_dc_t d = {}; + + d.type = SND_UMP_MSG_TYPE_UTILITY; + d.status = SND_UMP_UTILITY_MSG_STATUS_DC; + d.ticks = t; + write_ump(file, &d); +} + +/* write a DCTPQ message */ +static void write_dctpq(FILE *file) +{ + snd_ump_msg_dctpq_t d = {}; + + d.type = SND_UMP_MSG_TYPE_UTILITY; + d.status = SND_UMP_UTILITY_MSG_STATUS_DCTPQ; + d.ticks = ticks; + write_ump(file, &d); +} + +/* write a Start Clip message */ +static void write_start_clip(FILE *file) +{ + snd_ump_msg_stream_gen_t d = {}; + + d.type = SND_UMP_MSG_TYPE_STREAM; + d.status = SND_UMP_STREAM_MSG_STATUS_START_CLIP; + write_ump(file, &d); +} + +/* write an End Clip message */ +static void write_end_clip(FILE *file) +{ + snd_ump_msg_stream_gen_t d = {}; + + d.type = SND_UMP_MSG_TYPE_STREAM; + d.status = SND_UMP_STREAM_MSG_STATUS_END_CLIP; + write_ump(file, &d); +} + +/* write a Set Tempo message */ +static void write_tempo(FILE *file) +{ + snd_ump_msg_set_tempo_t d = {}; + + d.type = SND_UMP_MSG_TYPE_FLEX_DATA; + d.group = 0; + d.format = SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE; + d.addrs = SND_UMP_FLEX_DATA_MSG_ADDR_GROUP; + d.status_bank = SND_UMP_FLEX_DATA_MSG_BANK_SETUP; + d.status = SND_UMP_FLEX_DATA_MSG_STATUS_SET_TEMPO; + d.tempo = (unsigned int)(6000000000ULL / beats); + write_ump(file, &d); +} + +/* write a Set Time Signature message */ +static void write_time_sig(FILE *file) +{ + snd_ump_msg_set_time_sig_t d = {}; + + d.type = SND_UMP_MSG_TYPE_FLEX_DATA; + d.group = 0; + d.format = SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE; + d.addrs = SND_UMP_FLEX_DATA_MSG_ADDR_GROUP; + d.status_bank = SND_UMP_FLEX_DATA_MSG_BANK_SETUP; + d.status = SND_UMP_FLEX_DATA_MSG_STATUS_SET_TIME_SIGNATURE; + d.numerator = ts_num; + d.denominator = ts_div; + d.num_notes = 8; + write_ump(file, &d); +} + +/* record the delta time from the last event */ +static void delta_time(FILE *file, const snd_seq_ump_event_t *ev) +{ + int diff = ev->time.tick - last_tick; + + if (diff <= 0) + return; + write_dcs(file, diff); + last_tick = ev->time.tick; +} + +static void record_event(FILE *file, const snd_seq_ump_event_t *ev) +{ + /* ignore events without proper timestamps */ + if (ev->queue != queue || !snd_seq_ev_is_tick(ev) || + !snd_seq_ev_is_ump(ev)) + return; + + delta_time(file, ev); + write_ump(file, ev->ump); +} + +/* read a UMP raw (big-endian) packet, return the packet length in words */ +static int read_ump_raw(FILE *file, uint32_t *buf) +{ + uint32_t v; + int i, num; + + if (fread(buf, 4, 1, file) != 1) + return 0; + v = be32toh(*buf); + num = snd_ump_packet_length(snd_ump_msg_hdr_type(v)); + for (i = 1; i < num; i++) { + if (fread(buf + i, 4, 1, file) != 1) + return 0; + } + return num; +} + +/* read the profile UMP data and write to the configuration */ +static void write_profiles(FILE *file) +{ + FILE *fp; + uint32_t ump[4]; + int len; + + if (!profile_ump_file) + return; + + fp = fopen(profile_ump_file, "rb"); + if (!fp) + fatal("cannot open the profile '%s'", profile_ump_file); + + while (!feof(fp)) { + len = read_ump_raw(fp, ump); + if (!len) + break; + fwrite(ump, 4, len, file); + } + + fclose(fp); +} + +/* write Flex Data metadata text given by command lines */ +static void write_metadata(FILE *file, unsigned int type, const char *text) +{ + int len = strlen(text), size; + unsigned int format = SND_UMP_FLEX_DATA_MSG_FORMAT_START; + + while (len > 0) { + snd_ump_msg_flex_data_t d = {}; + + if (len <= 12) { + if (format == SND_UMP_FLEX_DATA_MSG_FORMAT_CONTINUE) + format = SND_UMP_FLEX_DATA_MSG_FORMAT_END; + else + format = SND_UMP_FLEX_DATA_MSG_FORMAT_SINGLE; + size = len; + } else { + size = 12; + } + + d.meta.type = SND_UMP_MSG_TYPE_FLEX_DATA; + d.meta.addrs = SND_UMP_FLEX_DATA_MSG_ADDR_GROUP; + d.meta.status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA; + d.meta.status = type; + d.meta.format = format; + + /* keep the data in big endian */ + d.raw[0] = htobe32(d.raw[0]); + /* strings are copied as-is in big-endian */ + memcpy(d.meta.data, text, size); + + fwrite(d.raw, 4, 4, file); + len -= size; + text += size; + format = SND_UMP_FLEX_DATA_MSG_FORMAT_CONTINUE; + } +} + +/* write MIDI Clip file header and the configuration packets */ +static void write_file_header(FILE *file) +{ + int i; + + /* header id */ + fwrite("SMF2CLIP", 1, 8, file); + + /* clip configuration header */ + write_profiles(file); + + for (i = 0; i < metadata_num; i++) + write_metadata(file, metadata_types[i], metadata_texts[i]); + + /* first DCS */ + write_dcs(file, 0); + write_dctpq(file); +} + +/* write start bar */ +static void start_bar(FILE *file) +{ + int err; + + /* start the queue */ + err = snd_seq_start_queue(seq, queue, NULL); + check_snd("start queue", err); + snd_seq_drain_output(seq); + + write_start_clip(file); + write_tempo(file); + write_time_sig(file); +} + +static void help(const char *argv0) +{ + fprintf(stderr, "Usage: %s [options] outputfile\n" + "\nAvailable options:\n" + " -h,--help this help\n" + " -V,--version show version\n" + " -p,--port=client:port,... source port(s)\n" + " -b,--bpm=beats tempo in beats per minute\n" + " -t,--ticks=ticks resolution in ticks per beat or frame\n" + " -i,--timesig=nn:dd time signature\n" + " -n,--num-events=events fixed number of events to record, then exit\n" + " -u,--ump=version UMP MIDI version (1 or 2)\n" + " -r,--interactive Interactive mode\n" + " -s,--silent don't print messages\n" + " -P,--profile=file configuration profile UMP\n" + " --project=text put project name meta data text\n" + " --song=text put song name meta data text\n" + " --clip=text put MIDI clip name meta data text\n" + " --copyright=text put copyright notice meta data text\n" + " --composer=text put composer name meta data text\n" + " --lyricist=text put lyricist name meta data text\n" + " --arranger=text put arranger name meta data text\n" + " --publisher=text put publisher name meta data text\n" + " --publisher=text put publisher name meta data text\n" + " --publisher=text put publisher name meta data text\n" + " --performer=text put performer name meta data text\n" + " --accompany=text put accompany performer name meta data text\n" + " --date=text put recording date meta data text\n" + " --location=text put recording location meta data text\n", + argv0); +} + +static void version(void) +{ + fputs("arecordmidi version " SND_UTIL_VERSION_STR "\n", stderr); +} + +static void sighandler(int sig ATTRIBUTE_UNUSED) +{ + stop = 1; +} + +#define OPT_META_BIT 0x1000 +enum { + OPT_META_PROJECT = 0x1001, + OPT_META_SONG = 0x1002, + OPT_META_CLIP = 0x1003, + OPT_META_COPYRIGHT = 0x1004, + OPT_META_COMPOSER = 0x1005, + OPT_META_LYRICIST = 0x1006, + OPT_META_ARRANGER = 0x1007, + OPT_META_PUBLISHER = 0x1008, + OPT_META_PERFORMER = 0x1009, + OPT_META_ACCOMPANY = 0x100a, + OPT_META_DATE = 0x100b, + OPT_META_LOCATION = 0x100c, +}; + +int main(int argc, char *argv[]) +{ + static const char short_options[] = "hVp:b:t:n:u:rsP:"; + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"port", 1, NULL, 'p'}, + {"bpm", 1, NULL, 'b'}, + {"ticks", 1, NULL, 't'}, + {"timesig", 1, NULL, 'i'}, + {"num-events", 1, NULL, 'n'}, + {"ump", 1, NULL, 'u'}, + {"interactive", 0, NULL, 'r'}, + {"silent", 0, NULL, 's'}, + {"profile", 1, NULL, 'P'}, + /* meta data texts */ + {"project", 1, NULL, OPT_META_PROJECT}, + {"song", 1, NULL, OPT_META_SONG}, + {"clip", 1, NULL, OPT_META_CLIP}, + {"copyright", 1, NULL, OPT_META_COPYRIGHT}, + {"composer", 1, NULL, OPT_META_COMPOSER}, + {"lyricist", 1, NULL, OPT_META_LYRICIST}, + {"arranger", 1, NULL, OPT_META_ARRANGER}, + {"publisher", 1, NULL, OPT_META_PUBLISHER}, + {"performer", 1, NULL, OPT_META_PERFORMER}, + {"accompany", 1, NULL, OPT_META_ACCOMPANY}, + {"date", 1, NULL, OPT_META_DATE}, + {"location", 1, NULL, OPT_META_LOCATION}, + {0} + }; + + char *filename; + FILE *file; + 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; + int start = 0; + int interactive = 0; + + init_seq(); + + while ((c = getopt_long(argc, argv, short_options, + long_options, NULL)) != -1) { + switch (c) { + case 'h': + help(argv[0]); + return 0; + case 'V': + version(); + return 0; + case 'p': + parse_ports(optarg); + break; + case 'b': + beats = atoi(optarg); + if (beats < 4 || beats > 6000) + fatal("Invalid tempo"); + break; + case 't': + ticks = atoi(optarg); + if (ticks < 1 || ticks > 0x7fff) + fatal("Invalid number of ticks"); + break; + 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; + case 'u': + midi_version = atoi(optarg); + if (midi_version != 1 && midi_version != 2) + fatal("Invalid MIDI version %d\n", midi_version); + break; + case 'r': + interactive = 1; + break; + case 's': + silent = 1; + break; + case 'P': + profile_ump_file = optarg; + break; + default: + if (c & OPT_META_BIT) { + if (metadata_num >= MAX_METADATA) + fatal("Too many metadata given"); + metadata_types[metadata_num] = c & 0x0f; + metadata_texts[metadata_num] = optarg; + metadata_num++; + break; + } + help(argv[0]); + return 1; + } + } + + if (optind >= argc) { + fputs("Please specify a file to record to.\n", stderr); + return 1; + } + + create_queue(); + create_ump_client(); + if (port_count) + connect_ports(); + + filename = argv[optind]; + + if (!strcmp(filename, "-")) { + file = stdout; + silent = 1; // imply silent mode + } else { + file = fopen(filename, "wb"); + if (!file) + fatal("Cannot open %s - %s", filename, strerror(errno)); + } + + write_file_header(file); + if (interactive) { + if (!silent) { + printf("Press RETURN to start recording:"); + fflush(stdout); + } + } else { + start_bar(file); + start = 1; + } + + err = snd_seq_nonblock(seq, 1); + check_snd("set nonblock mode", err); + + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); + + npfds = snd_seq_poll_descriptors_count(seq, POLLIN); + pfds = alloca(sizeof(*pfds) * (npfds + 1)); + for (;;) { + snd_seq_poll_descriptors(seq, pfds, npfds, POLLIN); + if (interactive) { + pfds[npfds].fd = STDIN_FILENO; + pfds[npfds].events = POLLIN | POLLERR | POLLNVAL; + if (poll(pfds, npfds + 1, -1) < 0) + break; + if (pfds[npfds].revents & POLLIN) { + while (!feof(stdin) && getchar() != '\n') + ; + if (!start) { + start_bar(file); + start = 1; + if (!silent) { + printf("Press RETURN to stop recording:"); + fflush(stdout); + } + continue; + } else { + stop = 1; + } + } + } else { + if (poll(pfds, npfds, -1) < 0) + break; + } + + do { + snd_seq_ump_event_t *event; + + err = snd_seq_ump_event_input(seq, &event); + if (err < 0) + break; + if (start && event) { + record_event(file, event); + events_received++; + } + } while (err > 0); + if (stop) + break; + if (num_events && (events_received >= num_events)) + break; + } + + if (num_events && events_received < num_events) { + if (!silent) + fputs("Warning: Received signal before num_events\n", stdout); + } + + write_end_clip(file); + if (file != stdout) + fclose(file); + snd_seq_close(seq); + return 0; +} diff --git a/seq/aseqdump/aseqdump.c b/seq/aseqdump/aseqdump.c index af4ca21..7f14b8f 100644 --- a/seq/aseqdump/aseqdump.c +++ b/seq/aseqdump/aseqdump.c @@ -29,9 +29,7 @@ #include #include #include "version.h" -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION #include -#endif enum { VIEW_RAW, VIEW_NORMALIZED, VIEW_PERCENT @@ -41,11 +39,7 @@ static snd_seq_t *seq; static int port_count; static snd_seq_addr_t *ports; static volatile sig_atomic_t stop = 0; -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION static int ump_version; -#else -#define ump_version 0 -#endif static int view_mode = VIEW_RAW; /* prints an error message to stderr, and dies */ @@ -368,7 +362,6 @@ static void dump_event(const snd_seq_event_t *ev) } } -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION static int group_number(unsigned char c) { if (view_mode != VIEW_RAW) @@ -400,8 +393,8 @@ static void dump_ump_midi1_event(const unsigned int *ump) break; case SND_UMP_MSG_NOTE_ON: printf("Note on %2d, note %d, velocity %s", - channel, m->note_off.note, - midi1_data(m->note_off.velocity)); + channel, m->note_on.note, + midi1_data(m->note_on.velocity)); break; case SND_UMP_MSG_POLY_PRESSURE: printf("Poly pressure %2d, note %d, value %s", @@ -442,7 +435,7 @@ static const char *midi2_velocity(unsigned int v) snprintf(tmp, sizeof(tmp), "%.2f", ((double)v * 64.0) / 0x8000); else - snprintf(tmp, sizeof(tmp), ".2%f", + snprintf(tmp, sizeof(tmp), "%.2f", ((double)(v - 0x8000) * 63.0) / 0x7fff + 64.0); return tmp; } else if (view_mode == VIEW_PERCENT) { @@ -552,9 +545,9 @@ static void dump_ump_midi2_event(const unsigned int *ump) break; case SND_UMP_MSG_NOTE_ON: printf("Note on %2d, note %d, velocity %s, attr type = %d, data = 0x%x", - channel, m->note_off.note, - midi2_velocity(m->note_off.velocity), - m->note_off.attr_type, m->note_off.attr_data); + channel, m->note_on.note, + midi2_velocity(m->note_on.velocity), + m->note_on.attr_type, m->note_on.attr_data); break; case SND_UMP_MSG_POLY_PRESSURE: printf("Poly pressure %2d, note %d, value %s", @@ -579,7 +572,7 @@ static void dump_ump_midi2_event(const unsigned int *ump) midi2_data(m->channel_pressure.data)); break; case SND_UMP_MSG_PITCHBEND: - printf("Channel pressure %2d, value %s", + printf("Pitchbend %2d, value %s", channel, midi2_pitchbend(m->channel_pressure.data)); break; @@ -595,6 +588,427 @@ static void dump_ump_midi2_event(const unsigned int *ump) printf("\n"); } +static void dump_ump_utility_event(const unsigned int *ump) +{ + unsigned char status = snd_ump_msg_status(ump); + unsigned int val = *ump & 0xfffff; + + printf(" "); + switch (status) { + case SND_UMP_UTILITY_MSG_STATUS_NOOP: + printf("Noop\n"); + break; + case SND_UMP_UTILITY_MSG_STATUS_JR_CLOCK: + printf("JR Clock value %d\n", val); + break; + case SND_UMP_UTILITY_MSG_STATUS_JR_TSTAMP: + printf("JR Timestamp value %d\n", val); + break; + case SND_UMP_UTILITY_MSG_STATUS_DCTPQ: + printf("DCTPQ value %d\n", val); + break; + case SND_UMP_UTILITY_MSG_STATUS_DC: + printf("DC Ticks value %d\n", val); + break; + default: + printf("UMP Utility event: status = %d, 0x%08x\n", + status, *ump); + break; + } +} + +static void dump_ump_system_event(const unsigned int *ump) +{ + const snd_ump_msg_system_t *m = (const snd_ump_msg_system_t *)ump; + + printf("Group %2d, ", group_number(m->group)); + switch (m->status) { + case SND_UMP_MSG_MIDI_TIME_CODE: + printf("MIDI Time Code value %d\n", m->parm1); + break; + case SND_UMP_MSG_SONG_POSITION: + printf("Song position pointer value %d\n", + ((unsigned int)m->parm2 << 7) | m->parm1); + break; + case SND_UMP_MSG_SONG_SELECT: + printf("Song select value %d\n", m->parm1); + break; + case SND_UMP_MSG_TUNE_REQUEST: + printf("Tune request\n"); + break; + case SND_UMP_MSG_TIMING_CLOCK: + printf("Timing clock\n"); + break; + case SND_UMP_MSG_START: + printf("Start\n"); + break; + case SND_UMP_MSG_CONTINUE: + printf("Continue\n"); + break; + case SND_UMP_MSG_STOP: + printf("Stop\n"); + break; + case SND_UMP_MSG_ACTIVE_SENSING: + printf("Active sensing\n"); + break; + case SND_UMP_MSG_RESET: + printf("Reset\n"); + break; + default: + printf("UMP System event: status = %d, 0x%08x\n", + m->status, *ump); + break; + } +} + +static unsigned char ump_sysex7_data(const unsigned int *ump, + unsigned int offset) +{ + return snd_ump_get_byte(ump, offset + 2); +} + +static void dump_ump_sysex_status(const char *prefix, unsigned int status) +{ + printf("%s ", prefix); + switch (status) { + case SND_UMP_SYSEX_STATUS_SINGLE: + printf("Single "); + break; + case SND_UMP_SYSEX_STATUS_START: + printf("Start "); + break; + case SND_UMP_SYSEX_STATUS_CONTINUE: + printf("Continue"); + break; + case SND_UMP_SYSEX_STATUS_END: + printf("End "); + break; + default: + printf("(0x%04x)", status); + break; + } +} + +static void dump_ump_sysex_event(const unsigned int *ump) +{ + int i, length; + + printf("Group %2d, ", group_number(snd_ump_msg_group(ump))); + dump_ump_sysex_status("SysEx", snd_ump_sysex_msg_status(ump)); + length = snd_ump_sysex_msg_length(ump); + printf(" length %d ", length); + if (length > 6) + length = 6; + for (i = 0; i < length; i++) + printf("%s%02x", i ? ":" : "", ump_sysex7_data(ump, i)); + printf("\n"); +} + +static unsigned char ump_sysex8_data(const unsigned int *ump, + unsigned int offset) +{ + return snd_ump_get_byte(ump, offset + 3); +} + +static void dump_ump_sysex8_event(const unsigned int *ump) +{ + int i, length; + + printf("Group %2d, ", group_number(snd_ump_msg_group(ump))); + dump_ump_sysex_status("SysEx8", snd_ump_sysex_msg_status(ump)); + length = snd_ump_sysex_msg_length(ump); + printf(" length %d ", length); + printf(" stream %d ", (ump[0] >> 8) & 0xff); + if (length > 13) + length = 13; + for (i = 0; i < length; i++) + printf("%s%02x", i ? ":" : "", ump_sysex8_data(ump, i)); + printf("\n"); +} + +static void dump_ump_mixed_data_event(const unsigned int *ump) +{ + const snd_ump_msg_mixed_data_t *m = + (const snd_ump_msg_mixed_data_t *)ump; + int i; + + printf("Group %2d, ", group_number(snd_ump_msg_group(ump))); + switch (snd_ump_sysex_msg_status(ump)) { + case SND_UMP_MIXED_DATA_SET_STATUS_HEADER: + printf("MDS Header id=0x%x, bytes=%d, chunk=%d/%d, manufacturer=0x%04x, device=0x%04x, sub_id=0x%04x 0x%04x\n", + m->header.mds_id, m->header.bytes, + m->header.chunk, m->header.chunks, + m->header.manufacturer, m->header.device, + m->header.sub_id_1, m->header.sub_id_2); + break; + case SND_UMP_MIXED_DATA_SET_STATUS_PAYLOAD: + printf("MDS Payload id=0x%x, ", m->payload.mds_id); + for (i = 0; i < 14; i++) + printf("%s%02x", i ? ":" : "", + snd_ump_get_byte(ump, i + 2)); + printf("\n"); + break; + default: + printf("Extended Data (status 0x%x)\n", + snd_ump_sysex_msg_status(ump)); + break; + } +} + +static void dump_ump_extended_data_event(const unsigned int *ump) +{ + unsigned char status = snd_ump_sysex_msg_status(ump); + + if (status < 4) + dump_ump_sysex8_event(ump); + else + dump_ump_mixed_data_event(ump); +} + +static void print_ump_string(const unsigned int *ump, unsigned int fmt, + unsigned int offset, int maxlen) +{ + static const char *fmtstr[4] = { "Single", "Start", "Cont", "End" }; + unsigned char buf[32]; + int i = 0; + + do { + buf[i] = snd_ump_get_byte(ump, offset); + if (!buf[i]) + break; + if (buf[i] < 0x20) + buf[i] = '.'; + offset++; + } while (++i < maxlen); + buf[i] = 0; + + printf("%6s: %s", fmtstr[fmt], buf); +} + +static void dump_ump_stream_event(const unsigned int *ump) +{ + const snd_ump_msg_stream_t *s = (const snd_ump_msg_stream_t *)ump; + + printf(" "); /* stream message is groupless */ + switch (s->gen.status) { + case SND_UMP_STREAM_MSG_STATUS_EP_DISCOVERY: + printf("EP Discovery ver=%d/%d, filter=0x%x\n", + (ump[0] >> 8) & 0xff, ump[0] & 0xff, ump[1] & 0xff); + break; + case SND_UMP_STREAM_MSG_STATUS_EP_INFO: + printf("EP Info ver=%d/%d, static=%d, fb#=%d, midi2=%d, midi1=%d, rxjr=%d, txjr=%d\n", + (ump[0] >> 8) & 0xff, ump[0] & 0xff, (ump[1] >> 31), + (ump[1] >> 24) & 0x7f, + (ump[1] >> 9) & 1, (ump[1] >> 8) & 1, + (ump[1] >> 1) & 1, ump[1] & 1); + break; + case SND_UMP_STREAM_MSG_STATUS_DEVICE_INFO: + printf("Device Info sysid=%02x:%02x:%02x, family=%02x:%02x, model=%02x:%02x, rev=%02x:%02x:%02x:%02x\n", + (ump[1] >> 16) & 0x7f, (ump[1] >> 8) & 0x7f, ump[1] & 0x7f, + (ump[2] >> 16) & 0x7f, (ump[2] >> 24) & 0x7f, + ump[2] & 0x7f, (ump[2] >> 8) & 0x7f, + (ump[3] >> 24) & 0x7f, (ump[3] >> 16) & 0x7f, + (ump[3] >> 8) & 0x7f, ump[3] & 0x7f); + break; + case SND_UMP_STREAM_MSG_STATUS_EP_NAME: + printf("EP Name "); + print_ump_string(ump, (ump[0] >> 26) & 3, 2, 14); + printf("\n"); + break; + case SND_UMP_STREAM_MSG_STATUS_PRODUCT_ID: + printf("Product Id "); + print_ump_string(ump, (ump[0] >> 26) & 3, 2, 14); + printf("\n"); + break; + case SND_UMP_STREAM_MSG_STATUS_STREAM_CFG_REQUEST: + printf("Stream Cfg Req protocl=%d, rxjr=%d, txjr=%d\n", + (ump[0] >> 8) & 0xff, (ump[0] >> 1) & 1, ump[0] & 1); + break; + case SND_UMP_STREAM_MSG_STATUS_STREAM_CFG: + printf("Stream Cfg protocl=%d, rxjr=%d, txjr=%d\n", + (ump[0] >> 8) & 0xff, (ump[0] >> 1) & 1, ump[0] & 1); + break; + case SND_UMP_STREAM_MSG_STATUS_FB_DISCOVERY: + printf("FB Discovery fb#=%d, filter=0x%x\n", + (ump[0] >> 8) & 0xff, ump[0] & 0xff); + break; + case SND_UMP_STREAM_MSG_STATUS_FB_INFO: + printf("FB Info fb#=%d, active=%d, ui=%d, MIDI1=%d, dir=%d, group=%d-%d, MIDI-CI=%d, SysEx8=%d\n", + (ump[0] >> 8) & 0x7f, (ump[0] >> 15) & 1, + (ump[0] >> 4) & 3, (ump[0] >> 2) & 3, ump[0] & 3, + (ump[1] >> 24) & 0xff, (ump[1] >> 16) & 0xff, + (ump[1] >> 8) * 0xff, ump[1] & 0xff); + break; + case SND_UMP_STREAM_MSG_STATUS_FB_NAME: + printf("Product Id "); + printf("FB Name #%02d ", (ump[0] >> 8) & 0xff); + print_ump_string(ump, (ump[0] >> 26) & 3, 3, 13); + printf("\n"); + break; + case SND_UMP_STREAM_MSG_STATUS_START_CLIP: + printf("Start Clip\n"); + break; + case SND_UMP_STREAM_MSG_STATUS_END_CLIP: + printf("End Clip\n"); + break; + default: + printf("UMP Stream event: status = %d, 0x%08x:0x%08x:0x%08x:0x%08x\n", + s->gen.status, ump[0], ump[1], ump[2], ump[3]); + break; + } +} + +struct flexdata_text_prefix { + unsigned char status_bank; + unsigned char status; + const char *prefix; +}; + +static struct flexdata_text_prefix text_prefix[] = { + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PROJECT_NAME, + .prefix = "Project" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_SONG_NAME, + .prefix = "Song" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_MIDI_CLIP_NAME, + .prefix = "MIDI Clip" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_COPYRIGHT_NOTICE, + .prefix = "Copyright" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_COMPOSER_NAME, + .prefix = "Composer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICIST_NAME, + .prefix = "Lyricist" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_ARRANGER_NAME, + .prefix = "Arranger" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PUBLISHER_NAME, + .prefix = "Publisher" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_PRIMARY_PERFORMER, + .prefix = "Performer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_ACCOMPANY_PERFORMAER, + .prefix = "Accompany Performer" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_DATE, + .prefix = "Recording Date" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_METADATA, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RECORDING_LOCATION, + .prefix = "Recording Location" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS, + .prefix = "Lyrics" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_LYRICS_LANGUAGE, + .prefix = "Lyrics Language" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY, + .prefix = "Ruby" }, + { .status_bank = SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT, + .status = SND_UMP_FLEX_DATA_MSG_STATUS_RUBY_LANGUAGE, + .prefix = "Ruby Language" }, + {} +}; + +static const char *ump_meta_prefix(const snd_ump_msg_flex_data_t *fh) +{ + static char buf[32]; + int i; + + for (i = 0; text_prefix[i].status_bank; i++) { + if (text_prefix[i].status_bank == fh->meta.status_bank && + text_prefix[i].status == fh->meta.status) + return text_prefix[i].prefix; + } + + sprintf(buf, "(%d:%d)", fh->meta.status_bank, fh->meta.status); + return buf; +} + +static void dump_ump_flex_data_event(const unsigned int *ump) +{ + const snd_ump_msg_flex_data_t *fh = + (const snd_ump_msg_flex_data_t *)ump; + + printf("Group %2d, ", group_number(snd_ump_msg_group(ump))); + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_TEMPO) { + printf("UMP Set Tempo value %d\n", fh->set_tempo.tempo); + return; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_TIME_SIGNATURE) { + printf("UMP Set Time Signature value %d / %d, num_notes %d\n", + fh->set_time_sig.numerator, fh->set_time_sig.denominator, + fh->set_time_sig.num_notes); + return; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_METRONOME) { + printf("UMP Set Metronome clock %d, bar %d/%d/%d, sub %d/%d\n", + fh->set_metronome.clocks_primary, + fh->set_metronome.bar_accent_1, + fh->set_metronome.bar_accent_2, + fh->set_metronome.bar_accent_3, + fh->set_metronome.subdivision_1, + fh->set_metronome.subdivision_2); + return; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_KEY_SIGNATURE) { + printf("UMP Set Key Signature sharps/flats %d, tonic %d\n", + fh->set_key_sig.sharps_flats, + fh->set_key_sig.tonic_note); + return; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_SETUP && + fh->meta.status == SND_UMP_FLEX_DATA_MSG_STATUS_SET_CHORD_NAME) { + printf("UMP Set Chord Name tonic %d %d %d, alt1 %d/%d, alt2 %d/%d, alt3 %d/%d, alt4 %d/%d, bass %d %d %d, alt1 %d/%d alt2 %d/%d\n", + fh->set_chord_name.tonic_sharp, + fh->set_chord_name.chord_tonic, + fh->set_chord_name.chord_type, + fh->set_chord_name.alter1_type, + fh->set_chord_name.alter1_degree, + fh->set_chord_name.alter2_type, + fh->set_chord_name.alter2_degree, + fh->set_chord_name.alter3_type, + fh->set_chord_name.alter3_degree, + fh->set_chord_name.alter4_type, + fh->set_chord_name.alter4_degree, + fh->set_chord_name.bass_sharp, + fh->set_chord_name.bass_note, + fh->set_chord_name.bass_type, + fh->set_chord_name.bass_alter1_type, + fh->set_chord_name.bass_alter1_type, + fh->set_chord_name.bass_alter2_degree, + fh->set_chord_name.bass_alter2_degree); + return; + } + + if (fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_METADATA || + fh->meta.status_bank == SND_UMP_FLEX_DATA_MSG_BANK_PERF_TEXT) { + printf("Meta (%s) ", ump_meta_prefix(fh)); + print_ump_string(ump, fh->meta.format, 4, 12); + printf("\n"); + return; + } + + printf("Flex Data: channel = %d, format = %d, addrs = %d, status_bank = %d, status = %d\n", + fh->meta.channel, fh->meta.format, fh->meta.addrs, + fh->meta.status_bank, fh->meta.status); +} + static void dump_ump_event(const snd_seq_ump_event_t *ev) { if (!snd_seq_ev_is_ump(ev)) { @@ -605,12 +1019,30 @@ static void dump_ump_event(const snd_seq_ump_event_t *ev) printf("%3d:%-3d ", ev->source.client, ev->source.port); switch (snd_ump_msg_type(ev->ump)) { + case SND_UMP_MSG_TYPE_UTILITY: + dump_ump_utility_event(ev->ump); + break; + case SND_UMP_MSG_TYPE_SYSTEM: + dump_ump_system_event(ev->ump); + break; case SND_UMP_MSG_TYPE_MIDI1_CHANNEL_VOICE: dump_ump_midi1_event(ev->ump); break; case SND_UMP_MSG_TYPE_MIDI2_CHANNEL_VOICE: dump_ump_midi2_event(ev->ump); break; + case SND_UMP_MSG_TYPE_DATA: + dump_ump_sysex_event(ev->ump); + break; + case SND_UMP_MSG_TYPE_EXTENDED_DATA: + dump_ump_extended_data_event(ev->ump); + break; + case SND_UMP_MSG_TYPE_FLEX_DATA: + dump_ump_flex_data_event(ev->ump); + break; + case SND_UMP_MSG_TYPE_STREAM: + dump_ump_stream_event(ev->ump); + break; default: printf("UMP event: type = %d, group = %d, status = %d, 0x%08x\n", snd_ump_msg_type(ev->ump), @@ -620,7 +1052,6 @@ static void dump_ump_event(const snd_seq_ump_event_t *ev) break; } } -#endif /* HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION */ static void list_ports(void) { @@ -663,10 +1094,8 @@ static void help(const char *argv0) " -N,--normalized-view show normalized values\n" " -P,--percent-view show percent values\n" " -R,--raw-view show raw values (default)\n" -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION " -u,--ump=version set client MIDI version (0=legacy, 1= UMP MIDI 1.0, 2=UMP MIDI2.0)\n" " -r,--raw do not convert UMP and legacy events\n" -#endif " -p,--port=client:port,... source port(s)\n", argv0); } @@ -683,11 +1112,7 @@ static void sighandler(int sig ATTRIBUTE_UNUSED) int main(int argc, char *argv[]) { - static const char short_options[] = "hVlp:NPR" -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION - "u:r" -#endif - ; + static const char short_options[] = "hVlp:NPRu:r"; static const struct option long_options[] = { {"help", 0, NULL, 'h'}, {"version", 0, NULL, 'V'}, @@ -696,10 +1121,8 @@ int main(int argc, char *argv[]) {"normalized-view", 0, NULL, 'N'}, {"percent-view", 0, NULL, 'P'}, {"raw-view", 0, NULL, 'R'}, -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION {"ump", 1, NULL, 'u'}, {"raw", 0, NULL, 'r'}, -#endif {0} }; @@ -734,15 +1157,15 @@ int main(int argc, char *argv[]) case 'N': view_mode = VIEW_NORMALIZED; break; -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION case 'u': ump_version = atoi(optarg); + if (ump_version < 0 || ump_version > 2) + fatal("Invalid UMP version %d", ump_version); snd_seq_set_client_midi_version(seq, ump_version); break; case 'r': snd_seq_set_client_ump_conversion(seq, 0); break; -#endif default: help(argv[0]); return 1; @@ -784,7 +1207,6 @@ int main(int argc, char *argv[]) break; for (;;) { snd_seq_event_t *event; -#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION snd_seq_ump_event_t *ump_ev; if (ump_version > 0) { err = snd_seq_ump_event_input(seq, &ump_ev); @@ -794,7 +1216,6 @@ int main(int argc, char *argv[]) dump_ump_event(ump_ev); continue; } -#endif err = snd_seq_event_input(seq, &event); if (err < 0) diff --git a/seq/aseqsend/Makefile.am b/seq/aseqsend/Makefile.am new file mode 100644 index 0000000..62da1ef --- /dev/null +++ b/seq/aseqsend/Makefile.am @@ -0,0 +1,5 @@ +AM_CPPFLAGS = -I$(top_srcdir)/include +EXTRA_DIST = aseqsend.1 + +bin_PROGRAMS = aseqsend +man_MANS = aseqsend.1 diff --git a/seq/aseqsend/aseqsend.1 b/seq/aseqsend/aseqsend.1 new file mode 100644 index 0000000..2fd8a02 --- /dev/null +++ b/seq/aseqsend/aseqsend.1 @@ -0,0 +1,77 @@ +.TH ASEQSEND 1 "11 Mar 2024" + +.SH NAME +aseqsend \- send arbitrary messages to selected ALSA MIDI seqencer port + +.SH SYNOPSIS +\fBaseqsend\fP \-p client:port -s file-name +.br +\fBaseqsend\fP \-p client:port "hex encoded byte-string" + +.SH DESCRIPTION +\fBaseqsend\fP is a command-line utility which allows one to send +SysEx (system exclusive) data to ALSA MIDI sequencer port. +It can also send any other MIDI commands. +Messages to be sent can be given in the last argument as hex encoded +byte string or can be read from raw binary file. +When sending several SysEx messages at once there is a delay of 1ms +after each message as default and can be set to different value with +option \-i. + +A client can be specified by its number, its name, or a prefix of its +name. A port is specified by its number; for port 0 of a client, the +":0" part of the port specification can be omitted. + +\fBaseqsend\fP can send UMP packets as MIDI 2.0 device by specifying +via \-u option as well, while the default operation is the legacy MIDI +1.0 byte stream. + +.SH OPTIONS + +.TP +\fI\-h, \-\-help\fP +Prints a list of options. + +.TP +\fI\-V, \-\-version\fP +Prints the current version. + +.TP +\fI\-l, \-\-list\FP +Prints a list of possible output ports. + +.TP +\fI\-v, \-\-verbose\fP +Prints number of bytes actually sent + +.TP +\fI\-p, -\-port=client:port\fP +Target port by number or name + +.TP +\fI\-s, \-\-file=filename\fP +Send raw binary data from given file name + +.TP +\fI\-i, \-\-interval=msec\fP +Interval between SysEx messages in milliseconds + +.TP +\fI\-u, \-\-ump=version\fP +Specify the MIDI version. 0 for the legacy MIDI 1.0 (default), +1 for UMP MIDI 1.0 protocol and 2 for UMP MIDI 2.0 protocol. + +When UMP MIDI 1.0 or MIDI 2.0 protocol is specified, \fBaseqsend\fP +reads the input as raw UMP packets, 4 each byte in big endian. + +.SH EXAMPLES + +\fBaseqsend -p 128:0 "F0 41 10 00 00 64 12 18 00 21 06 59 41 59 4E F7"\fP + +\fBaseqsend -p 128:0 -s I7BulkDump.syx\fP + +.SH SEE ALSO +\fBaseqdump(1)\fP + +.SH AUTHOR +Miroslav Kovac diff --git a/seq/aseqsend/aseqsend.c b/seq/aseqsend/aseqsend.c new file mode 100644 index 0000000..92354eb --- /dev/null +++ b/seq/aseqsend/aseqsend.c @@ -0,0 +1,458 @@ +/* + * aseqsend.c - send arbitrary MIDI messages to selected ALSA MIDI seqencer port + * + * Copyright (c) 2005 Clemens Ladisch + * Copyright (c) 2024 Miroslav Kovac + * + * + * 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 + */ + +#define _GNU_SOURCE +#include "aconfig.h" +#include "version.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef unsigned char mbyte_t; + +static snd_seq_t *seq; +static char *port_name = NULL; +static char *send_file_name = NULL; +static char *send_hex; +static mbyte_t *send_data; +static snd_seq_addr_t addr; +static int send_data_length; +static int sent_data_c; +static int ump_version; +static int sysex_interval = 1000; //us +static snd_midi_event_t *edev; + +static void error(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + putc('\n', stderr); +} + +/* prints an error message to stderr, and dies */ +static void fatal(const char *msg, ...) +{ + va_list ap; + + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fputc('\n', stderr); + exit(EXIT_FAILURE); +} + +static void usage(void) +{ + printf( + "\nUsage: aseqsend -p target-port -s file-name|\"hex encoded bytes\"\n\n" + " -h,--help this help\n" + " -V,--version print current version\n" + " -v,--verbose verbose mode\n" + " -l,--list list all sequencer ports\n" + " -p,--port=c:p target port by number or name\n" + " -s,--file=name send binary data from given file name\n" + " -i,--interval=v interval between SysEx messages in miliseconds\n" + " -u,--ump=version MIDI version: 0=legacy (default), 1=MIDI1, 2=MIDI2\n\n"); +} + +static void version(void) +{ + puts("aseqsend version " SND_UTIL_VERSION_STR); +} + +static void *my_malloc(size_t size) +{ + void *p = malloc(size); + if (!p) { + fatal("out of memory"); + exit(EXIT_FAILURE); + } + return p; +} + +static int hex_value(char c) +{ + if ('0' <= c && c <= '9') + return c - '0'; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + if ('a' <= c && c <= 'f') + return c - 'a' + 10; + error("invalid character %c", c); + return -1; +} + +static void parse_data(void) +{ + const char *p; + int i, value; + + send_data = my_malloc(strlen(send_hex)); + i = 0; + value = -1; /* value is >= 0 when the first hex digit of a byte has been read */ + for (p = send_hex; *p; ++p) { + int digit; + if (isspace((unsigned char)*p)) { + if (value >= 0) { + send_data[i++] = value; + value = -1; + } + continue; + } + digit = hex_value(*p); + if (digit < 0) { + exit(EXIT_FAILURE); + } + if (value < 0) { + value = digit; + } else { + send_data[i++] = (value << 4) | digit; + value = -1; + } + } + if (value >= 0) + send_data[i++] = value; + send_data_length = i; +} + +static void add_send_hex_data(const char *str) +{ + int length; + char *s; + + length = (send_hex ? strlen(send_hex) + 1 : 0) + strlen(str) + 1; + s = my_malloc(length); + if (send_hex) { + strcpy(s, send_hex); + strcat(s, " "); + } else { + s[0] = '\0'; + } + strcat(s, str); + free(send_hex); + send_hex = s; +} + +static void load_file(void) +{ + int fd; + off_t length; + + fd = open(send_file_name, O_RDONLY); + if (fd == -1) { + error("cannot open %s - %s", send_file_name, strerror(errno)); + return; + } + length = lseek(fd, 0, SEEK_END); + if (length == (off_t)-1) { + error("cannot determine length of %s: %s", send_file_name, strerror(errno)); + goto _error; + } + send_data = my_malloc(length); + lseek(fd, 0, SEEK_SET); + if (read(fd, send_data, length) != length) { + error("cannot read from %s: %s", send_file_name, strerror(errno)); + goto _error; + } + if (length >= 4 && !memcmp(send_data, "MThd", 4)) { + error("%s is a Standard MIDI File; use aplaymidi to send it", send_file_name); + goto _error; + } + send_data_length = length; + goto _exit; +_error: + free(send_data); + send_data = NULL; +_exit: + close(fd); +} + +/* error handling for ALSA functions */ +static void check_snd(const char *operation, int err) +{ + if (err < 0) + fatal("Cannot %s - %s", operation, snd_strerror(err)); +} + +static void init_seq(void) +{ + int err; + + /* open sequencer */ + err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_OUTPUT, 0); + check_snd("open sequencer", err); + + /* set our client's name */ + err = snd_seq_set_client_name(seq, "aseqsend"); + check_snd("set client name", err); + + err = snd_seq_set_client_midi_version(seq, ump_version); + check_snd("set client midi version", err); +} + +static void create_port(void) +{ + int err; + + err = snd_seq_create_simple_port(seq, "aseqsend", + SND_SEQ_PORT_CAP_READ, + SND_SEQ_PORT_TYPE_MIDI_GENERIC | + SND_SEQ_PORT_TYPE_APPLICATION); + check_snd("create port", err); +} + +static void init_midi_event_encoder(void) +{ + int err; + + err = snd_midi_event_new(256, &edev); + check_snd("create midi event encoder", err); +} + +static void list_ports(void) +{ + snd_seq_client_info_t *cinfo; + snd_seq_port_info_t *pinfo; + + snd_seq_client_info_alloca(&cinfo); + snd_seq_port_info_alloca(&pinfo); + + puts(" Port Client name Port name"); + + snd_seq_client_info_set_client(cinfo, -1); + while (snd_seq_query_next_client(seq, cinfo) >= 0) { + int client = snd_seq_client_info_get_client(cinfo); + + snd_seq_port_info_set_client(pinfo, client); + snd_seq_port_info_set_port(pinfo, -1); + while (snd_seq_query_next_port(seq, pinfo) >= 0) { + + if ((snd_seq_port_info_get_capability(pinfo) + & SND_SEQ_PORT_CAP_WRITE) + != SND_SEQ_PORT_CAP_WRITE) + continue; + printf("%3d:%-3d %-32.32s %s\n", + snd_seq_port_info_get_client(pinfo), + snd_seq_port_info_get_port(pinfo), + snd_seq_client_info_get_name(cinfo), + snd_seq_port_info_get_name(pinfo)); + } + } +} + +/* compose a UMP event, submit it, return the next data position */ +static int send_ump(int pos) +{ + int ump_len = 0, offset = 0; + unsigned int ump[4]; + snd_seq_ump_event_t ev; + + snd_seq_ump_ev_clear(&ev); + snd_seq_ev_set_source(&ev, 0); + snd_seq_ev_set_dest(&ev, addr.client, addr.port); + snd_seq_ev_set_direct(&ev); + + do { + const mbyte_t *data = send_data + pos; + + if (pos >= send_data_length) + return pos; + ump[offset] = (data[0] << 24) | (data[1] << 16) | + (data[2] << 8) | data[3]; + if (!offset) + ump_len = snd_ump_packet_length(snd_ump_msg_type(ump)); + offset++; + pos += 4; + } while (offset < ump_len); + + snd_seq_ev_set_ump_data(&ev, ump, ump_len * 4); + snd_seq_ump_event_output(seq, &ev); + snd_seq_drain_output(seq); + + sent_data_c += ump_len * 4; + return pos; +} + +/* compose an event, submit it, return the next data position */ +static int send_midi_bytes(int pos) +{ + const mbyte_t *data = send_data + pos; + snd_seq_event_t ev; + int is_sysex = 0; + int end; + + snd_seq_ev_clear(&ev); + snd_seq_ev_set_source(&ev, 0); + snd_seq_ev_set_dest(&ev, addr.client, addr.port); + snd_seq_ev_set_direct(&ev); + + if (send_data[pos] == 0xf0) { + is_sysex = 1; + for (end = pos + 1; end < send_data_length; end++) { + if (send_data[end] == 0xf7) + break; + } + + if (end == send_data_length) + fatal("SysEx is missing terminating byte (0xF7)"); + end++; + snd_seq_ev_set_sysex(&ev, end - pos, send_data + pos); + } else { + end = pos; + while (!snd_midi_event_encode_byte(edev, *data++, &ev)) { + if (++end >= send_data_length) + return end; + } + + end++; + } + + snd_seq_event_output(seq, &ev); + snd_seq_drain_output(seq); + if (is_sysex) + usleep(sysex_interval); + + sent_data_c += end - pos; + return end; +} + +int main(int argc, char *argv[]) +{ + static const struct option long_options[] = { + {"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"verbose", 0, NULL, 'v'}, + {"list", 0, NULL, 'l'}, + {"port", 1, NULL, 'p'}, + {"file", 1, NULL, 's'}, + {"interval", 1, NULL, 'i'}, + {"ump", 1, NULL, 'u'}, + {0} + }; + int c = 0; + char do_send_file = 0; + char do_port_list = 0; + char verbose = 0; + int k; + + while ((c = getopt_long(argc, argv, "hi:Vvlp:s:u:", long_options, NULL)) != -1) { + switch (c) { + case 'h': + usage(); + return 0; + case 'V': + version(); + return 0; + case 'v': + verbose = 1; + break; + case 'l': + do_port_list = 1; + break; + case 'p': + port_name = optarg; + break; + case 's': + send_file_name = optarg; + do_send_file = 1; + break; + case 'i': + sysex_interval = atoi(optarg) * 1000; //ms--->us + break; + case 'u': + ump_version = atoi(optarg); + break; + default: + error("Try 'aseqsend -h' for more information."); + exit(EXIT_FAILURE); + } + } + + if (argc < 2) { + usage(); + exit(EXIT_FAILURE); + } + + if (do_port_list){ + init_seq(); + list_ports(); + exit(EXIT_SUCCESS); + } + + if (port_name == NULL) + fatal("Output port must be specified!"); + + if (do_send_file) { + load_file(); + } else { + /* no file specified ---> send hex bytes from cmd arguments*/ + /* data for send can be specified as multiple arguments */ + for (; argv[optind]; ++optind) { + add_send_hex_data(argv[optind]); + } + if (send_hex) + parse_data(); + } + + if (!send_data) + exit(EXIT_SUCCESS); + + if (ump_version && (send_data_length % 4) != 0) + fatal("UMP data must be aligned to 4 bytes"); + + init_seq(); + create_port(); + if (!ump_version) + init_midi_event_encoder(); + + if (snd_seq_parse_address(seq, &addr, port_name) < 0) { + error("Unable to parse port name!"); + exit(EXIT_FAILURE); + } + + sent_data_c = 0; //counter of actually sent bytes + + k = 0; + while (k < send_data_length) { + if (ump_version) + k = send_ump(k); + else + k = send_midi_bytes(k); + } + + if (verbose) + printf("Sent : %u bytes\n", sent_data_c); + + snd_seq_close(seq); + exit(EXIT_SUCCESS); +} diff --git a/topology/nhlt/intel/dmic-nhlt.c b/topology/nhlt/intel/dmic-nhlt.c index de659cf..7c98a3b 100644 --- a/topology/nhlt/intel/dmic-nhlt.c +++ b/topology/nhlt/intel/dmic-nhlt.c @@ -10,11 +10,7 @@ #include #include #include -#include -#include -#include -#include -#include +#include #include "dmic-nhlt.h" #include "dmic/dmic-process.h" diff --git a/topology/nhlt/intel/dmic/dmic-debug.c b/topology/nhlt/intel/dmic/dmic-debug.c index a977c93..82c6113 100644 --- a/topology/nhlt/intel/dmic/dmic-debug.c +++ b/topology/nhlt/intel/dmic/dmic-debug.c @@ -8,7 +8,7 @@ #include "aconfig.h" #include #include -#include +#include #include "dmic-debug.h" #ifdef NHLT_DEBUG diff --git a/topology/nhlt/intel/dmic/dmic-process.c b/topology/nhlt/intel/dmic/dmic-process.c index facf24f..2db5da4 100644 --- a/topology/nhlt/intel/dmic/dmic-process.c +++ b/topology/nhlt/intel/dmic/dmic-process.c @@ -11,10 +11,7 @@ #include #include #include -#include -#include -#include -#include +#include #include "../intel-nhlt.h" #include "dmic-process.h" #include "dmic-internal.h" @@ -159,28 +156,33 @@ static void find_modes(struct intel_dmic_params *dmic, struct dmic_calc_decim_mo /* Check for sane pdm clock, min 100 kHz, max ioclk/2 */ if (dmic->dmic_prm[di].pdmclk_max < DMIC_HW_PDM_CLK_MIN || dmic->dmic_prm[di].pdmclk_max > dmic->dmic_prm[di].io_clk / 2) { - fprintf(stderr, "find_modes(): pdm clock max not in range\n"); + fprintf(stderr, "%s: pdm clock max %d not in range\n", __func__, + dmic->dmic_prm[di].pdmclk_max); return; } if (dmic->dmic_prm[di].pdmclk_min < DMIC_HW_PDM_CLK_MIN || dmic->dmic_prm[di].pdmclk_min > dmic->dmic_prm[di].pdmclk_max) { - fprintf(stderr, "find_modes(): pdm clock min not in range\n"); + fprintf(stderr, "%s: pdm clock min %d not in range\n", __func__, + dmic->dmic_prm[di].pdmclk_min); return; } /* Check for sane duty cycle */ if (dmic->dmic_prm[di].duty_min > dmic->dmic_prm[di].duty_max) { - fprintf(stderr, "find_modes(): duty cycle min > max\n"); + fprintf(stderr, "%s: duty cycle min > max: %d > %d\n", __func__, + dmic->dmic_prm[di].duty_min, dmic->dmic_prm[di].duty_max); return; } if (dmic->dmic_prm[di].duty_min < DMIC_HW_DUTY_MIN || dmic->dmic_prm[di].duty_min > DMIC_HW_DUTY_MAX) { - fprintf(stderr, "find_modes(): pdm clock min not in range\n"); + fprintf(stderr, "%s: pdm clock min %d not in range\n", __func__, + dmic->dmic_prm[di].duty_min); return; } if (dmic->dmic_prm[di].duty_max < DMIC_HW_DUTY_MIN || dmic->dmic_prm[di].duty_max > DMIC_HW_DUTY_MAX) { - fprintf(stderr, "find_modes(): pdm clock max not in range\n"); + fprintf(stderr, "%s: pdm clock max %d not in range\n", __func__, + dmic->dmic_prm[di].duty_max); return; } @@ -428,7 +430,7 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur * candidates should be sufficient. */ if (modes->num_of_modes == 0) { - fprintf(stderr, "select_mode(): no modes available\n"); + fprintf(stderr, "%s: no modes available\n", __func__); return -EINVAL; } @@ -451,7 +453,7 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur } if (!found) { - fprintf(stderr, "select_mode(): No filter for decimation found\n"); + fprintf(stderr, "%s: No filter for decimation found\n", __func__); return -EINVAL; } n = idx[found - 1]; /* Option with highest clock divisor and lowest mic clock rate */ @@ -468,8 +470,8 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur if (cfg->mfir_a > 0) { cfg->fir_a = get_fir(dmic, cfg, cfg->mfir_a); if (!cfg->fir_a) { - fprintf(stderr, "select_mode(): can't find FIR coefficients, mfir_a = %d\n", - cfg->mfir_a); + fprintf(stderr, "%s: can't find FIR coefficients, mfir_a = %d\n", + __func__, cfg->mfir_a); return -EINVAL; } } @@ -477,8 +479,8 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur if (cfg->mfir_b > 0) { cfg->fir_b = get_fir(dmic, cfg, cfg->mfir_b); if (!cfg->fir_b) { - fprintf(stderr, "select_mode(): can't find FIR coefficients, mfir_b = %d\n", - cfg->mfir_b); + fprintf(stderr, "%s: can't find FIR coefficients, mfir_b = %d\n", + __func__, cfg->mfir_b); return -EINVAL; } } @@ -490,7 +492,7 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur g_cic = mcic * mcic * mcic * mcic * mcic; if (g_cic < 0) { /* Erroneous decimation factor and CIC gain */ - fprintf(stderr, "select_mode(): erroneous decimation factor and CIC gain\n"); + fprintf(stderr, "%s: erroneous decimation factor and CIC gain\n", __func__); return -EINVAL; } @@ -515,7 +517,7 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur cfg->fir_a->length, gain_to_fir); if (ret < 0) { /* Invalid coefficient set found, should not happen. */ - fprintf(stderr, "select_mode(): invalid coefficient set found\n"); + fprintf(stderr, "%s: invalid coefficient set found\n", __func__); return -EINVAL; } } else { @@ -531,7 +533,7 @@ static int select_mode(struct intel_dmic_params *dmic, struct dmic_calc_configur cfg->fir_b->length, gain_to_fir); if (ret < 0) { /* Invalid coefficient set found, should not happen. */ - fprintf(stderr, "select_mode(): invalid coefficient set found\n"); + fprintf(stderr, "%s: invalid coefficient set found\n", __func__); return -EINVAL; } } else { @@ -608,13 +610,24 @@ static void ipm_helper2(struct intel_dmic_params *dmic, int source[], int *ipm) * operate as stereo or mono left (A) or mono right (B) mode. Mono right mode is setup as channel * swapped mono left. */ -static int stereo_helper(struct intel_dmic_params *dmic, int stereo[], int swap[]) +static int stereo_helper(struct intel_dmic_params *dmic, int stereo[], int swap[], int ipmsm[]) { int cnt; - int i; + int i, j; int swap_check; int ret = 0; + /* Find FIFOs those need stereo mode, ipmsm 0 is mono, 1 is stereo */ + for (i = 0; i < DMIC_HW_FIFOS; i++) { + ipmsm[i] = 0; + for (j = 0; j < DMIC_HW_CONTROLLERS; j++) { + if (dmic->dmic_prm[i].pdm[j].enable_mic_a && dmic->dmic_prm[i].pdm[j].enable_mic_b) { + ipmsm[i] = 1; + break; + } + } + } + for (i = 0; i < DMIC_HW_CONTROLLERS; i++) { cnt = 0; if (dmic->dmic_prm[0].pdm[i].enable_mic_a || @@ -647,6 +660,7 @@ static int stereo_helper(struct intel_dmic_params *dmic, int stereo[], int swap[ static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_configuration *cfg) { + int ipmsm[DMIC_HW_FIFOS]; int stereo[DMIC_HW_CONTROLLERS]; int swap[DMIC_HW_CONTROLLERS]; uint32_t val = 0; @@ -757,6 +771,12 @@ static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_ of0 = (dmic->dmic_prm[0].fifo_bits == 32) ? 2 : 0; of1 = (dmic->dmic_prm[1].fifo_bits == 32) ? 2 : 0; + ret = stereo_helper(dmic, stereo, swap, ipmsm); + if (ret < 0) { + fprintf(stderr, "%s: Microphones enable conflict for DMIC0 and DMIC1 FIFOs\n", __func__); + return ret; + } + if (dmic->dmic_prm[di].driver_version == 1) { if (di == 0) { ipm_helper1(dmic, &ipm); @@ -781,7 +801,10 @@ static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_ } } - if (dmic->dmic_prm[di].driver_version == 2 || dmic->dmic_prm[di].driver_version == 3) { + if (dmic->dmic_prm[di].driver_version >= 2) { + if (dmic->dmic_prm[di].driver_version >= 4) + bfth = 0; + if (di == 0) { ipm_helper2(dmic, source, &ipm); val = OUTCONTROL0_TIE(0) | @@ -795,7 +818,7 @@ static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_ OUTCONTROL0_IPM_SOURCE_2(source[1]) | OUTCONTROL0_IPM_SOURCE_3(source[2]) | OUTCONTROL0_IPM_SOURCE_4(source[3]) | - OUTCONTROL0_IPM_SOURCE_MODE(1) | + OUTCONTROL0_IPM_SOURCE_MODE(ipmsm[0]) | OUTCONTROL0_TH(th); } else { ipm_helper2(dmic, source, &ipm); @@ -810,19 +833,13 @@ static int configure_registers(struct intel_dmic_params *dmic, struct dmic_calc_ OUTCONTROL1_IPM_SOURCE_2(source[1]) | OUTCONTROL1_IPM_SOURCE_3(source[2]) | OUTCONTROL1_IPM_SOURCE_4(source[3]) | - OUTCONTROL1_IPM_SOURCE_MODE(1) | + OUTCONTROL1_IPM_SOURCE_MODE(ipmsm[1]) | OUTCONTROL1_TH(th); } } dmic->dmic_blob.chan_ctrl_cfg[di] = val; - ret = stereo_helper(dmic, stereo, swap); - if (ret < 0) { - fprintf(stderr, "configure_registers(): enable conflict\n"); - return ret; - } - for (i = 0; i < DMIC_HW_CONTROLLERS; i++) { /* CIC */ val = CIC_CONTROL_SOFT_RESET(soft_reset) | @@ -975,13 +992,14 @@ int dmic_calculate(struct intel_nhlt_params *nhlt) di = dmic->dmic_dai_index; if (di >= DMIC_HW_FIFOS) { - fprintf(stderr, "dmic_set_config(): dai->index exceeds number of FIFOs\n"); + fprintf(stderr, "%s: dai->index %d exceeds number of FIFOs\n", __func__, di); ret = -EINVAL; goto out; } if (dmic->dmic_prm[di].num_pdm_active > DMIC_HW_CONTROLLERS) { - fprintf(stderr, "dmic_set_config():controller count exceeds platform capability\n"); + fprintf(stderr, "%s: controller count %d exceeds platform capability\n", + __func__, dmic->dmic_prm[di].num_pdm_active); ret = -EINVAL; goto out; } @@ -993,7 +1011,8 @@ int dmic_calculate(struct intel_nhlt_params *nhlt) case 32: break; default: - fprintf(stderr, "dmic_set_config(): fifo_bits EINVAL\n"); + fprintf(stderr, "%s: Bad fifo_bits %d\n", __func__, + dmic->dmic_prm[di].fifo_bits); ret = -EINVAL; goto out; } @@ -1005,14 +1024,14 @@ int dmic_calculate(struct intel_nhlt_params *nhlt) */ find_modes(dmic, &modes_a, dmic->dmic_prm[0].fifo_fs); if (modes_a.num_of_modes == 0 && dmic->dmic_prm[0].fifo_fs > 0) { - fprintf(stderr, "dmic_set_config(): No modes found for FIFO A\n"); + fprintf(stderr, "%s: No modes found for FIFO A\n", __func__); ret = -EINVAL; goto out; } find_modes(dmic, &modes_b, dmic->dmic_prm[1].fifo_fs); if (modes_b.num_of_modes == 0 && dmic->dmic_prm[1].fifo_fs > 0) { - fprintf(stderr, "dmic_set_config(): No modes found for FIFO B\n"); + fprintf(stderr, "%s: No modes found for FIFO B\n", __func__); ret = -EINVAL; goto out; } @@ -1020,7 +1039,7 @@ int dmic_calculate(struct intel_nhlt_params *nhlt) match_modes(&modes_ab, &modes_a, &modes_b); ret = select_mode(dmic, &cfg, &modes_ab); if (ret < 0) { - fprintf(stderr, "dmic_set_config(): select_mode() failed\n"); + fprintf(stderr, "%s: select_mode() failed %d\n", __func__, ret); ret = -EINVAL; goto out; } @@ -1030,7 +1049,7 @@ int dmic_calculate(struct intel_nhlt_params *nhlt) */ ret = configure_registers(dmic, &cfg); if (ret < 0) { - fprintf(stderr, "dmic_set_config(): cannot configure registers\n"); + fprintf(stderr, "%s: cannot configure registers %d\n", __func__, ret); ret = -EINVAL; goto out; } @@ -1232,7 +1251,12 @@ int dmic_set_params(struct intel_nhlt_params *nhlt, int dai_index, int driver_ve return -EINVAL; if (dai_index >= DMIC_HW_FIFOS) { - fprintf(stderr, "set_dmic_data illegal dai index\n"); + fprintf(stderr, "%s: illegal dai index %d \n", __func__, dai_index); + return -EINVAL; + } + + if (driver_version < 1 || driver_version > 5) { + fprintf(stderr, "%s: illegal driver version %d\n", __func__, driver_version); return -EINVAL; } @@ -1261,7 +1285,7 @@ int dmic_set_pdm_params(struct intel_nhlt_params *nhlt, int pdm_index, int enabl return -EINVAL; if (pdm_index >= DMIC_HW_CONTROLLERS) { - fprintf(stderr, "set_pdm_data illegal pdm_index\n"); + fprintf(stderr, "%s: illegal pdm_index %d\n", __func__, pdm_index); return -EINVAL; } diff --git a/topology/nhlt/intel/intel-nhlt.h b/topology/nhlt/intel/intel-nhlt.h index 72e61fb..657b538 100644 --- a/topology/nhlt/intel/intel-nhlt.h +++ b/topology/nhlt/intel/intel-nhlt.h @@ -12,10 +12,7 @@ #include #include #include -#include -#include -#include -#include +#include #define MIN(a, b) ({ \ typeof(a) __a = (a); \ diff --git a/topology/nhlt/intel/ssp-nhlt.c b/topology/nhlt/intel/ssp-nhlt.c index 1137819..168e6bc 100644 --- a/topology/nhlt/intel/ssp-nhlt.c +++ b/topology/nhlt/intel/ssp-nhlt.c @@ -10,10 +10,7 @@ #include #include #include -#include -#include -#include -#include +#include #include "intel-nhlt.h" #include "ssp-nhlt.h" #include "ssp/ssp-process.h" diff --git a/topology/nhlt/intel/ssp/ssp-debug.c b/topology/nhlt/intel/ssp/ssp-debug.c index 2d2f6b0..afb8ac2 100644 --- a/topology/nhlt/intel/ssp/ssp-debug.c +++ b/topology/nhlt/intel/ssp/ssp-debug.c @@ -7,20 +7,110 @@ #include "aconfig.h" #include #include -#include +#include #include "ssp-debug.h" #include "../intel-nhlt.h" #ifdef NHLT_DEBUG -void ssp_print_calculated(struct intel_ssp_params *ssp) +static void ssp_print_blob10(struct intel_ssp_params *ssp, int i) { struct ssp_intel_config_data *blob; + int ssp_index = ssp->ssp_count; + int j; + + blob = &ssp->ssp_blob[ssp_index][i]; + fprintf(stdout, "gateway_attributes %u\n", blob->gateway_attributes); + for (j = 0; j < SSP_TS_GROUP_SIZE; j++) + fprintf(stdout, "ts_group[%d] 0x%08x\n", j, blob->ts_group[j]); + + fprintf(stdout, "ssc0 0x%08x\n", blob->ssc0); + fprintf(stdout, "ssc1 0x%08x\n", blob->ssc1); + fprintf(stdout, "sscto 0x%08x\n", blob->sscto); + fprintf(stdout, "sspsp 0x%08x\n", blob->sspsp); + fprintf(stdout, "sstsa 0x%08x\n", blob->sstsa); + fprintf(stdout, "ssrsa 0x%08x\n", blob->ssrsa); + fprintf(stdout, "ssc2 0x%08x\n", blob->ssc2); + fprintf(stdout, "sspsp2 0x%08x\n", blob->sspsp2); + fprintf(stdout, "ssc3 0x%08x\n", blob->ssc3); + fprintf(stdout, "ssioc 0x%08x\n", blob->ssioc); + fprintf(stdout, "mdivc 0x%08x\n", blob->mdivc); + fprintf(stdout, "mdivr 0x%08x\n", blob->mdivr); +} + +static void ssp_print_blob15(struct intel_ssp_params *ssp, int i) +{ struct ssp_intel_config_data_1_5 *blob15; + int ssp_index = ssp->ssp_count; + uint32_t j; + + blob15 = &ssp->ssp_blob_1_5[ssp_index][i]; + fprintf(stdout, "gateway_attributes %u\n", blob15->gateway_attributes); + fprintf(stdout, "version %u\n", blob15->version); + fprintf(stdout, "size %u\n", blob15->size); + for (j = 0; j < SSP_TS_GROUP_SIZE; j++) + fprintf(stdout, "ts_group[%d] 0x%08x\n", j, blob15->ts_group[j]); + + fprintf(stdout, "ssc0 0x%08x\n", blob15->ssc0); + fprintf(stdout, "ssc1 0x%08x\n", blob15->ssc1); + fprintf(stdout, "sscto 0x%08x\n", blob15->sscto); + fprintf(stdout, "sspsp 0x%08x\n", blob15->sspsp); + fprintf(stdout, "sstsa 0x%08x\n", blob15->sstsa); + fprintf(stdout, "ssrsa 0x%08x\n", blob15->ssrsa); + fprintf(stdout, "ssc2 0x%08x\n", blob15->ssc2); + fprintf(stdout, "sspsp2 0x%08x\n", blob15->sspsp2); + fprintf(stdout, "ssc3 0x%08x\n", blob15->ssc3); + fprintf(stdout, "ssioc 0x%08x\n", blob15->ssioc); + fprintf(stdout, "mdivc 0x%08x\n", blob15->mdivctlr); + fprintf(stdout, "mdivr count 0x%08x\n", blob15->mdivrcnt); + for (j = 0; j < blob15->mdivrcnt; j++) + fprintf(stdout, "mdivr 0x%08x\n", + ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]); +} + +static void ssp_print_blob30(struct intel_ssp_params *ssp, int i) +{ + struct ssp_intel_config_data_3_0 *blob30; + int ssp_index = ssp->ssp_count; + uint32_t j; + + blob30 = &ssp->ssp_blob_3_0[ssp_index][i]; + fprintf(stdout, "gateway_attributes %u\n", blob30->gateway_attributes); + fprintf(stdout, "version %u\n", blob30->version); + fprintf(stdout, "size %u\n", blob30->size); + for (j = 0; j < SSP_TS_GROUP_SIZE; j++) + fprintf(stdout, "ts_group[%d] 0x%08x\n", j, blob30->ts_group[j]); + + fprintf(stdout, "ssc0 0x%08x\n", blob30->ssc0); + fprintf(stdout, "ssc1 0x%08x\n", blob30->ssc1); + fprintf(stdout, "sscto 0x%08x\n", blob30->sscto); + fprintf(stdout, "sspsp 0x%08x\n", blob30->sspsp); + fprintf(stdout, "ssc2 0x%08x\n", blob30->ssc2); + fprintf(stdout, "sspsp2 0x%08x\n", blob30->sspsp2); + fprintf(stdout, "rsvd2 0x%08x\n", blob30->rsvd2); + fprintf(stdout, "ssioc 0x%08x\n", blob30->ssioc); + for (j = 0; j < I2SIPCMC; j++) { + fprintf(stdout, "rx_dir[%d] 0x%08x\n", j * 2, (uint32_t)(blob30->rx_dir[j].ssmidytsa & 0xffffffff)); + fprintf(stdout, "rx_dir[%d] 0x%08x\n", j * 2 + 1, (uint32_t)(blob30->rx_dir[j].ssmidytsa >> 32)); + } + for (j = 0; j < I2SOPCMC; j++) { + fprintf(stdout, "tx_dir[%d] 0x%08x\n", j * 2, (uint32_t)(blob30->tx_dir[j].ssmodytsa & 0xffffffff)); + fprintf(stdout, "tx_dir[%d] 0x%08x\n", j * 2 + 1, (uint32_t)(blob30->tx_dir[j].ssmodytsa >> 32)); + } + + fprintf(stdout, "mdivc 0x%08x\n", blob30->mdivctlr); + fprintf(stdout, "mdivr count 0x%08x\n", blob30->mdivrcnt); + for (j = 0; j < blob30->mdivrcnt; j++) + fprintf(stdout, "mdivr 0x%08x\n", + ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]); +} + +void ssp_print_calculated(struct intel_ssp_params *ssp) +{ struct ssp_aux_blob *blob_aux; int ssp_index = ssp->ssp_count; uint32_t *ptr; - int i, j; + uint32_t i, j; fprintf(stdout, "printing ssp nhlt calculated data:\n"); @@ -38,58 +128,17 @@ void ssp_print_calculated(struct intel_ssp_params *ssp) for (i = 0; i < ssp->ssp_hw_config_count[ssp_index]; i++) { fprintf(stdout, "ssp blob %d hw_config %d\n", ssp->ssp_count, i); - if (ssp->ssp_prm[ssp_index].version == SSP_BLOB_VER_1_5) { - blob15 = &ssp->ssp_blob_1_5[ssp_index][i]; - fprintf(stdout, "gateway_attributes %u\n", blob15->gateway_attributes); - fprintf(stdout, "version %u\n", blob15->version); - fprintf(stdout, "size %u\n", blob15->size); - fprintf(stdout, "ts_group[0] 0x%08x\n", blob15->ts_group[0]); - fprintf(stdout, "ts_group[1] 0x%08x\n", blob15->ts_group[1]); - fprintf(stdout, "ts_group[2] 0x%08x\n", blob15->ts_group[2]); - fprintf(stdout, "ts_group[3] 0x%08x\n", blob15->ts_group[3]); - fprintf(stdout, "ts_group[4] 0x%08x\n", blob15->ts_group[4]); - fprintf(stdout, "ts_group[5] 0x%08x\n", blob15->ts_group[5]); - fprintf(stdout, "ts_group[6] 0x%08x\n", blob15->ts_group[6]); - fprintf(stdout, "ts_group[7] 0x%08x\n", blob15->ts_group[7]); - fprintf(stdout, "ssc0 0x%08x\n", blob15->ssc0); - fprintf(stdout, "ssc1 0x%08x\n", blob15->ssc1); - fprintf(stdout, "sscto 0x%08x\n", blob15->sscto); - fprintf(stdout, "sspsp 0x%08x\n", blob15->sspsp); - fprintf(stdout, "sstsa 0x%08x\n", blob15->sstsa); - fprintf(stdout, "ssrsa 0x%08x\n", blob15->ssrsa); - fprintf(stdout, "ssc2 0x%08x\n", blob15->ssc2); - fprintf(stdout, "sspsp2 0x%08x\n", blob15->sspsp2); - fprintf(stdout, "ssc3 0x%08x\n", blob15->ssc3); - fprintf(stdout, "ssioc 0x%08x\n", blob15->ssioc); - fprintf(stdout, "mdivc 0x%08x\n", blob15->mdivctlr); - fprintf(stdout, "mdivr count 0x%08x\n", blob15->mdivrcnt); - for (j = 0; j < blob15->mdivrcnt; j++) - fprintf(stdout, "mdivr 0x%08x\n", - ssp->ssp_prm[ssp_index].mdivr[i].mdivrs[j]); - } else { - blob = &ssp->ssp_blob[ssp_index][i]; - fprintf(stdout, "gateway_attributes %u\n", blob->gateway_attributes); - fprintf(stdout, "ts_group[0] 0x%08x\n", blob->ts_group[0]); - fprintf(stdout, "ts_group[1] 0x%08x\n", blob->ts_group[1]); - fprintf(stdout, "ts_group[2] 0x%08x\n", blob->ts_group[2]); - fprintf(stdout, "ts_group[3] 0x%08x\n", blob->ts_group[3]); - fprintf(stdout, "ts_group[4] 0x%08x\n", blob->ts_group[4]); - fprintf(stdout, "ts_group[5] 0x%08x\n", blob->ts_group[5]); - fprintf(stdout, "ts_group[6] 0x%08x\n", blob->ts_group[6]); - fprintf(stdout, "ts_group[7] 0x%08x\n", blob->ts_group[7]); - fprintf(stdout, "ssc0 0x%08x\n", blob->ssc0); - fprintf(stdout, "ssc1 0x%08x\n", blob->ssc1); - fprintf(stdout, "sscto 0x%08x\n", blob->sscto); - fprintf(stdout, "sspsp 0x%08x\n", blob->sspsp); - fprintf(stdout, "sstsa 0x%08x\n", blob->sstsa); - fprintf(stdout, "ssrsa 0x%08x\n", blob->ssrsa); - fprintf(stdout, "ssc2 0x%08x\n", blob->ssc2); - fprintf(stdout, "sspsp2 0x%08x\n", blob->sspsp2); - fprintf(stdout, "ssc3 0x%08x\n", blob->ssc3); - fprintf(stdout, "ssioc 0x%08x\n", blob->ssioc); - fprintf(stdout, "mdivc 0x%08x\n", blob->mdivc); - fprintf(stdout, "mdivr 0x%08x\n", blob->mdivr); + switch (ssp->ssp_prm[ssp_index].version) { + case SSP_BLOB_VER_1_5: + ssp_print_blob15(ssp, i); + break; + case SSP_BLOB_VER_3_0: + ssp_print_blob30(ssp, i); + break; + default: + ssp_print_blob10(ssp, i); } + blob_aux = (struct ssp_aux_blob *)&(ssp->ssp_blob_ext[ssp_index][i]); fprintf(stdout, "aux_blob size %u\n", blob_aux->size); for (j = 0; j < blob_aux->size; j += 4) { @@ -115,7 +164,7 @@ void ssp_print_internal(struct intel_ssp_params *ssp) struct ssp_config_dai *dai; struct ssp_config_hw *hw_conf; uint32_t enabled; - int i, j; + uint32_t i, j; dai = &ssp->ssp_prm[ssp->ssp_count]; diff --git a/topology/nhlt/intel/ssp/ssp-intel.h b/topology/nhlt/intel/ssp/ssp-intel.h index 9c92424..ac141c8 100644 --- a/topology/nhlt/intel/ssp/ssp-intel.h +++ b/topology/nhlt/intel/ssp/ssp-intel.h @@ -12,10 +12,12 @@ #include +#define SSP_TS_GROUP_SIZE 8 + /* struct for intel ssp nhlt vendor specific blob generation */ struct ssp_intel_config_data { uint32_t gateway_attributes; - uint32_t ts_group[8]; + uint32_t ts_group[SSP_TS_GROUP_SIZE]; uint32_t ssc0; uint32_t ssc1; uint32_t sscto; @@ -31,12 +33,13 @@ struct ssp_intel_config_data { } __attribute__((packed)); #define SSP_BLOB_VER_1_5 0xEE000105 +#define SSP_BLOB_VER_3_0 0xEE000300 struct ssp_intel_config_data_1_5 { uint32_t gateway_attributes; uint32_t version; uint32_t size; - uint32_t ts_group[8]; + uint32_t ts_group[SSP_TS_GROUP_SIZE]; uint32_t ssc0; uint32_t ssc1; uint32_t sscto; @@ -52,6 +55,37 @@ struct ssp_intel_config_data_1_5 { uint32_t mdivr[]; } __attribute__((packed)); +#define I2SIPCMC 8 +#define I2SOPCMC 8 + +struct ssp_rx_dir { + uint64_t ssmidytsa; +} __attribute__((packed)); + +struct ssp_tx_dir { + uint64_t ssmodytsa; +} __attribute__((packed)); + +struct ssp_intel_config_data_3_0 { + uint32_t gateway_attributes; + uint32_t version; + uint32_t size; + uint32_t ts_group[SSP_TS_GROUP_SIZE]; + uint32_t ssc0; + uint32_t ssc1; + uint32_t sscto; + uint32_t sspsp; + uint32_t ssc2; + uint32_t sspsp2; + uint32_t rsvd2; + uint32_t ssioc; + struct ssp_rx_dir rx_dir[I2SIPCMC]; + struct ssp_tx_dir tx_dir[I2SOPCMC]; + uint32_t mdivctlr; + uint32_t mdivrcnt; + uint32_t mdivr[]; +} __attribute__((packed)); + struct ssp_intel_aux_tlv { uint32_t type; uint32_t size; diff --git a/topology/nhlt/intel/ssp/ssp-internal.h b/topology/nhlt/intel/ssp/ssp-internal.h index 23a8489..82815bc 100644 --- a/topology/nhlt/intel/ssp/ssp-internal.h +++ b/topology/nhlt/intel/ssp/ssp-internal.h @@ -147,6 +147,7 @@ struct intel_ssp_params { /* ssp vendor blob structs */ struct ssp_intel_config_data ssp_blob[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG]; struct ssp_intel_config_data_1_5 ssp_blob_1_5[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG]; + struct ssp_intel_config_data_3_0 ssp_blob_3_0[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG]; struct ssp_aux_blob ssp_blob_ext[SSP_MAX_DAIS][SSP_MAX_HW_CONFIG]; }; diff --git a/topology/nhlt/intel/ssp/ssp-process.c b/topology/nhlt/intel/ssp/ssp-process.c index 6a0e853..bffbc5a 100644 --- a/topology/nhlt/intel/ssp/ssp-process.c +++ b/topology/nhlt/intel/ssp/ssp-process.c @@ -14,11 +14,7 @@ #include #include #include -#include -#include -#include -#include -#include +#include #include "../intel-nhlt.h" #include "../../nhlt.h" #include "ssp-process.h" @@ -38,10 +34,51 @@ static int popcount(uint32_t value) return bits_set; } +static void ssp_calculate_intern_v30(struct intel_nhlt_params *nhlt, int hwi) +{ + struct intel_ssp_params *ssp = (struct intel_ssp_params *)nhlt->ssp_params; + int di = ssp->ssp_count; + struct ssp_intel_config_data_3_0 *blob30 = &ssp->ssp_blob_3_0[di][hwi]; + struct ssp_intel_config_data *blob = &ssp->ssp_blob[di][hwi]; + int i; + + blob30->gateway_attributes = blob->gateway_attributes; + blob30->version = SSP_BLOB_VER_3_0; + for (i = 0; i < SSP_TS_GROUP_SIZE; i++) + blob30->ts_group[i] = blob->ts_group[i]; + + blob30->ssc0 = blob->ssc0; + blob30->ssc1 = blob->ssc1; + blob30->sscto = blob->sscto; + blob30->sspsp = blob->sspsp; + blob30->ssc2 = blob->ssc2; + blob30->sspsp2 = blob->sspsp2; + blob30->rsvd2 = 0; + blob30->ssioc = blob->ssioc; + + blob30->rx_dir[0].ssmidytsa = ssp->ssp_prm[di].hw_cfg[hwi].rx_slots; + for (i = 1; i < I2SIPCMC; i++) + blob30->rx_dir[i].ssmidytsa = 0; + + blob30->tx_dir[0].ssmodytsa = ssp->ssp_prm[di].hw_cfg[hwi].tx_slots; + for (i = 1; i < I2SOPCMC; i++) + blob30->tx_dir[i].ssmodytsa = 0; + + /* mdivr count is always 1 */ + blob30->mdivctlr = blob->mdivc; + ssp->ssp_prm[di].mdivr[hwi].count = 1; + blob30->mdivrcnt = ssp->ssp_prm[di].mdivr[hwi].count; + ssp->ssp_prm[di].mdivr[hwi].mdivrs[0] = blob->mdivr; + + blob30->size = sizeof(struct ssp_intel_config_data_3_0) + + blob30->mdivrcnt * sizeof(uint32_t) + + ssp->ssp_blob_ext[di][hwi].size; +} + static void ssp_calculate_intern_v15(struct intel_nhlt_params *nhlt, int hwi) { struct intel_ssp_params *ssp = (struct intel_ssp_params *)nhlt->ssp_params; - int di = ssp->ssp_count;; + int di = ssp->ssp_count; struct ssp_intel_config_data_1_5 *blob15 = &ssp->ssp_blob_1_5[di][hwi]; struct ssp_intel_config_data *blob = &ssp->ssp_blob[di][hwi]; int i; @@ -49,7 +86,7 @@ static void ssp_calculate_intern_v15(struct intel_nhlt_params *nhlt, int hwi) blob15->gateway_attributes = ssp->ssp_blob[di][hwi].gateway_attributes; blob15->version = SSP_BLOB_VER_1_5; - for (i = 0; i < 8; i++) + for (i = 0; i < SSP_TS_GROUP_SIZE; i++) blob15->ts_group[i] = blob->ts_group[i]; blob15->ssc0 = blob->ssc0; @@ -115,11 +152,17 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi) /* reset SSP settings */ /* sscr0 dynamic settings are DSS, EDSS, SCR, FRDC, ECS */ - ssp->ssp_blob[di][hwi].ssc0 = SSCR0_PSP | SSCR0_RIM | SSCR0_TIM; + ssp->ssp_blob[di][hwi].ssc0 = SSCR0_MOD | SSCR0_PSP | SSCR0_RIM | SSCR0_TIM; /* sscr1 dynamic settings are SFRMDIR, SCLKDIR, SCFR */ - ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL | SSCR1_RSRE | - SSCR1_TSRE; + if (ssp->ssp_prm[di].version == SSP_BLOB_VER_3_0) + /* bits 21 and 20, TSRE and RSRE do not exist in ACE3.x + * Note: Assuming SSP_BLOB_VER_3_0 is ACE3.x + */ + ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL; + else + ssp->ssp_blob[di][hwi].ssc1 = SSCR1_TTE | SSCR1_TTELP | SSCR1_TRAIL | + SSCR1_RSRE | SSCR1_TSRE; /* sscr2 dynamic setting is LJDFD */ ssp->ssp_blob[di][hwi].ssc2 = SSCR2_SDFD | SSCR2_TURM1; @@ -197,7 +240,13 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi) ssp->ssp_blob[di][hwi].sspsp |= SSPSP_SCMODE(inverted_bclk); } - ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_MOD | SSCR0_ACS; + /* Note: ACS as SSCR0(30) does not exist in any ACE version, or cAVS2.x. This disables + * it for ACE3.x. It might be good to fix later for other platforms. In cAVS this is 30:29 + * reserved, in ACE1.x this is DLE as 30:29, in ACE2.x this is RSVD30 as 30:29, in ACE3.x this + * is DLE as 30:29. + */ + if (ssp->ssp_prm[di].version != SSP_BLOB_VER_3_0) + ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_ACS; /* Additional hardware settings */ @@ -538,13 +587,23 @@ static int ssp_calculate_intern(struct intel_nhlt_params *nhlt, int hwi) ssp->ssp_blob[di][hwi].mdivr = clk_div; /* clock will always go through the divider */ + + /* Note: There is no SSC0(6) ECS in ACE3.x but RSVD6 in same bit position + * that must be set to one. + */ ssp->ssp_blob[di][hwi].ssc0 |= SSCR0_ECS; + /* enable divider for this clock id */ ssp->ssp_blob[di][hwi].mdivc |= BIT(ssp->ssp_prm[di].mclk_id); /* set mclk source always for audio cardinal clock */ ssp->ssp_blob[di][hwi].mdivc |= MCDSS(SSP_CLOCK_AUDIO_CARDINAL); - /* set bclk source for audio cardinal clock */ - ssp->ssp_blob[di][hwi].mdivc |= MNDSS(SSP_CLOCK_AUDIO_CARDINAL); + /* set bclk source for audio cardinal clock + * Note: There is no MDIVXCTRL(21:20) MNDSS in any ACE version 1.x - 3.x. MNDSS + * exists in cAVS2.x. This removes the set for ACE3.x. May need to address other + * ACE platforms later. + */ + if (ssp->ssp_prm[di].version != SSP_BLOB_VER_3_0) + ssp->ssp_blob[di][hwi].mdivc |= MNDSS(SSP_CLOCK_AUDIO_CARDINAL); return 0; } @@ -748,6 +807,9 @@ int ssp_calculate(struct intel_nhlt_params *nhlt) return -EINVAL; /* v15 blob is made from legacy blob, so it can't fail */ ssp_calculate_intern_v15(nhlt, i); + + /* v30 blob is made from legacy blob, so it can't fail */ + ssp_calculate_intern_v30(nhlt, i); } ssp_print_internal(ssp); @@ -826,6 +888,8 @@ int ssp_get_vendor_blob_size(struct intel_nhlt_params *nhlt, int dai_index, /* set size for the blob */ if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_1_5) *size = ssp->ssp_blob_1_5[dai_index][hw_config_index].size; + else if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_3_0) + *size = ssp->ssp_blob_3_0[dai_index][hw_config_index].size; else /* legacy */ *size = sizeof(struct ssp_intel_config_data) + @@ -867,8 +931,19 @@ int ssp_get_vendor_blob(struct intel_nhlt_params *nhlt, uint8_t *vendor_blob, memcpy(vendor_blob + basic_len + clock_len, ssp->ssp_blob_ext[dai_index][hw_config_index].aux_blob, ssp->ssp_blob_ext[dai_index][hw_config_index].size); - } - else { + } else if (ssp->ssp_prm[dai_index].version == SSP_BLOB_VER_3_0) { + basic_len = sizeof(struct ssp_intel_config_data_3_0); + clock_len = sizeof(uint32_t) * ssp->ssp_prm[dai_index].mdivr[hw_config_index].count; + /* basic data */ + memcpy(vendor_blob, &ssp->ssp_blob_3_0[dai_index][hw_config_index], basic_len); + /* clock data */ + memcpy(vendor_blob + basic_len, + &ssp->ssp_prm[dai_index].mdivr[hw_config_index].mdivrs[0], clock_len); + /* ext data */ + memcpy(vendor_blob + basic_len + clock_len, + ssp->ssp_blob_ext[dai_index][hw_config_index].aux_blob, + ssp->ssp_blob_ext[dai_index][hw_config_index].size); + } else { basic_len = sizeof(struct ssp_intel_config_data); /*basic data */ memcpy(vendor_blob, &ssp->ssp_blob[dai_index][hw_config_index], basic_len); @@ -914,6 +989,9 @@ int ssp_set_params(struct intel_nhlt_params *nhlt, const char *dir, int dai_inde /* let's compare the lower 16 bits as we don't send the signature from topology */ if (version == (SSP_BLOB_VER_1_5 & ((1 << 16) - 1))) ssp->ssp_prm[ssp->ssp_count].version = SSP_BLOB_VER_1_5; + else if (version == (SSP_BLOB_VER_3_0 & ((1 << 16) - 1))) + ssp->ssp_prm[ssp->ssp_count].version = SSP_BLOB_VER_3_0; + if (tdm_padding_per_slot && !strcmp(tdm_padding_per_slot, "true")) ssp->ssp_prm[ssp->ssp_count].tdm_per_slot_padding_flag = 1; else diff --git a/topology/nhlt/nhlt-processor.c b/topology/nhlt/nhlt-processor.c index ca539c3..8197201 100644 --- a/topology/nhlt/nhlt-processor.c +++ b/topology/nhlt/nhlt-processor.c @@ -11,11 +11,7 @@ #include #include #include -#include -#include -#include -#include -#include +#include #include "pre-process-external.h" #include "nhlt.h" #include "intel/intel-nhlt.h" diff --git a/topology/pre-processor.c b/topology/pre-processor.c index 01f8a5d..95e2a89 100644 --- a/topology/pre-processor.c +++ b/topology/pre-processor.c @@ -697,13 +697,11 @@ static int pre_process_create_items(struct tplg_pre_processor *tplg_pp, snd_config_iterator_t i, next; snd_config_type_t type; const char *class_id; - char *class_id_local; int attr_count = 0; int object_count = *object_count_offset; int ret; snd_config_get_id(top, &class_id); - class_id_local = strdup(class_id); snd_config_for_each(i, next, cfg) { snd_config_iterator_t i2, next2; @@ -719,7 +717,7 @@ static int pre_process_create_items(struct tplg_pre_processor *tplg_pp, if (snd_config_get_id(n, &attribute) < 0) continue; - ret = snd_config_make(&local_top, class_id_local, SND_CONFIG_TYPE_COMPOUND); + ret = snd_config_make(&local_top, class_id, SND_CONFIG_TYPE_COMPOUND); snd_config_for_each(i2, next2, n) { snd_config_t *n2, *new, *new_obj; @@ -787,7 +785,7 @@ static int pre_process_create_items(struct tplg_pre_processor *tplg_pp, ret = pre_process_add_objects(tplg_pp, &object_count, top, local_top, new); if (ret < 0) { - SNDERR("failed to add objects of type %s\n", class_id_local); + SNDERR("failed to add objects of type %s\n", class_id); goto err; } @@ -921,6 +919,172 @@ static int pre_process_arrays(struct tplg_pre_processor *tplg_pp, snd_config_t * return 0; } +static int pre_process_subtree_copy(struct tplg_pre_processor *tplg_pp, snd_config_t *curr, + snd_config_t *top) +{ + snd_config_iterator_t i, next; + snd_config_t *subtrees; + int ret; + + ret = snd_config_search(curr, "SubTreeCopy", &subtrees); + if (ret < 0) + return 0; + + snd_config_for_each(i, next, subtrees) { + snd_config_t *n, *source_cfg, *target_cfg, *type_cfg; + snd_config_t *source_tree, *target_tree, *tmp, *subtree_cfg; + const char *id, *source_id; + const char *type = NULL; + const char *target_id = NULL; + bool override = false; + + n = snd_config_iterator_entry(i); + ret = snd_config_get_id(n, &id); + if (ret < 0) { + SNDERR("Failed to get ID for subtree copy\n"); + return ret; + } + + /* get the type of copy ex: override/extend if set, by default override is false */ + ret = snd_config_search(n, "type", &type_cfg); + if (ret >= 0) { + ret = snd_config_get_string(type_cfg, &type); + if (ret >= 0) { + if (strcmp(type, "override") && strcmp(type, "extend")) { + SNDERR("Invalid value for sub tree copy type %s\n", type); + return ret; + } + + if (!strcmp(type, "override")) + override = true; + } + } + + ret = snd_config_search(n, "source", &source_cfg); + if (ret < 0) { + SNDERR("failed to get source config for subtree %s\n", id); + return ret; + } + + /* if the target node is not set, the subtree will be copied to current node */ + ret = snd_config_search(n, "target", &target_cfg); + if (ret >= 0) { + snd_config_t *temp_target; + char *s; + + ret = snd_config_get_string(target_cfg, &target_id); + if (ret < 0) { + SNDERR("Invalid target id for subtree %s\n", id); + return ret; + } + + /* + * create a temporary node with target_id and merge with top to avoid + * failure in case the target node ID doesn't exist already + */ + s = tplg_snprintf("%s {}", target_id); + if (!s) + return -ENOMEM; + + ret = snd_config_load_string(&temp_target, s, 0); + free(s); + if (ret < 0) { + SNDERR("Cannot create temp node with target id %s\n", target_id); + return ret; + } + + ret = snd_config_merge(top, temp_target, false); + if (ret < 0) { + SNDERR("Cannot merge temp node with target id %s\n", target_id); + return ret; + } + + ret = snd_config_search(top, target_id, &target_tree); + if (ret < 0) { + SNDERR("failed to get target tree %s\n", target_id); + return ret; + } + } else { + target_tree = curr; + } + + /* get the source tree node */ + ret = snd_config_get_string(source_cfg, &source_id); + if (ret < 0) { + SNDERR("Invalid source node id for subtree %s\n", id); + return ret; + } + + ret = snd_config_search(top, source_id, &source_tree); + if (ret < 0) { + SNDERR("failed to get source tree %s\n", source_id); + return ret; + } + + /* get the subtree to be merged */ + ret = snd_config_search(n, "tree", &subtree_cfg); + if (ret < 0) + subtree_cfg = NULL; + + /* make a temp copy of the source tree */ + ret = snd_config_copy(&tmp, source_tree); + if (ret < 0) { + SNDERR("failed to copy source tree for subtreecopy %s\n", id); + return ret; + } + + /* merge the current block with the source tree */ + ret = snd_config_merge(tmp, subtree_cfg, override); + if (ret < 0) { + snd_config_delete(tmp); + SNDERR("Failed to merge source tree w/ subtree %s\n", id); + return ret; + } + + /* merge the merged block to the target tree */ + ret = snd_config_merge(target_tree, tmp, override); + if (ret < 0) { + snd_config_delete(tmp); + SNDERR("Failed to merge subtree %s w/ target\n", id); + return ret; + } + } + + /* all subtree copies have been processed, remove the node */ + snd_config_delete(subtrees); + + return 0; +} + +static int pre_process_subtree_copies(struct tplg_pre_processor *tplg_pp, snd_config_t *top, + snd_config_t *curr) +{ + snd_config_iterator_t i, next; + int ret; + + if (snd_config_get_type(curr) != SND_CONFIG_TYPE_COMPOUND) + return 0; + + /* process subtreecopies at this node */ + ret = pre_process_subtree_copy(tplg_pp, curr, top); + if (ret < 0) + return ret; + + /* process subtreecopies at all child nodes */ + snd_config_for_each(i, next, curr) { + snd_config_t *n; + + n = snd_config_iterator_entry(i); + + /* process subtreecopies at this node */ + ret = pre_process_subtree_copies(tplg_pp, top, n); + if (ret < 0) + return ret; + } + + return 0; +} + #endif /* version < 1.2.6 */ int pre_process(struct tplg_pre_processor *tplg_pp, char *config, size_t config_size, @@ -980,6 +1144,12 @@ int pre_process(struct tplg_pre_processor *tplg_pp, char *config, size_t config_ fprintf(stderr, "Failed to process object arrays in input config\n"); goto err; } + + err = pre_process_subtree_copies(tplg_pp, tplg_pp->input_cfg, tplg_pp->input_cfg); + if (err < 0) { + SNDERR("Failed to process subtree copies in input config\n"); + goto err; + } #endif err = pre_process_config(tplg_pp, tplg_pp->input_cfg); diff --git a/topology/topology.c b/topology/topology.c index 9752f88..312499f 100644 --- a/topology/topology.c +++ b/topology/topology.c @@ -398,9 +398,12 @@ static int add_define(char **defs, char *d) size_t len = (*defs ? strlen(*defs) : 0) + strlen(d) + 2; char *m = realloc(*defs, len); if (m) { - if (*defs) + if (*defs) { strcat(m, ","); - strcat(m, d); + strcat(m, d); + } else { + strcpy(m, d); + } *defs = m; return 0; }